【问题标题】:how to explain the decision tree from scikit-learn如何从 scikit-learn 解释决策树
【发布时间】:2014-06-26 18:38:07
【问题描述】:

我在理解 scikit-learn 的决策树结果方面有两个问题。例如,这是我的决策树之一:

我的问题是如何使用这棵树?

第一个问题是:如果一个样本满足条件,那么它转到LEFT分支(如果存在),否则它转到RIGHT。就我而言,如果 X[7] > 63521.3984 的样本。然后样本将进入绿色框。对吗?

第二个问题是:当一个样本到达叶子节点时,如何知道它属于哪个类别?在此示例中,我要分类三个类别。在红色框中,分别有 91、212 和 113 个样本满足条件。但是我如何确定类别? 我知道有一个函数 clf.predict(sample) 来告诉类别。我可以从图表中做到这一点吗??? 非常感谢。

【问题讨论】:

  • 出于好奇,您是如何绘制决策树的?
  • 首先将树导出为 JSON 格式(参见link),然后使用 d3.js 绘制树。或者你可以直接使用内嵌函数:tree.export_graphviz(clf, out_file=your_out_file, feature_names=your_feature_names)希望可以,@Matt

标签: python numpy scipy scikit-learn decision-tree


【解决方案1】:

每个框中的value 行按顺序告诉您该节点有多少样本属于每个类别。这就是为什么在每个框中,value 中的数字加起来就是sample 中显示的数字。例如,在你的红色框中,91+212+113=416。所以这意味着如果你到达这个节点,那么在类别 1 中有 91 个数据点,在类别 2 中有 212 个数据点,在类别 3 中有 113 个数据点。

如果您要预测到达决策树中该叶节点的新数据点的结果,您将预测类别 2,因为这是该节点上样本最常见的类别。

【讨论】:

  • 我很想知道哪个值属于哪个类。 DecisionTreeClassifier.classes 持有此信息。
  • (有用的答案。为了澄清使用 python 索引:将预测(计数 212)落在红色框中的样本作为类别 1,而不是类别 0 (91) 或类别 2 (113) :-) )
【解决方案2】:

第一个问题: 是的,你的逻辑是正确的。左节点为真,右节点为假。这可能是违反直觉的; true 可以等同于较小的样本。

第二个问题: 这个问题最好通过使用 pydotplus 将树可视化为图形来解决。 tree.export_graphviz() 的 'class_names' 属性将为每个节点的多数类添加一个类声明。代码在 iPython 笔记本中执行。

from sklearn.datasets import load_iris  
from sklearn import tree  
iris = load_iris()  
clf2 = tree.DecisionTreeClassifier()  
clf2 = clf2.fit(iris.data, iris.target)  

with open("iris.dot", 'w') as f:  
    f = tree.export_graphviz(clf, out_file=f)  
    
import os  
os.unlink('iris.dot')  

import pydotplus  
dot_data = tree.export_graphviz(clf2, out_file=None)  
graph2 = pydotplus.graph_from_dot_data(dot_data)  
graph2.write_pdf("iris.pdf")  

from IPython.display import Image  
dot_data = tree.export_graphviz(clf2, out_file=None,  
                     feature_names=iris.feature_names,  
                     class_names=iris.target_names,  
                     filled=True, rounded=True,  # leaves_parallel=True, 
                     special_characters=True)  
graph2 = pydotplus.graph_from_dot_data(dot_data)

## Color of nodes
nodes = graph2.get_node_list()

for node in nodes:
    if node.get_label():
        values = [int(ii) for ii in node.get_label().split('value = [')[1].split(']')[0].split(',')];
        color = {0: [255,255,224], 1: [255,224,255], 2: [224,255,255],}
        values = color[values.index(max(values))]; # print(values)
        color = '#{:02x}{:02x}{:02x}'.format(values[0], values[1], values[2]); # print(color)
        node.set_fillcolor(color )
#

Image(graph2.create_png() ) 

至于确定叶子的类,您的示例没有像 iris 数据集那样具有单个类的叶子。这很常见,可能需要过度拟合模型才能获得这样的结果。对于许多交叉验证的模型来说,类的离散分布是最好的结果。

【讨论】:

    【解决方案3】:

    根据《Learning scikit-learn: Machine Learning in Python》一书,决策树表示基于训练数据的一系列决策。

    !(http://i.imgur.com/vM9fJLy.png)

    要对实例进行分类,我们应该回答每个节点的问题。例如,性别是否如果答案是肯定的,则转到树中的左侧子节点;否则你转到正确的子节点。你一直在回答问题(她在三班吗?她在一等班吗?她是否在 13 岁以下?),直到你找到一片叶子。 当您在那里时,预测对应于具有最多实例的目标类

    【讨论】:

      【解决方案4】:

      将 feature_names=X.columns 添加到 tree.export_graphviz,其中 X 是训练数据。

      我的代码如下

      with open("lectureGini.txt", "w") as f:
          f = tree.export_graphviz(lectureGini, out_file=f,feature_names=X.columns)
      # copy contents of file LectureGini.txt into WebGraphviz - http://webgraphviz.com/
      

      lectureGini 是我的 DecisionTreeClassifier 的输出

      这是我发现的一种简单方法,可以添加到我研究过的所有基尼指数的网络示例中。所有网络示例都很好地解释了该方法,但没有一个显示如何找到类别。 我还没有安装 Graphviz,所以我从 jupyter 导出一个文本文件并将文本复制到 Webgraphwiz 中

      【讨论】:

        猜你喜欢
        • 2013-12-12
        • 2017-02-23
        • 2020-04-05
        • 2017-03-26
        相关资源
        最近更新 更多