分類アルゴリズム~決定木④アンサンブル手法~
こんにちは!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))
.score(X_trn[two_features], Y_trn))
print('accuracy on test data',random_forest_model_2feat
.score(X_tst[two_features], Y_tst))
.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)
木を基にした機械学習の利点として、機能の重要度のランク付けが出来る事にあります。
これを利用する事で、モデルの解釈の可能性に非常に役に立ちます。
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'])
勾配ブースト木(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)