可视化决策树:IndexError:列表索引超出范围

时间:2017-09-22 20:07:06

标签: python machine-learning scikit-learn decision-tree

决策树下方:

enter image description here

使用代码生成:

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

当分类器正确训练时,这是可视化的怪癖吗?

1 个答案:

答案 0 :(得分:1)

我认为你的代码中有一个拼写错误。您使用的是clf.fit,而应该是dt.fit

其次,在第二个实例中,您指定了三个标签,即['2','3','4'],而您将类标签指定为仅truefalse这是错误的,因为您显然正在使用超过2个标签,它不能将大小为2(类名)的数组映射到大小为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