2017-01-20 7 views
1

問題設定:データの98%がクラスAに属し、2%がクラスBに属している不均衡なデータセットを持っています。私は、class_weightsを使用してDecisionTreeClassifier(sklearnから)以下の設定を使用してください:export_graphvizからのデシジョンツリー出力の理解

dtc_settings = { 
    'criterion': 'entropy', 
    'min_samples_split': 100, 
    'min_samples_leaf': 100, 
    'max_features': 'auto', 
    'max_depth': 5, 
    'class_weight': 'balanced' 
} 

基準を(giniではなく)エントロピーに設定する理由はありません。私はちょうど設定で遊んでいた。

ツリーのexport_graphvizを使用して、以下の決定木の図を取得しました。ここで私が使用したコードだ:

dot_data = tree.export_graphviz(dtc, out_file=None, feature_names=feature_col, proportion=False) 
graph = pydot.graph_from_dot_data(dot_data) 
graph.write_pdf("test.pdf") 

私は、次の図の値リストの出力に混乱しています:

enter image description here

値リストの変数は、両方のクラスが同じ重みを持っていることを意味していますか?もしそうなら、ツリー内の次のノードの値リストはどのように計算されますか? enter image description here

私が値リストを解釈する方法がわからない:

は、ここで私はexport_graphvizにTrueに割合を設定する別の例です。エントリクラスの重みですか?これは、分類器が次のノードで使用する次のしきい値を決定するために、各クラスにそれぞれ重みを適用していることを意味しますか?

答えて

1

リストは、そのノードに到達した各クラスのレコード数を表します。ターゲット変数の編成方法に応じて、最初の値はそのノードに到達したタイプAのレコードの数を表し、2番目の値はそのノードに到達したタイプBのレコードの数です(逆もまた同様です)。

割合がTrueに設定されている場合、そのノードに到達した各クラスのレコード数はであることが今度はになります。

決定木の仕組みは、クラスを最適に分離する決定を見つけることです。だから、のような結果になる決定を好むでしょう。[50, 50]

+0

お返事ありがとうございます。私がバランスのとれたデータセットを持っていれば、レコードの数は意味をなさないでしょう。この場合、サンプルの98%はクラスAに属し、2%はクラスBに属します。私はclass_weightを 'balanced'に設定しました。これは値リストの各エントリを同じものに設定しています。だから私は、データが本質的にこの分布を持たない場合、レコードの割合がどのように同じであるかは分かりません。 – OfLettersAndNumbers

+0

そのノードでエントロピー= 1と主張することも同じことを示唆しています。 Entroyは、クラスがバランスしているときは1、すべてが1クラスのときは0です。 class_weightを 'balanced'に設定すると、2つのクラスの表現が等しくなるまで少数派クラスが複製されますhttp://stackoverflow.com/questions/30972029/how-does-the-class-weight-parameter-in-scikit-learn-work – Metropolis