本文へスキップ
BecomeCoder

Python AIコース · 第4章 モデルを正しく評価する · レッスン12

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

ブラウザで完結

導入

モデルの本当の実力は、「学習に使っていない未知のデータ」でどれだけ当たるかで測ります。そのためにデータを2つに分けます。

説明

train_test_split は、データを訓練用テストに自動で分けてくれます。学習は訓練データだけで行い、採点はテストデータで行います。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

iris = load_iris()
X, y = iris.data, iris.target

# 8割を訓練、2割をテストに分ける
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=0
)
print("訓練:", X_train.shape[0], "件 / テスト:", X_test.shape[0], "件")

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)               # 訓練データだけで学習

print("訓練データでの正解率:", round(model.score(X_train, y_train), 3))
print("テストデータでの正解率:", round(model.score(X_test, y_test), 3))

test_size=0.2 で「2割をテストに」と指定します。random_state=0 は分け方を固定して、毎回同じ結果にするためのものです。テストデータでの正解率こそが、モデルの信頼できる成績です。実務では必ずこの形で評価します。

やってみよう

test_size0.5(半分ずつ)に変えると、訓練件数が減って結果がどう変わるか見てみましょう。random_state の数字を変えると、分け方が変わってスコアも少し動きます。

演習

train_test_splittest_size=0.3 に分けたとき、テストデータの件数X_test.shape[0] で表示してください。

ヒント1を見る

test_size=0.3 で分けて print(X_test.shape[0])

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、scikit-learn で本物の機械学習モデルをその場で訓練できます。scikit-learn を使う回は初回の読み込みに時間がかかります(数十秒かかることがあります)。本文の例をそのまま試したり、数値を書き換えたりして、結果の変化を確かめましょう(グラフ内の文字は英字で書きます)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。