分類アルゴリズム~決定木②~

こんにちは!EMです^^

 

 

今回も引き続き、決定木について解説していきたいと思います。

 

決定木①では決定木が過学習しやすいというお話をしました。

では過学習してしまった時、どのように対処していくのかという事を
みていきましょう。

 

正則化(Regularization)

過学習をコントロールする方法として、事前剪定(pre-pruning)
と呼ばれる手法があります。

決定木は字のごとく木に例えられているので、木の枝が長くなる前に
刈ってしまうというイメージですね。

もしくはポスト剪定(post-pruning)といって、モデルを適合する間に
決定木の長さを調整をしていう方法もよく使われます。

これは一度モデルを適合した後に、決定木の長い枝を切っていくものなのですが
残念ながらsklearnの中には実装されていません。

 

ここでは2つの事前剪定手法に注目していきたいと思います。

 

 1.max_depthを使用して、枝(ノード)の数を制限します。
   これにより、木全体の複雑さが制限されて、個々のデータポイントごとに
   必要以上に過学習を招く事を防ぎます。

    2.min_samples_leafを使用して、各エリアがカバーする必要のある
   データポイントの数に下限の値を設定します。
   これにより、決定木はデータ量の多い領域に適合し
   少ないデータポイントごとに特定の領域が作られるのを防ぎます。


どちらの手法も比較的うまく機能する事が多いです。

詳細については、こちらのサイトも参照してみてください。

http://scikit-learn.org/stable/modules/tree.html#tips-on-practical-use

 

DT_model_2feat = tree.DecisionTreeClassifier(max_depth=5, min_samples_leaf=50)
DT_model_2feat.fit(df[two_features], df['Churn'])
PlotBoundaries(DT_model_2feat, X_tst[two_features].values,Y_tst) 
 

f:id:tennisfashionista:20210214233047p:plain

 

DT_model_2feat = tree.DecisionTreeClassifier(max_depth=3, min_samples_leaf=50)
DT_model_2feat.fit(X_trn[two_features], Y_trn)

print('accuracy on training data',DT_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',DT_model_2feat.score(X_tst[two_features], Y_tst))
 
 
【output】
accuracy on training data 0.7815384615384615
accuracy on test data 0.7867281760113556
 
Notice how much simpler our boundaries are, and how there was minimal dropoff in accuracy on unseen data
 
前回の出力結果に比べると、プロット図がよりシンプルになったこと
またテストデータの精度の低下が最小限になり、過学習を解消できたという点に
お気づきになりましたか?
 
 
次回は決定木の違った形の視覚化について、解説していきたいと思います^^
 
 
またもし本気で今勉強している、したいという方は
ぜひプロのお話を聞くのもおすすめしています。
私のブログでも今後幅広く、内容を解説していきたいと思っていますが
本気で勉強したいという人を応援したいので、ぜひ効率の良い方法もご検討ください。
 
 
↓↓データ分析コースなどなど↓↓ 
 
 
 
最後まで読んで頂きありがとうございました^^