satopoooonのブログ

自分向けの備忘録

kaggleに挑戦その4 k分割交差検証(k-fold cross-validation)及びグリッドサーチ

k分割交差検証

前回までで、ランダムフォレストでモデル予測を実施しました。
今回は、k分割交差検証、グリッドサーチを用いてモデル性能の評価及びハイパーパラメータの修正を行います。
これにより、バイアス高、バリアンス高のバランスをとることができます。
ランダムフォレストで、モデル化してみましたが、これは汎化性能がどの程度あるのか、
k分割交差検証で調べます。

k分割交差検証とは、トレーニングデータをランダムにk個分割して、
そのうちk-1個をモデル予想に使い、残りの1個でそのモデルを予想し、
この手順をk回繰り返すことで、そのモデルの平均性能を評価するものです。
kをどの程度の値にすべきかは、もとのデータセットに依存します。
kの値でどう変わるかというと、、、
・kが大きいと、各トレーニングサブセットの値が似てきて、評価のバリアンス高(性能評価の結果が、テストデータに依存した形となりやすい。)となりやすい。
・kが小さいと、各トレーニングサブセットの値が違いすぎて、バイアス高となりモデルの正確な評価ができない(毎回違う評価結果となる)。
ということです。

今回は、k=5として実施していきます。

from sklearn.model_selection import KFold
from sklearn import metrics
from sklearn.metrics import accuracy_score
K = 5
kf = KFold(n_splits=K, shuffle=True, random_state=1 )

score_train_tmp = 0
score_test_tmp = 0

X = x_train
y = np.array(titanic_df_main_random_forest["Survived"])

for train_index,test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # トレーニングサブセットでモデル構築
    forest.fit(X_train, y_train)

    # トレーニングサブセットでの予測値
    pred_train = forest.predict(X_train)

    # トレーニングサブセットのaccuracy
    auccuracy = accuracy_score(pred_train, y_train)

    #トレーニングサブセットのaccuracyを足していく
    score_train_tmp+=auccuracy

    #テストサブセットの予測値
    pred_test = forest.predict(X_test)

    #テストサブセットのaccuracy
    auccuracy = accuracy_score(pred_test, y_test)

    #テストサブセットのaccuracyを足していく
    score_test_tmp+=auccuracy

これで、ランダムフォレストモデル(n_estimators = 100)の平均性能を評価することができます。
続いて、nn_estimators を変えたら、モデル性能はどのように変わるか、グリッドサーチ及びk分割交差検証を実施していきます。

グリッドサーチ

事前に決めるべきパラメータのことをハイパーパラメーターといいます。
今回は、2分木の数(n_estimators)がそれに当たります。
これはいくつにすれば良いのか???ということで今回はグリッドサーチを実施します。
グリッドサーチとは、パラメータを網羅的に変えながら、モデルの良し悪しを評価(例えばk分割交差検証)していき、
何が一番良いのか決める方法のことです。

scikit-learnには、もともとグリッドサーチ用のクラスが準備されているのでそれを使います。
(for文でループ!とかやらなくてもOK)

from sklearn.model_selection import GridSearchCV
param_grid = {"n_estimators":[10,20,30,40,50,60,70,80,90,100]}

tree_grid = GridSearchCV(estimator=forest,
                 param_grid = param_grid,     
                 scoring="accuracy",  #metrics
                 cv = K,              #cross-validation
                 n_jobs =-1)          #number of core

tree_grid.fit(X,y) #fit

tree_grid_best = tree_grid.best_estimator_ #best estimator
print("Best Model Parameter: ",tree_grid.best_params_)
print("Best Model Score    : ",tree_grid.best_score_)

実行した結果が以下です。n_estimatorsがいくつだと性能が良いかわかりますね。

Best Model Parameter:  {'n_estimators': 90}
Best Model Score    :  0.805836139169