sklearn DecisionTreeClassifier能否真正处理分类数据?

2024-10-01 07:25:17 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用DecisionTreeClassifier Ivisualized it using graphviz时,我不得不说,令我吃惊的是,它似乎采用了分类数据并将其用作连续数据。在

我的所有特性都是分类的,例如,您可以看到以下树(请注意,第一个特性X[0]有6个可能值0、1、2、3、4、5: enter image description here 根据我发现的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不接受字符串。在


Tags: 数据方法字符串here分类it特性sklearn
1条回答
网友
1楼 · 发布于 2024-10-01 07:25:17

好吧,我很惊讶,但事实证明sklearn的决策树确实不能处理分类数据。2015年6月,关于这个问题(#4899)有一个Github问题,但它仍然是开放的(我建议您快速浏览一下这个帖子,因为有些评论非常有趣)。在

像您在这里所做的那样,将分类变量编码为整数的问题在于,它对它们施加了一个顺序,这可能是有意义的,也可能是没有意义的,这取决于大小写;例如,您可以将['low', 'medium', 'high']编码为[0, 1, 2],因为'low' < 'medium' < 'high'(我们称这些分类变量为序数),尽管您仍然是隐式的假设'low'和{}之间的距离与{}之间的距离相同(在决策树中没有影响,但在k-nn和聚类中具有重要意义)。但这种方法在诸如['red','green','blue']或{}等情况下完全失败,因为我们不能声明它们之间有意义的相对顺序。在

因此,对于非序数分类变量,正确编码以在sklearn的决策树中使用的方法是使用^{}模块。用户指南中的Encoding categorical features部分也可能有帮助。在

相关问题 更多 >