2016-09-13 10 views
3

私の目標は、デシジョンツリー内でどのような深さで2つのサンプルが分かれるかを特定することです。 scikit学習の開発バージョンでは、共通ノードを最後に識別するためにdecision_path()メソッドを使用することができます。scikit-learnデシジョンツリーノードの深さ

from sklearn import tree 
import numpy as np 

clf = tree.DecisionTreeClassifier() 
clf.fit(data, outcomes) 
n_nodes = clf.tree_.node_count 
node_indicator = clf.decision_path(data).toarray() 
sample_ids = [0,1] 
common_nodes = (node_indicator[sample_ids].sum(axis=0) == len(sample_ids)) 
common_node_id = np.arange(n_nodes)[common_nodes] 
max_node = np.max(common_node_id) 

max_nodeはおそらくclf.tree_.children_rightclf.tree_.chrildren_leftで、ツリー内の何が起こるかの深さで判別する方法はありますか?ここで

答えて

2

あなたが再帰的にノードを横断し、ノードの深さに

def get_node_depths(tree): 
    """ 
    Get the node depths of the decision tree 

    >>> d = DecisionTreeClassifier() 
    >>> d.fit([[1,2,3],[4,5,6],[7,8,9]], [1,2,3]) 
    >>> get_node_depths(d.tree_) 
    array([0, 1, 1, 2, 2]) 
    """ 
    def get_node_depths_(current_node, current_depth, l, r, depths): 
     depths += [current_depth] 
     if l[current_node] != -1 and r[current_node] != -1: 
      get_node_depths_(l[current_node], current_depth + 1, l, r, depths) 
      get_node_depths_(r[current_node], current_depth + 1, l, r, depths) 

    depths = [] 
    get_node_depths_(0, 0, tree.children_left, tree.children_right, depths) 
    return np.array(depths) 
を計算するために使用することができます機能です