dt = DecisionTreeClassifier()
dt = clf.fit([[1],[2],[3]], [[3],[2],[3]])
dot_data = export_graphviz(dt, out_file=None,
feature_names=['1' , '2' , '3'],
class_names=['true' , 'false'],
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph
如果我改用:
dt = DecisionTreeClassifier()
dt = clf.fit([[1],[2],[3]], [[2],[3],[4]])
dot_data = export_graphviz(dt, out_file=None,
feature_names=['1' , '2', '3'],
class_names=['true' , 'false'],
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph
返回错误:
/usr/local/lib/python3.5/dist-packages/sklearn/tree/export.py in node_to_str(tree, node_id, criterion)
284 node_string += 'class = '
285 if class_names is not True:
--> 286 class_name = class_names[np.argmax(value)]
287 else:
288 class_name = "y%s%s%s" % (characters[1],
IndexError: list index out of range
当分类器正确训练时,这是否是可视化的怪癖?
最佳答案
我认为您的代码中有一个错字。您正在使用clf.fit
,而应为dt.fit
。
其次,在第二个实例中,您指定了三个标签,即['2','3','4']
,而您将类标签仅指定为true
和false
,这是错误的,因为您显然使用了两个以上的标签,并且不能将大小为2的数组(类名)映射为大小为3的数组(您的实际标签)。因此,基本上,您需要添加true
和false
之外的其他标签,它应该可以正常工作。
dt = DecisionTreeClassifier()
dt = dt.fit([[1],[2],[3]], [[2],[3],[4]]) #It should be dt.fit not clf.fit
dot_data = export_graphviz(dt, out_file=None,
feature_names=['1' , '2', '3','4'],
class_names=['true' , 'false','something_else'],
filled=True, rounded=True,
special_characters=True)
现在它应该可以正常工作了。随意命名第三个标签。由于您没有为第三个标签指定任何内容,因此基本上发生了错误,因此它无法将实际标签(即
2
,3
和4
)映射到您在class_names中指定的标签,即和true
。关于python - 可视化决策树:IndexError:列表索引超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46372488/