学習/検証/テスト分割と汎化
データ分割の役割、汎化・過学習・未学習、バイアスとバリアンスのトレードオフを理解します。
なぜデータを分けるのか#
機械学習の目的は、訓練データを丸暗記することではなく、 未知のデータでも当てられること=汎化です。 そのため、学習に使わないデータで性能を測る必要があります。
| 分割 | 役割 |
|---|---|
| 訓練(train) | モデルのパラメータを学習する |
| 検証(validation) | ハイパラ選択・モデル比較に使う |
| テスト(test) | 最終的な性能の見積もり(一度だけ) |
Kaggle ではテストデータの正解は非公開で、提出して初めて採点されます。 だからこそ、手元で信頼できる検証を組むことが重要です。
from sklearn.model_selection import train_test_split
X = df.drop(columns=["Survived"])
y = df["Survived"]
# 層化抽出でクラス比率を保ったまま分割
X_train, X_valid, y_train, y_valid = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)注意
検証データは「未知データの代役」です。前処理の統計量(平均や標準偏差など)は 訓練データだけから計算して検証に適用します。全体から計算するとデータリークになります。
過学習と未学習#
訓練スコアと検証スコアの差を見ると、どちらに寄っているか判断できます。
バイアスとバリアンス#
バイアス・バリアンスは、誤差を 2 種類に分けて考える枠組みです。
- バイアス:単純すぎることによる系統的なズレ(→ 未学習)
- バリアンス:データの揺らぎに過敏なこと(→ 過学習)
両者はトレードオフの関係にあり、ちょうど良い複雑さを探すのがモデリングの肝です。
理解度チェック#
次のステップ#
次は、1 回の分割に頼らず性能を安定して測る**交差検証(K-Fold)**を学びます。