決定木 (Decision Tree) のまとめ
What is 決定木 (Decision Tree) ?
決定木は、データに対して、次々と条件を定義していき、その一つ一つの条件に沿って分類していく方法です。下記の図で言うとウインドサーフィンをするかしないかを判断しようとしています。そこで最初に、風の強さでカテゴリ分けした後に、晴れているかどうかでカテゴリ分けをしています。
この右のモデルを決定木と言います。決定木では、左の図にもある通り、線形での分類を複数回行うことで分類します。
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以上なので、分岐を続けます。しかし、サンプル数によっては、過学習になってしまう可能性が高いので、調整が必要です。
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())
The image and the code are extracted from 'Sklearn document'
決定木の過学習を防ぐ方法
- min_samples_leaf でツリーの最後に行き着くところの最小値を指定する。
- max_depth でツリーの深さの制限をする。
Decision Tree の 良い点悪い点。
- 良い点
他のアルゴリズムでは、データの正規化やダミー変数の作成などが必要なのに対して、Decision Tree では、カテゴリカルデータや数値データを扱えるの出前処理をほとんど必要としません。また、上記のように可視化できるので、非常に理解しやすいアルゴリズムであることがわかります。
- 悪い点
過学習されやすい。
縦横の直線で、データを分類するので、軸に平行な境界線でデータを区切れないときは、うまく分類できない。
まとめ
以上が現在筆者のわかる範囲での Decision Tree の概要です。
日々更新していきますので、追加すべきところ、直すべきところありましたら、コメントいただけると幸いです。