トレーニングデータセットをバリデーション用に細分化してそれぞれでaccuracyのバラツキを見るクロスバリデーション(CV: cross-validation)の方法を応用して、トレーニングデータセットを細分化します。パラメータセットで取りうるパラメータを定義し、すべての組み合わせ計算し、その中で最もいいパラメータセットを決定します。このような総当りで計算して最適なパラメータセットを決定する方法をGridSerachCVといいます。
RFCのCross-validationについてのRFC(ランダムフォーレスト分類器)の問題でクロスバリデーションを紹介しましたが、クロスバリデーションをモデルのパラメータ最適化に応用します。
今回使うデータも、RFCのクロスバリデーション、ロジスティック回帰分析のブログで利用したKaggle からダウンロードしたHRデータ です。
チートシート
やりたいこと | 方法 |
---|---|
クロスバリデーションでスコアの 平均、標準偏差(scores)を確認する |
1. from sklearn.model_selection import GridSearchCV 2. rf = RFC() 3. cv = GridSearchCV(rf, parameters, cv=5) cv.fit(X_train, y_train.values.ravel(),) |
今回使うデータのポイント
- 退職状況(attrition)に関する人事データ「ロジスティック回帰分析_その1」 で選択した12個の説明変数でRandom Forest Classifer(RFC)で機械学習するところまでは同じです。
- テストデータを更に5等分(cv=5 といた場合)して、バリデーション用データとトレーニング用を1:4の組み合わせを5通り作ります
- 5通り各々の組み合わせでaccuracy スコアを計算して、トレーニングデータでの学習における的中率の平均と標準偏差を計算します
- ベストの組み合わせとなるパラメータをトレーニング結果とします
サンプルオペレーション
- 計算結果をプリントする関数
print_results
を定義し計算結果をJupyter Notebook上にプリントさせます。 - RFCで使うパラメータセットを定義します。今回は
n_estimators;: [5, 50, 100]
とmax_depth: [2, 10, 20, None]
を総当りの組み合わせで性能比較をします。
1
2
3
4
5
6
7
8
9
10
# print_results という関数を定義します
def print_results(results):
# best_params_ にGridSerachCVのベストスコアとするパラメータです
print('BEST PARAMS: {}\n'.format(results.best_params_))
# 平均と標準偏差をresults.cv_results_から取り出して、それぞれmean とstdsに代入します
means = results.cv_results_['mean_test_score']
stds = results.cv_results_['std_test_score']
# それぞれをプリントします。
for mean, std, params in zip(means, stds, results.cv_results_['params']):
print('{} (+/-{}) for {}'.format(round(mean, 3), round(std * 2, 3), params))
パラメータセットを定義します。すべての組み合わせを計算して、そのscore の平均、標準偏差を
1
2
3
4
5
6
7
8
9
10
11
12
# RFC (Random Forest Classifier)をrfとします
rf = RFC()
# 総当りで計算するパラメータセットを定義します
parameters = {
'n_estimators': [5, 50, 100],
'max_depth': [2, 10, 20, None]
}
# GridSearchCV
cv = GridSearchCV(rf, parameters, cv=5)
cv.fit(X_train, y_train.values.ravel(),)
print_results(cv)
以下のとおり、max_depth:20, n_estimators: 50
の組み合わせが平均0.854, 標準偏差0.015 で最も成績がいいという結果になりました。
参照 GridSerachCV_User_Guide
参照 Cross-validation:_evaluating_estimator_performance
参照 Parameter estimation using grid search with cross-validation
ひとこと
トレーニングデータでモデルのパラメータ最適化して、検証データで性能評価をする機械学習では、トレーニングデータによってどうしてもその性能にバラツキが出てしまいます。トレーニングを繰り返し、技術に磨きをかけて、よりいい記録をだすアスリートと同様に、クロスバリデーションとパラメータ最適化で性能を高めるのが、GridSerachCVの考え方です。