機械学習を、 PyData.Tokyoのチュートリアル#1 を元に勉強したり、教えていると、トレーニングデータの分割から、学習・予測・検証の部分がわかりにくいと感じています。
この部分の解説をします。
前提条件
- 教師あり学習を行う -> つまりラベル付きデータがある
- データセットはある程度の数がある -> このチュートリアルでは、890件
- テストデータを 20% 残して学習し検証する
- 特徴行列は多次元(当たり前のことだが・・)
- sklearn(scikit-learn)を使う
- ロジスティック回帰で推定を行う
- 詳細のコードは、PyData.Tokyoのチュートリアル#1 の
pydatatokyo_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 : 評価用データで予測を行った結果 未知のデータで予測を行ったことになる