sklearn DecisionTreeClassifier可以真正使用分类数据吗?
在使用DecisionTreeClassifier时,我使用graphviz对其进行了可视化,我不得不说,令我惊讶的是,它似乎需要分类数据并将其用作连续数据。
我所有的功能都是分类的,例如,您可以看到下面的树(请注意,第一个功能X [0]具有6个可能的值0、1、2、3、4、5:
从我在这里找到的类使用的树类是二叉树,因此在sklearn中是一个限制。
有人知道我缺少使用树的方法吗?(我知道这对任务不是更好,但是由于我目前需要分类,因此我在数据上使用了一个热向量)。
原始数据的样本如下所示:
f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 c1 c2 c3
0 C S O 1 2 1 1 2 1 2 0 0 0
1 D S O 1 3 1 1 2 1 2 0 0 0
2 C S O 1 3 1 1 2 1 1 0 0 0
3 D S O 1 3 1 1 2 1 2 0 0 0
4 D A O 1 3 1 1 2 1 2 0 0 0
5 D A O 1 2 1 1 2 1 2 0 0 0
6 D A O 1 2 1 1 2 1 1 0 0 0
7 D A O 1 2 1 1 2 1 2 0 0 0
8 D K O 1 3 1 1 2 1 2 0 0 0
9 C R O 1 3 1 1 2 1 1 0 0 0
其中X [0] = f1,我将字符串编码为整数,因为sklearn不接受字符串。
-
好吧,我很惊讶,但事实证明,sklearn的决策树确实无法处理分类数据。从2015年6月开始,这个问题(#4899)出现了Github问题,但是它仍然是开放的(我建议您快速浏览一下该线程,因为有些评论非常有趣)。
正如您在此处所做的那样,将分类变量编码为整数的问题在于,它对它们强加了一个 顺序 ,根据情况的不同,该 顺序
可能有意义,也可能没有意义。例如,你可以编码['low', 'medium', 'high']
的[0, 1, 2]
,因为'low' < 'medium' < 'high'
(我们称这些分类变量 序数
),但你仍然隐含作出额外的(也可能是不希望的)假设之间的距离'low'
和'medium'
与之间的距离相同'medium'
,并'high'
(在没有影响决策树,但很重要,例如在k-
nn和聚类中)。但是这种方法在诸如['red','green','blue']
或的情况下完全失败了['male','female']
,因为我们不能要求它们之间有任何有意义的相对顺序。因此,对于非常规分类变量,正确编码它们以供sklearn决策树使用的方法是使用
OneHotEncoder
模块。用户指南的“编码分类功能”部分也可能会有所帮助。