在使用DecisionTreeClassifier Ivisualized 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不接受字符串。在
好吧,我很惊讶,但事实证明sklearn的决策树确实不能处理分类数据。2015年6月,关于这个问题(#4899)有一个Github问题,但它仍然是开放的(我建议您快速浏览一下这个帖子,因为有些评论非常有趣)。在
像您在这里所做的那样,将分类变量编码为整数的问题在于,它对它们施加了一个顺序,这可能是有意义的,也可能是没有意义的,这取决于大小写;例如,您可以将}之间的距离与{}之间的距离相同(在决策树中没有影响,但在k-nn和聚类中具有重要意义)。但这种方法在诸如}等情况下完全失败,因为我们不能声明它们之间有意义的相对顺序。在
['low', 'medium', 'high']
编码为[0, 1, 2]
,因为'low' < 'medium' < 'high'
(我们称这些分类变量为序数),尽管您仍然是隐式的假设'low'
和{['red','green','blue']
或{因此,对于非序数分类变量,正确编码以在sklearn的决策树中使用的方法是使用^{} 模块。用户指南中的Encoding categorical features部分也可能有帮助。在
相关问题 更多 >
编程相关推荐