在理解scikit learn的决策树结果时,我有两个问题。例如,这是我的一个决策树:
第一个问题是:如果一个样本满足条件,那么它会转到LEFT分支(如果存在),否则它会转右。在我的例子中,如果一个样本带有X[7]
第二个问题是:当样本到达叶节点时,我如何知道它属于哪个类别?在这个例子中,我有三个类别要分类。在红色框中,分别有91、212和113个样品满足条件。但是我怎样才能确定类别呢?我知道有一个函数clf。预测(样本)以说明类别。我能从图表上看出来吗???非常感谢。
每个框中的value
行告诉您该节点上按顺序属于每个类别的样本数。这就是为什么,在每个框中,value
中的数字加起来等于lab
中显示的数字。例如,在你的红盒子里,91 212 113=416。所以这意味着如果你到达这个节点,类别1中有91个数据点,类别2中有212个,类别3中有113个。
如果您要预测到达决策树中该叶子的新数据点的结果,您将预测类别2,因为这是该节点上样本最常见的类别。
第一个问题:是的,你的逻辑是正确的。左节点为True,右节点为False。这可能与直觉相反;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数据集那样具有单个类的叶。这是常见的,可能需要过度拟合模型才能获得这样的结果。类的离散分布是许多交叉验证模型的最佳结果。
根据《学习scikit learn:Python中的机器学习》一书,决策树表示基于训练数据的一系列决策。
!(http://i.imgur.com/vM9fJLy.png)
要对实例进行分类,我们应该在每个节点上回答这个问题。例如,性是什么