Python環境を起動中... 初回のみ数秒かかります
Lesson 3 / 12

訓練データとテストデータ

このレッスンで学ぶこと

  • なぜデータを「訓練用」と「テスト用」に分けるのか説明できる
  • 過学習(覚えすぎ)と汎化(応用力)の意味が分かる
  • train_test_split でデータを分けられる
  • random_state で結果を毎回そろえられる理由が分かる

1. なぜデータを分けるのか?

前回、機械学習は「学習(fit)→ 推論(predict)」の2ステップだと学びました。 ここで大事な疑問が出てきます。「作ったモデルが、どれくらい賢いのかをどう確かめるの?」

学生のテストで考えてみましょう。試験前に「過去問の答えを丸暗記」した学生は、 まったく同じ問題が出れば満点を取れます。でも、それで「実力がある」と言えるでしょうか? 少し問題が変われば、解けないかもしれません。本当の実力は、「初めて見る問題」を解かせて初めて分かります。

機械学習も同じです。学習に使ったデータでテストすると、モデルの本当の実力は分かりません (答えを覚えているだけかもしれない)。そこで——

📌 データを2つに分ける:

  • 訓練データ(training data)…モデルを学習させるために使う(問題集)
  • テストデータ(test data)…学習には使わず取っておき、実力を測るために使う(初見の本番テスト)

テストデータは、モデルにとって「初めて見るデータ」。だからこそ本当の力が測れます。

全データを訓練用とテスト用に分ける図
全データを訓練(学習に使う)とテスト(実力チェックに使う)に分ける。よくある割合は7:3や8:2

2. 過学習(かがくしゅう)と汎化(はんか)

ここで、機械学習でとても大切な2つの言葉を覚えましょう。先ほどの「丸暗記」と「実力」の話そのものです。

用語意味たとえ
過学習(overfitting)訓練データを覚えすぎて、新しいデータに弱くなること過去問の丸暗記
汎化(generalization)新しいデータにも通用する力。機械学習が目指すゴール応用が利く実力

💡 ここがいちばん大事: 機械学習の目標は「訓練データで高得点」ではなく、「初めて見るデータでも良い予測ができる(=汎化)」ことです。 訓練データの点数だけが高くてテストデータの点数が低いとき、その状態を過学習と呼びます。 だからテストデータで評価することが欠かせないのです。 (過学習を防ぐ具体的な方法は レッスン11 で扱います)

3. train_test_split で分ける

scikit-learn には、データを訓練用とテスト用にランダムに分けてくれる便利な関数 train_test_split があります。これ1行で4つのかたまりに分かれます。

sample_1.py
Ctrl+Enter
出力

💡 2つの引数の意味:

  • test_size=0.3 … 全体の30%をテスト用に(残り70%が訓練用)。569人なら テスト171人・訓練398人
  • random_state=42 … 分け方の「乱数のタネ」。同じ数字にすると毎回まったく同じ分け方になり、結果を再現できる(数字の42に深い意味はなく、慣習的によく使われます)

⚠ なぜ random_state を固定するの?: 指定しないと、実行のたびにランダムに分け方が変わり、結果(点数)が毎回ブレて比較できません。 random_state を固定すると、誰がいつ実行しても同じ結果になり、学習・比較・検証がしやすくなります。 このコースでは一貫して random_state=42 を使います。

4. 練習問題

問題 1

糖尿病データを分割しよう

load_diabetes を読み込み、テストを20%(test_size=0.2、random_state=42)で分割し、 訓練データとテストデータの人数を表示してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split

X, y = load_diabetes(return_X_y=True)

# test_size=0.2, random_state=42 で分割し、訓練・テストの人数を表示してください
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)
print("訓練:", X_train.shape[0], "人")   # 353
print("テスト:", X_test.shape[0], "人")  # 89

442人を 8:2 に分けると、訓練353人・テスト89人になります。test_size を変えるだけで割合を調整できます。

問題 2

テストの割合を変えてみよう

乳がんデータを test_size=0.25(25%をテスト)で分割し、訓練・テストの人数を表示してください。 さきほどの30%のときと数が変わることを確かめましょう。

exercise_2.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

X, y = load_breast_cancer(return_X_y=True)

# test_size=0.25, random_state=42 で分割し、訓練・テストの人数を表示してください
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42)
print("訓練:", X_train.shape[0], "人")   # 426
print("テスト:", X_test.shape[0], "人")  # 143

25%をテストにすると、訓練426人・テスト143人。テストを増やすほど評価は安定しますが、学習に使えるデータは減ります。一般には7:3 や 8:2 がよく使われます。

問題 3

random_state を固定すると再現できる

同じ random_state=422回分割し、同じ分け方になることを確かめてください。 (下のコードを実行するだけでOK。出力が True になれば再現できている証拠です)

exercise_3.py
出力
ヒントを見る(解説)

出力は 同じ分け方になった?: True になります。 random_state を同じ数字に固定すると、ランダムなはずの分割が毎回まったく同じになります。 試しに片方を random_state=1 に変えると False になり、分け方が変わるのが分かります。 再現性が大切な機械学習では、この「タネの固定」が基本です。

5. まとめ

このレッスンのポイント

  • 学習に使ったデータでテストすると本当の実力は測れない → データを分ける
  • 訓練データ=学習用/テストデータ=実力を測る初見データ
  • 過学習=覚えすぎて新データに弱い/汎化=新データにも通用する力(ゴール)
  • train_test_split(X, y, test_size=0.3, random_state=42) で4つに分割
  • random_state を固定すると、毎回同じ分け方になり結果を再現できる

自由に試してみましょう:

free_practice.py
出力

完了するとコース一覧に進捗が記録されます