分類アルゴリズム~決定木④アンサンブル手法~

 こんにちは!EMです^^

 

今回も引き続き決定木シリーズを解説していきます!

メインのテーマはアンサンブル手法です!

 

アンサンブル手法(Ensemble methods)

ランダムフォレスト:

たくさんの決定木を並行して構築し、多数決を使用して
出力を1つのモデルにかしこく結合します。

合計データのサブセット(サンプリング)が各決定木に使用され
最後に集計(バギング:bagging)が行われてすべてがまとめられます。

 

ブーストツリー:

たくさんの決定木を連続して構築します。

後続のモデルは、前のモデルのエラーを元に構築されます。

この構成では、前のモデルで捉えられなかった効果に追加のモデルが適合します。

そして最後に、異なるモデルが一緒に追加されて最終的な結果が得る事が出来ます。

 

ランダムフォレスト

from sklearn.ensemble import RandomForestClassifier

random_forest_model = RandomForestClassifier(n_estimators=50, max_depth=5)
random_forest_model.fit(X_trn[features_to_include], Y_trn)
 
print('accuracy on training data',random_forest_model
    .score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',random_forest_model
    .score(X_tst[features_to_include], Y_tst))
 
【output】
accuracy on training data 0.8004733727810651
accuracy on test data 0.8030518097941802
 
 
【2つの特徴に絞った場合】
 
random_forest_model_2feat = RandomForestClassifier(n_estimators=50, max_depth=5,)
random_forest_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',random_forest_model_2feat
.score(X_trn[two_features], Y_trn))
print('accuracy on test data',random_forest_model_2feat
.score(X_tst[two_features], Y_tst))
 
【output】
accuracy on training data 0.7988165680473372
accuracy on test data 0.7934705464868701
 
 
PlotBoundaries(random_forest_model_2feat, X_tst[two_features].values,Y_tst) 
 

f:id:tennisfashionista:20210217234734p:plain

 
木を基にした機械学習の利点として、機能の重要度のランク付けが出来る事にあります。
これを利用する事で、モデルの解釈の可能性に非常に役に立ちます。
 
 
df_feat_importances = pd.DataFrame(list(zip(features_to_include,
            random_forest_model.feature_importances_)), 
            columns=['Feature','Importance'])
df_feat_importances.sort_values(by='Importance', inplace=True)
 
 
plt.figure(figsize=[6,8])
plt.barh(df_feat_importances['Feature'],df_feat_importances['Importance'])
 

f:id:tennisfashionista:20210217235403p:plain

 
 
 

勾配ブースト木(Gradient Boosted Trees)

※ここでは出力結果を割愛しています。ぜひ一度どんな結果が出るか試してみてください^^ 

from sklearn.ensemble import GradientBoostingClassifier

gbm_model = GradientBoostingClassifier(n_estimators=50, max_depth=5
                     min_samples_leaf=100)
gbm_model.fit(X_trn[features_to_include], Y_trn)
 
print('accuracy on training data',gbm_model.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',gbm_model.score(X_tst[features_to_include], Y_tst))
 
 
 
 
gbm_model_2feat = GradientBoostingClassifier(n_estimators=50, max_depth=5
                        min_samples_leaf=100)
gbm_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',gbm_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',gbm_model_2feat.score(X_tst[two_features], Y_tst))
 
 
 
PlotBoundaries(gbm_model_2feat, X_tst[two_features].values,Y_tst) 
 
 
もう一度、機能の重要度を見てみましょう。
 
df_feat_importances_gbm = pd.DataFrame(list(zip(features_to_include,gbm_model.
              feature_importances_)), columns=['Feature','Importance'])
df_feat_importances_gbm.sort_values(by='Importance', inplace=True)
 
 
plt.figure(figsize=[6,8])
plt.barh(df_feat_importances_gbm['Feature'],df_feat_importances_gbm['Importance'])
 
 
 
 

 

 

いかがだったでしょうか?

私自身のデータを当てはめた時は、過学習をする事もあり
色々と値を調整しながら当てはめていました。

 

もしもっと知りたい!という方は、ぜひコメントを残して頂くか
プロのエンジニアの方に効率的に学んでいくのをオススメしています。

 

↓↓データ分析コースなどなど↓↓ 
 

 

ぜひご検討ください^^

 

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