導入
モデルの本当の実力は、「学習に使っていない未知のデータ」でどれだけ当たるかで測ります。そのためにデータを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_size を 0.5(半分ずつ)に変えると、訓練件数が減って結果がどう変わるか見てみましょう。random_state の数字を変えると、分け方が変わってスコアも少し動きます。
演習
train_test_split で test_size=0.3 に分けたとき、テストデータの件数を X_test.shape[0] で表示してください。
ヒント1を見る
test_size=0.3 で分けて print(X_test.shape[0])。