Visualizing decision tree : IndexError: list index out of range

Visualizing decision tree : IndexError: list index out of range

决策树下方:

使用代码生成:

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'],而您将 class 标签指定为仅 truefalse,这是错误的,因为您显然使用了 2 个以上的标签,并且它无法将大小为 2 的数组(class 名称)映射到大小为 3 的数组(您的实际标签)。所以基本上你需要在 truefalse 之外添加另一个标签,它应该可以正常工作。

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)  

现在它应该可以正常工作了。随意命名第三个标签。错误基本上是因为您没有为第三个标签指定任何内容,因此它无法将实际标签(即 234)映射到您在class_names,即 truefalse