ステップ9:提出する前に、自分で採点する
🎯 このステップでやること提出しなくても精度がわかる方法(交差検証)を使う。所要時間:約7分。Kaggleで最も重要な技術です。
なぜ必要なのか
提出には 1日の回数制限 があります。しかし、工夫のアイデアは1日に何十個も思いつきます。
「年齢を使うのをやめたらどうなる?」
「木の深さを8にしたら?」
「家族の人数を足したら?」
これを全部提出して試すことは できません。だから、手元で自分で採点する仕組みが必要になります。それが 交差検証(Cross Validation、略してCV) です。
9-1. いちばん簡単な採点(やってはいけない例)
まず、間違ったやり方を見てください。
📋 コード
from sklearn.metrics import accuracy_score
pred_train = model.predict(X)
print("学習データでの正解率:", accuracy_score(y, pred_train))
✅ こう出れば成功
学習データでの正解率: 0.86 前後
0.86! さっきの提出(0.766)より高い!……これは 嘘の点数 です。
⚠️ なぜ嘘なのかこれは「学習に使ったデータ」で採点しています。試験範囲の問題がそのまま試験に出たようなものです。高くて当たり前です。
本当に知りたいのは「見たことのないデータでどれだけ当たるか」です。
9-2. 正しい採点:交差検証
📋 コード
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5, scoring="accuracy")
print("各回のスコア:", scores.round(4))
print("平均スコア :", scores.mean().round(4))
✅ こう出れば成功
各回のスコア: [0.8156 0.8258 0.8371 0.7978 0.8427]
平均スコア : 0.8238
数値は環境によって多少変わります。0.80〜0.84あたりなら正常です。
この 平均スコア(0.82前後) が、あなたのモデルの実力です。この数字を CVスコア と呼びます。
9-3. 交差検証は何をしているのか
891人のデータを5つに分けて、採点役を順番に交代させています。
1回目: [採点][学習][学習][学習][学習] → 0.8156
2回目: [学習][採点][学習][学習][学習] → 0.8258
3回目: [学習][学習][採点][学習][学習] → 0.8371
4回目: [学習][学習][学習][採点][学習] → 0.7978
5回目: [学習][学習][学習][学習][採点] → 0.8427
平均 → 0.8238
毎回、採点に使うデータは学習に使っていません。だから正直な点数が出ます。5回やって平均するので、「たまたま簡単な問題だった」という偏りも消えます。
9-4. これで実験し放題になる
CVがあれば、提出せずに改善の良し悪しを判定できます。試してみましょう。
📋 コード(木の深さを変えて比べる)
for depth in [3, 5, 6, 8, 12, None]:
m = RandomForestClassifier(n_estimators=300, max_depth=depth, random_state=0)
s = cross_val_score(m, X, y, cv=5, scoring="accuracy").mean()
print(f"max_depth={str(depth):>4} → CV {s:.4f}")
✅ こう出れば成功
max_depth= 3 → CV 0.81xx
max_depth= 5 → CV 0.82xx
max_depth= 6 → CV 0.82xx
max_depth= 8 → CV 0.82xx
max_depth= 12 → CV 0.81xx
max_depth=None → CV 0.80xx
💡 深くすればするほど良い、というわけではないのが見えましたか?深い木は学習データを丸暗記してしまい、未知のデータに弱くなります。これが 過学習 です。
いちばんCVが高かった深さを採用してください。これがチューニングという作業です。
⚠️ このセルは20〜40秒ほどかかります。[*] のまま止まって見えても、待ってください。
9-5. いちばん良かった設定で作り直す
上の結果でいちばんCVが高かった max_depth を入れて、もう一度学習と予測をします。(ここでは例として 6 にしています。自分の結果に合わせて変えてください)
📋 コード
model = RandomForestClassifier(n_estimators=300, max_depth=6, random_state=0)
model.fit(X, y)
pred = model.predict(X_test)
submission = pd.DataFrame({
"PassengerId": test["PassengerId"],
"Survived": pred
})
submission.to_csv("submission.csv", index=False)
print("CV:", cross_val_score(model, X, y, cv=5).mean().round(4))
print(submission.shape)
✅ こう出れば成功 CVが表示され、形が (418, 2) になっていればOKです。
💡 何をしたのか(読み飛ばし可)
| コード | 意味 |
|---|---|
cross_val_score(model, X, y, cv=5) | 5分割の交差検証をして、5つのスコアを返す |
.mean() | その平均を取る(=CVスコア) |
scoring="accuracy" | 採点方法を正解率にする(コンペの評価指標に合わせる) |
Kaggleの格言:「Trust your CV」
あとで何度も出てくる言葉です。意味はこうです。
提出して出るスコア(Public LB)より、自分のCVを信じろ。
提出して出るスコアは、テストデータの一部だけで計算された不安定な数字です。一方CVは、学習データ全体を使って5回測った平均です。どちらが信頼できるかは明らかです。
| 状況 | 判断 |
|---|---|
| CVもLBも上がった | 自信を持って採用 |
| CVは上がったがLBは下がった | 基本はCVを信じて採用 |
| CVは下がったがLBは上がった | たまたまです。採用しない |
CVスコアと提出スコアの差について
いまのCVは0.82前後ですが、提出すると0.77前後になるはずです。この差は正常です。 Titanicのテストデータは、学習データとは別の418人なので、少し難しいのです。大事なのは絶対値ではなく、「前より上がったか」 という比較です。
✅ ここまでできたら
次のステップで、2回目の提出をします。