如何解释sklearn决策树树中的children_left属性_
Posted
技术标签:
【中文标题】如何解释sklearn决策树树中的children_left属性_【英文标题】:How to interpret the children_left attributes in sklearn decision tree tree_ 【发布时间】:2017-06-23 20:35:21 【问题描述】:我正在尝试使用 sklearn DecisionTreeClassifier 中的“tree_”方法提取最深节点的规则。我很难理解模型中的“children_left”和“children_right”数组的含义。谁能帮忙解释一下?
estimator = DecisionTreeClassifier(max_depth=4, random_state=0)
estimator.fit(X_train, y_train)
estimator.tree_.children_left
[6] array([ 1, 2, 3, 4, 5, -1, -1, 8, -1, -1, 11, 12, -1, -1, 15, -1, -1,
18, 19, 20, -1, -1, 23, -1, -1, 26, 27, -1, -1, 30, -1, -1, 33, 34,
35, 36, -1, -1, 39, -1, -1, 42, 43, -1, -1, 46, -1, -1, 49, 50, 51,
-1, -1, 54, -1, -1, 57, 58, -1, -1, 61, -1, -1])
tree_model.tree_.children_right
[7] array([32, 17, 10, 7, 6, -1, -1, 9, -1, -1, 14, 13, -1, -1, 16, -1, -1,
25, 22, 21, -1, -1, 24, -1, -1, 29, 28, -1, -1, 31, -1, -1, 48, 41,
38, 37, -1, -1, 40, -1, -1, 45, 44, -1, -1, 47, -1, -1, 56, 53, 52,
-1, -1, 55, -1, -1, 60, 59, -1, -1, 62, -1, -1])
在 Sklearn 的示例中,http://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html,它说:
`# The decision estimator has an attribute called tree_ which stores the entire
# tree structure and allows access to low level attributes. The binary tree
# tree_ is represented as a number of parallel arrays. The i-th element of each
# array holds information about the node `i`. Node 0 is the tree's root. NOTE:
# Some of the arrays only apply to either leaves or split nodes, resp.`
但它并没有解释 children_left 数组中数字的含义
【问题讨论】:
【参考方案1】:来自帖子:https://github.com/scikit-learn/scikit-learn/blob/4907029b1ddff16b111c501ad010d5207e0bd177/sklearn/tree/_tree.pyx
children_left : array of int, shape [node_count]
children_left[i] holds the node id of the left child of node i.
For leaves, children_left[i] == TREE_LEAF. Otherwise,
children_left[i] > i. This child handles the case where
X[:, feature[i]] <= threshold[i].
children_right : array of int, shape [node_count]
children_right[i] holds the node id of the right child of node i.
For leaves, children_right[i] == TREE_LEAF. Otherwise,
children_right[i] > i. This child handles the case where
X[:, feature[i]] > threshold[i].
【讨论】:
【参考方案2】:from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
children_left = clf.tree_.children_left
print (children_left)
打印出来:
[ 1 -1 3 4 5 -1 -1 8 -1 10 -1 -1 13 14 -1 -1 -1]
你可以在 google 中找到关于 iris 数据的 17 Node 决策树。看到它并与解释进行比较。
现在是解释:
只代表一个节点的左子节点。 如果值为-1,则表示该节点没有左节点。然后它是该决策树的叶节点。在这里我们可以看到有 9 个叶子节点。 如果值>0,则它有左节点。因此它不是叶节点。这里有 8 个节点不是叶节点。 根有一个左节点。是 1。 现在 1 没有任何左节点。所以它是叶子节点。因此-1。如果一个节点没有左节点,它也将节点数增加到1。所以现在节点数是2。 现在我们回溯到根目录。然后我们去root的右节点。它已经离开了节点。现在节点数为 3。 节点 3 有另一个左节点。节点数 4。 节点 4 有另一个左节点。节点数 5。 节点 5 没有任何左节点。所以它是叶子并显示-1。但现在节点数是 6。 我们回溯到节点 4。我们找到它的正确孩子。同样,它没有任何左孩子。所以它是叶子并显示-1。节点数 7。 我们再次返回到节点 3。我们找到它的正确孩子。该节点已离开节点。所以现在节点数是 8。继续。希望你能理解。
【讨论】:
【参考方案3】:只是为了向您展示一个可视化决策树的小技巧。您可以在您选择的绘图函数中指定一个参数 node_ids = True(在我的例子中是 export_graphviz),它会在您的树的图像上显示节点 ID!
export_graphviz(clf, out_file=dot_data, node_ids=True,
filled=True, rounded=True,
special_characters=True,feature_names = feature_cols,class_names=['0','1'])
Iris_plot
!!! :)
【讨论】:
以上是关于如何解释sklearn决策树树中的children_left属性_的主要内容,如果未能解决你的问题,请参考以下文章