ステップ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回目の提出をします。