Posted at

機械学習③ 決定木 (Decision Tree)のまとめ

More than 1 year has passed since last update.


決定木 (Decision Tree) のまとめ


What is 決定木 (Decision Tree) ?

決定木は、データに対して、次々と条件を定義していき、その一つ一つの条件に沿って分類していく方法です。下記の図で言うとウインドサーフィンをするかしないかを判断しようとしています。そこで最初に、風の強さでカテゴリ分けした後に、晴れているかどうかでカテゴリ分けをしています。

この右のモデルを決定木と言います。決定木では、左の図にもある通り、線形での分類を複数回行うことで分類します。

Screen Shot 2017-05-09 at 11.39.46.png

Extracted by 'Introduction to Machine Learning', Udacity

ちなみに決定木には、回帰と分類があるようですが、今回話すのは分類 (classifier) の方です。


default のコード


DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=None, random_state=None, max_leaf_nodes=None,
min_impurity_split=1e-07, class_weight=None, presort=False)


決定木 (Decision Tree) 内の Parameter の説明

中身がたくさん入っていますね。主要なものだけ下記で説明していきます。


  • min_samples_split

min_samples_split = 2 とすると、その分岐先の値が2以上の場合は、まだ分岐を続けることになります。下記の図を見てみると、水色のマルで囲まれたところは、まだサンプルが2以上なので、分岐を続けます。しかし、サンプル数によっては、過学習になってしまう可能性が高いので、調整が必要です。

Screen Shot 2017-05-09 at 12.35.35.png

Extracted from 'Introduction to Machine Learning', Udacity


  • criterion

データの分割の方法を'gini' か 'entropy' で指定します。

'gini': あるk個目の分類先の不純度(gini係数)が低い方がいい。

'entropy':information gain を使い、一番効率的な条件を探る。

違いはあんまりないらしいけど、詳しく書かれているのはココココ


  • max_depth

これで過学習を防ぐために、決定木の深さの最大値を決め、制限する。


Decision Tree の可視化 (Iris set の場合)

from IPython.display import Image
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())

Screen Shot 2017-05-09 at 11.00.27.png

The image and the code are extracted from 'Sklearn document'


決定木の過学習を防ぐ方法


  • min_samples_leaf でツリーの最後に行き着くところの最小値を指定する。

  • max_depth でツリーの深さの制限をする。


Decision Tree の 良い点悪い点。


  • 良い点

他のアルゴリズムでは、データの正規化やダミー変数の作成などが必要なのに対して、Decision Tree では、カテゴリカルデータや数値データを扱えるの出前処理をほとんど必要としません。また、上記のように可視化できるので、非常に理解しやすいアルゴリズムであることがわかります。


  • 悪い点

過学習されやすい。

縦横の直線で、データを分類するので、軸に平行な境界線でデータを区切れないときは、うまく分類できない。


まとめ

以上が現在筆者のわかる範囲での Decision Tree の概要です。

日々更新していきますので、追加すべきところ、直すべきところありましたら、コメントいただけると幸いです。