在使用DecisionTreeClassifier I visualized it using graphviz时,我不得不说,令我惊讶的是,它似乎需要分类数据并将其用作连续数据。
我的所有功能都是分类的,例如您可以看到以下树(请注意,第一个功能X [0]有6个可能的值0,1,2,3,4,5: 从我发现的here开始,该类使用的是一个二叉树树类,因此它是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不接受字符串。
答案 0 :(得分:5)
嗯,我感到很惊讶,但事实证明,sklearn的决策树确实无法处理分类数据。从2015年6月开始就有一个Github问题(#4899),但它仍然是开放的(我建议你快速浏览一下这个帖子,因为有些评论非常有趣)。
将分类变量编码为整数的问题,正如您在此处所做的那样,它会对它们强加 order ,根据具体情况,它可能有意义也可能没有意义;例如,您可以将['low', 'medium', 'high']
编码为[0, 1, 2]
,因为'low' < 'medium' < 'high'
(我们将这些分类变量称为序数),尽管您仍在隐式地添加其他内容(和可能不受欢迎的假设'low'
和'medium'
之间的距离与'medium'
和'high'
之间的距离相同(在决策树中没有影响,但重要性如在k-nn和聚类)。但是这种方法在['red','green','blue']
或['male','female']
等情况下完全失败,因为我们不能在它们之间声明任何有意义的相对顺序。
因此,对于非序数分类变量,正确编码它们以便在sklearn的决策树中使用的方法是使用OneHotEncoder
模块。用户指南的Encoding categorical features部分也可能有所帮助。