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