トレーニングデータセットをバリデーション用に細分化してそれぞれで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(),)

今回使うデータのポイント

  1. 退職状況(attrition)に関する人事データ「ロジスティック回帰分析_その1」 で選択した12個の説明変数でRandom Forest Classifer(RFC)で機械学習するところまでは同じです。
  2. テストデータを更に5等分(cv=5 といた場合)して、バリデーション用データとトレーニング用を1:4の組み合わせを5通り作ります
  3. 5通り各々の組み合わせでaccuracy スコアを計算して、トレーニングデータでの学習における的中率の平均と標準偏差を計算します
  4. ベストの組み合わせとなるパラメータをトレーニング結果とします

cross_validation

出典: GridSerachCV_User_Guide

サンプルオペレーション

  1. 計算結果をプリントする関数print_resultsを定義し計算結果をJupyter Notebook上にプリントさせます。
  2. 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 で最も成績がいいという結果になりました。

BEST PARAMS: {'max_depth': 20, 'n_estimators': 50}

0.844 (+/-0.009) for {'max_depth': 2, 'n_estimators': 5}
0.842 (+/-0.005) for {'max_depth': 2, 'n_estimators': 50}
0.844 (+/-0.0) for {'max_depth': 2, 'n_estimators': 100}
0.824 (+/-0.038) for {'max_depth': 10, 'n_estimators': 5}
0.848 (+/-0.029) for {'max_depth': 10, 'n_estimators': 50}
0.849 (+/-0.005) for {'max_depth': 10, 'n_estimators': 100}
0.833 (+/-0.04) for {'max_depth': 20, 'n_estimators': 5}
0.854 (+/-0.015) for {'max_depth': 20, 'n_estimators': 50}
0.853 (+/-0.016) for {'max_depth': 20, 'n_estimators': 100}
0.826 (+/-0.024) for {'max_depth': None, 'n_estimators': 5}
0.844 (+/-0.015) for {'max_depth': None, 'n_estimators': 50}
0.852 (+/-0.016) for {'max_depth': None, 'n_estimators': 100}

参照 GridSerachCV_User_Guide
参照 Cross-validation:_evaluating_estimator_performance
参照 Parameter estimation using grid search with cross-validation


ひとこと

トレーニングデータでモデルのパラメータ最適化して、検証データで性能評価をする機械学習では、トレーニングデータによってどうしてもその性能にバラツキが出てしまいます。トレーニングを繰り返し、技術に磨きをかけて、よりいい記録をだすアスリートと同様に、クロスバリデーションとパラメータ最適化で性能を高めるのが、GridSerachCVの考え方です。