决策树下方:
使用代码生成:
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
当分类器正确训练时,这是可视化的怪癖吗?
答案 0 :(得分:1)
我认为你的代码中有一个拼写错误。您使用的是clf.fit
,而应该是dt.fit
。
其次,在第二个实例中,您指定了三个标签,即['2','3','4']
,而您将类标签指定为仅true
和false
这是错误的,因为您显然正在使用超过2个标签,它不能将大小为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
和false
。