決定木分析のパラメータ解説


前回の記事は決定木の特徴とアルゴリズムを説明しました。今回の記事は決定木のパラメータ設定を説明します。決定木の紹介はこちらです。

Scikit-learnのライブラリのパラメータを説明していきます。

class sklearn.tree.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_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)[source]

 

from sklearn.datasets import load_iris

from sklearn import tree

 

clf = tree.DecisionTreeClassifier(criterion=’gini’,

                                  splitter=’best’,

                                  max_depth=4,

                                  min_samples_split=3,

                                  min_samples_leaf=1,

                                  min_weight_fraction_leaf=0.0,

                                  max_features=4,

                                  random_state=None,

                                  max_leaf_nodes=8,

                                  min_impurity_split=1e-07,

                                  class_weight=’balanced’,

                                  presort=False)

 

iris = load_iris()

clf.fit(iris.data, iris.target)

 

from dtreeviz.trees import dtreeviz

 

viz = dtreeviz(

    clf,

    iris.data,

    iris.target,

    target_name=’variety’,

    feature_names=iris.feature_names,

    class_names=[str(i) for i in iris.target_names],

)

 

viz.view()

dtree00

criterion : string, optional (default=”gini”)

データの分割の方法を’gini’ か ‘entropy’ で指定します。’gini’: gini係数を用いて、データの分離を行っていきます。 ‘entropy’:information gain を使い、効率的な条件を探ります。

使い分けのポイントとしては、ジニ係数の方が、連続データを得意としており、エントロピーはカテゴリーデータを得意としていると言われています。ジニ係数は、誤分類を最小化するのに対して、エントロピーは探索的に基準値を探していきます。

dtree01

 

splitter : string, optional (default=”best”)

各ノードで分割を選択するために使用された戦略です。 サポートされている戦略は、最適な分割を選択するための“best” と、最良のランダム分割を選択するための “random” です。

基本的には”best”ですが、やや過学習になります。また計算時間が少なくなります。

dtree02

 

max_depth : int or None, optional (default=None)

ツリーの最大深度です。 Noneの場合、ノードは、すべてのリーフが1になるまで展開されます。通常、過学習を防ぐために、決定木の深さの最大値を決め、制限します。

dtree03

 

min_samples_split : int, float, optional (default=2)

ノードを分割するために必要な最小サンプルサイズ。整数を指定した場合,その数,小数を指定した場合,全サンプルサイズに対する割合になります。0.01ぐらいを目安とし、過学習の場合は値を大きくしていきます。

dtree04

 

min_samples_leaf : int, float, optional (default=1)

整数を指定した場合は、葉を構成するのに必要な最小限のサンプルの数になります.また小数を指定した場合,元々のサンプルサイズに占める割合と解釈されます。小さいと過学習気味になります。

dtree05

 

min_weight_fraction_leaf : float, optional (default=0.)

リーフノードに必要な(すべての入力サンプルの)重みの総和の最小加重割合。 sample_weightが指定されていない場合、サンプルの重みは同じです。データが不均衡の場合、用います。

dtree06

 

max_features : int, float, string or None, optional (default=None)

最適な分割をするために考慮する特徴量の数を指定します。整数を指定した場合,その個数,小数の場合全特徴量に対する割合個,auto を指定した場合,特徴量数のルート個,log2 を指定した場合,log2(特徴量数) 個になります。最初のわからない時は、Noneですが、過学習の場合は、減らします。

dtree07

 

random_state : int, RandomState instance or None, optional (default=None)

intの場合、random_stateは乱数ジェネレータによって使用されるシードです。 同じ結果を再現する場合に指定します。

dtree08

 

max_leaf_nodes : int or None, optional (default=None)

生成される決定木における最大の葉の数を指定します。 Noneの場合、リーフノードの数は無制限です。過学習の場合は、小さくします。

dtree09

 

min_impurity_decrease : float, optional (default=0.)

木の成長における早期停止の閾値。 ノードは、その不純物がしきい値を上回ると分割され、そうでない場合はリーフです。過学習の場合は、大きくしていきます。小さいと細かく分けていく傾向があります。

dtree10

 

class_weight : dict, list of dicts, “balanced” or None, default=None

balanced または None を指定.デフォルトは None.ディクショナリを指定する場合,{class_label:weight} の形式で,各クラスに重みを設定できます。 指定されない場合、すべてのクラスは重み1を持つと仮定されます。 多出力問題の場合、yの列と同じ順序でdictsのリストを提供することができます。不均衡なデータのときに用います。

dtree11

 

presort : bool, optional (default=False)

データを事前に並び替えることで計算の高速化を図ります。データサイズが大きい場合はトレーニングが遅くなる可能性があります。データサイズが小さい場合や決定木の深さが制限されている場合は高速化が期待されます。

dtree12