sklearn树导出函数中类名的顺序应该是什么(python sklearn的初学者问题)

数据挖掘 Python scikit-学习
2021-10-08 20:04:20

我正在尝试使用 sklearn 决策树的简单示例。我将“number,is_power2,is_even”作为特征,而课程是“is_even”(当然这很愚蠢)

这是代码

from sklearn import tree

features =[[1,0,0] , [2,1,1] , [3,0,0] , [4,1,1] , [5,0,0] , [6,0,1] ,  [900,0,1] , [1001,0,0]] #val,pow2,even
labels =  ['o'     ,  'e'    , 'o'     ,  'e'    ,  'o'    ,  'e'    ,   'e'      ,  'o'] #is even

clf = tree.DecisionTreeClassifier()
clf = clf.fit(features,labels)

print (clf.predict([[203,0,0]]))

import pydot

import pydotplus
from IPython.display import Image  
dot_data = tree.export_graphviz(clf, out_file=None, 
                     feature_names=['number','pow2','even'],  
                     class_names=['o','e'],  
                     filled=True, rounded=True,  
                     special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
# Image(graph.create_png())  
graph.write_pdf("1.pdf")

决策树正确识别偶数和奇数,并且预测工作正常。

决策树基本上是这样的(pdf格式)

     is_even<=0.5
        /\
       /  \
   label1  label2

问题是这样的。label1 标记为“o”而不是“e”。但是,如果我将 class_names 放在导出函数中

class_names=['e','o']

那么,结果是正确的。我认为输出应该独立于 class_names 顺序。

我做错了什么,还是 class_names 的顺序很重要。如果后者为真,那么正确的顺序是什么(对于任意问题)

3个回答

名称应按数字升序排列。

在代码的文档中看到了这一点:

class_names : list of strings, bool or None, optional (default=None)
    Names of each of the target classes in ascending numerical order.
    Only relevant for classification and not supported for multi-output.
    If ``True``, shows a symbolic representation of the class name.

您需要做的是将标签从字符串/字符转换为数值。例如'o' = 0 和'e' = 1

所以你的标签看起来像这样

labels =  [0, 1, 0, 1, 0, 1, 1, 0]

class_names 应按数字升序匹配这些数字

0 - 'o'
1 - 'e'

class_names=['o', 'e']

如文档中所述。名称应按升序排列。

您可以检查算法使用的顺序:树的第一个框显示每个类(目标变量)的计数。类名的升序排列

# class_names : list of strings, bool or None, optional (default=None)
# Names of each of the target classes in ascending numerical order.

class_names2pass = sorted(labels.unique())
print(class_names2pass)