Kaggle Tutorial

学習/検証/テスト分割と汎化

データ分割の役割、汎化・過学習・未学習、バイアスとバリアンスのトレードオフを理解します。

なぜデータを分けるのか#

機械学習の目的は、訓練データを丸暗記することではなく、 未知のデータでも当てられること汎化です。 そのため、学習に使わないデータで性能を測る必要があります。

分割役割
訓練(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 種類に分けて考える枠組みです。

  • バイアス:単純すぎることによる系統的なズレ(→ 未学習)
  • バリアンス:データの揺らぎに過敏なこと(→ 過学習)

両者はトレードオフの関係にあり、ちょうど良い複雑さを探すのがモデリングの肝です。

理解度チェック#

Quiz訓練スコアは非常に高いのに検証スコアが低いとき、起きている可能性が高いのは?

次のステップ#

次は、1 回の分割に頼らず性能を安定して測る**交差検証(K-Fold)**を学びます。