機械学習 トレーニングデータの分割と学習・予測・検証


機械学習を、 PyData.Tokyoのチュートリアル#1 を元に勉強したり、教えていると、トレーニングデータの分割から、学習・予測・検証の部分がわかりにくいと感じています。
この部分の解説をします。

前提条件

  • 教師あり学習を行う -> つまりラベル付きデータがある
  • データセットはある程度の数がある -> このチュートリアルでは、890件
  • テストデータを 20% 残して学習し検証する
  • 特徴行列は多次元(当たり前のことだが・・)
  • sklearn(scikit-learn)を使う
  • ロジスティック回帰で推定を行う
  • 詳細のコードは、PyData.Tokyoのチュートリアル#1pydatatokyo_tutorial_ml.ipynb を参照のこと

トレーニングデータの分割

特徴行列を X
クラスラベルデータを y
としたときに、以下のように行うと、データ分割が可能

from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, train_size=0.8, random_state=1)

  • X_train : 学習用特徴行列 (80%)
  • X_val : 評価用特徴行列 (20%)
  • y_train : 学習用クラスラベル (80%) 未知のデータ
  • y_val : 評価用クラスラベル (20%) 未知のデータの答え合わせに使う (隠し持っておく)

学習・予測・検証

分類器(学習器)の初期化

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()

clf を初期化して、以下の学習・予測・検証に使っていきます。

学習

clf.fit(X_train, y_train)

初期化されたclfのfitメソッドを使って、学習させる
データは80%の学習用データに特徴行列とクラスラベルを与える

予測

y_train_pred = clf.predict(X_train)
y_val_pred = clf.predict(X_val)

clfのpredictメソッドで予測をします。

  • y_train_pred : 学習用データで改めて予測を行った結果
  • y_val_pred : 評価用データで予測を行った結果

ここまで、 y_val を使っていない。つまり、 y_train が未知データとして扱われている

評価・検証

from sklearn.metrics import accuracy_score
train_score = accuracy_score(y_train, y_train_pred)
val_score = accuracy_score(y_val, y_val_pred)

accuracy_score には、 クラスラベルデータ上記の予測結果 を与え、正答率を出力

  • train_score : 学習用データで予測を行った結果
  • val_score : 評価用データで予測を行った結果 未知のデータで予測を行ったことになる