【Kaggle】タイタニックの振り返り#4-1 ランダムフォレストのパラメータチューニング

前回で特徴選択まで終了したので、今回はモデルのパラメータチューニングに取り掛かろうと思います。

チューニングするモデルはランダムフォレストです。

▼タイタニック振り返り全体の流れ

#1 最低限の前処理+パラメータチューニングなしの3モデル+stratified-k-fold

#2 特徴量をいくつか追加投入

#3 RFEによる特徴選択を試みる

#4 モデルのパラメータチューニング

#5 アンサンブルその1:シンプルなブレンド

#6 アンサンブルその2:スタッキング

 

▼前3回の記事

【Kaggle】タイタニック振り返り#1 RandomForest vs XGBoost vs LightGBM

【Kaggle】タイタニック振り返り#2 特徴量エンジニアリング

【Kaggle】タイタニックの振り返り#3 RFECVで特徴選択

 

まずは前回のランダムフォレストと同じ状況を再現しておく

 

前回のおわり(RFECVで特徴選択をした後に、再度ランダムフォレスト分類器にかけた状態)からスタートします。

 

 

ランダムフォレストのパラメータ

ランダムフォレストで使用できるパラメータは以下の通り

(データ科学便覧様より引用)

パラメーター 詳細
n_estimators 整数を指定.デフォルトの値は10.バギングに用いる決定木の個数を指定.
criterion 文字列を指定.デフォルトは gini.その他に entropy を指定できる.決定木はこの指標を基準にデータを分割する.
max_features 整数,小数,文字列または None を指定.デフォルトは None.最適な分割をするために考慮するフィーチャーの数を指定.整数を指定した場合,その個数,小数の場合全フィーチャーに対する割合個,auto を指定した場合,フィーチャー数のルート個,log2 を指定した場合,log2(フィーチャー数) 個.基本は None を使うべき.
max_depth 整数または None を指定.決定木の深さの最大値を指定.過学習を避けるためにはこれを調節するのが最も重要.
min_samples_split 整数または小数を指定.デフォルトは None.ノードを分割するために必要な最小サンプルサイズ.整数を指定した場合,その数,小数を指定した場合,全サンプルサイズに対する割合個.
min_samples_leaf 整数か小数で指定.デフォルトは1.葉を構成するのに必要な最小限のサンプルの数.整数を指定した場合,その数.小数を指定した場合,元々のサンプルサイズに占める割合と解釈される.
min_weight_fraction_leaf 数値で指定.デフォルトは0.葉における重みの総和の最小加重率を指定.何のためのパラメーターなのか不明瞭.
max_leaf_nodes 整数または None を指定.デフォルトは None.生成される決定木における最大の葉の数を指定.
min_impurity_split 数値を指定.デフォルトは 1e-7.決定木の成長の早期停止の閾値.不純度がこの値より大きいとき,ノードは分割される.
bootstrap True または False を指定.決定木モデルの構築の際にブートストラップサンプリングを行うかどうかの指定.
oob_score 学習における正確度の計算に OOB (out-of-bag),すなわち,各ブートストラップサンプリングでサンプリングされなかったサンプルを利用するかどうかの指定.デフォルトは False.
n_jobs 整数を指定.デフォルトは1.フィットおよび予測の際に用いるスレッドの数を指定.-1 を指定した場合は計算機に載っている全スレッド分確保される.
random_state 乱数のタネの指定.何かしらの整数を指定すべき.
verbose 整数を指定.モデル構築の過程のメッセージを出すかどうか.デフォルトは0.
warm_start True または False を指定.デフォルトは False.ここに True を設定すると既にフィットしたモデルに学習を追加することができる.
class_weight ディクショナリ,ディクショナリのリスト,balanced または None を指定.デフォルトは None.ディクショナリを指定する場合,{class_label:weight} の形式で,各クラスに重みを設定できる.指定しない場合は全てのクラスに1が設定されている.balanced を指定すると,y の値により n_samples / (n_classes * np.bincount(y)) を計算することで自動的に重みを調整する.

https://data-science.gr.jp/implementation/iml_sklearn_random_forest.html

今回は、

・max_depth

・n_estimators

・min_samples_split

・max_features

・criterion

の5つを調整してみようと思います。

 

調整するレンジを定める

各々のパラメータを調整したいのですが、各パラメータごとに、いくつからいくつのレンジで値を動かして調整するかを決めなくてはいけません。

ここも感覚ではなくデータを見て決めたいので、validation_curveを利用することにします。

これはあるパラメータの値を変更すると、トレインデータのスコアと、CVスコアがどのように推移するかのプロット図を描きます。

『python機械学習クックブック』を参考にしました。

まずはmax_depthから見てみます。1~30まで、1つ飛ばしで値を変化させてスコアの推移をみてみます。

トレーニングスコアはmax_depth=20あたりで横ばいになります。CVスコアは7,8あたりがよさげでしょうか。

他のパラメータも同様に見ていきます。

▼n_estimators

▼min_samples_split

▼max_features

ではこのレンジでグリッドサーチをかけていきます。

 

GridSearchCV

グリッドサーチは事前に指定したパラメータのレンジですべての組み合わせのモデルを作成して、スコアを比較する絨毯爆撃のような方法です。

まずはmax_depthとcriterionを変化させて最適なパラメータ値を探索します。

best_params_では最もスコアの高かった組み合わせでのパラメータ値、

best_scores_では、その時のスコアを表示してくれます。

{‘class_weight’: ‘balanced’, ‘criterion’: ‘gini’, ‘max_depth’: 11, ‘verbose’: 10}
0.8226711560044894

調整前が0.811393でしたので、スコアの向上が見られました!

では、次にmax_depth=11, criterion=”gini”で固定して、n_estimatorsを探索します。

{‘class_weight’: ‘balanced’, ‘criterion’: ‘gini’, ‘max_depth’: 11, ‘n_estimators’: 21, ‘verbose’: 10}
0.8249158249158249

n_estimatorsは21が最適なようです。

同様にして、max_featuresとmin_samples_splitも調整します。

{‘class_weight’: ‘balanced’, ‘criterion’: ‘gini’, ‘max_depth’: 11, ‘max_features’: 0.7, ‘n_estimators’: 21, ‘verbose’: 10}
0.8305274971941639

{‘class_weight’: ‘balanced’, ‘criterion’: ‘gini’, ‘max_depth’: 11, ‘max_features’: 0.7, ‘min_samples_leaf’: 2, ‘n_estimators’: 21, ‘verbose’: 10}
0.8316498316498316

はい、最終的に0.8316までCVスコアが上がりました!

 

ランダムフォレストに関してはこれでいったん完了にしようと思います。

 

次はXGBoostのパラメータチューニングを行おうと思います。

【Kaggle】タイタニックの振り返り#4-2 XGBoostのパラメータチューニング

最後まで読んでいただきありがとうございました。