Python sklearn DecisionTreeClassifier真的可以处理分类数据吗?

Python sklearn DecisionTreeClassifier真的可以处理分类数据吗?,python,machine-learning,scikit-learn,decision-tree,categorical-data,Python,Machine Learning,Scikit Learn,Decision Tree,Categorical Data,在使用DecisionTreeClassifier时,我不得不说,令我惊讶的是,它似乎获取了分类数据,并将其用作连续数据 我的所有功能都是分类的,例如,您可以看到以下树(请注意,第一个功能X[0],有6个可能的值0、1、2、3、4、5): 从我发现的情况来看,这个类使用了一个二叉树的树类,所以这是sklearn的一个限制 任何人都知道我缺少一种分类使用树的方法吗?(我知道这对任务来说并不更好,但因为我目前需要分类,所以我在数据上使用了一个热向量) 原始数据的示例如下所示: f1 f2 f3 f

在使用DecisionTreeClassifier时,我不得不说,令我惊讶的是,它似乎获取了分类数据,并将其用作连续数据

我的所有功能都是分类的,例如,您可以看到以下树(请注意,第一个功能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月,关于这个()存在Github问题,但它仍然是开放的(我建议您快速查看该线程,因为一些评论非常有趣)

正如您在这里所做的那样,将分类变量编码为整数的问题在于,它对它们施加了一个顺序,这可能有意义,也可能没有意义,这取决于具体情况;例如,您可以将
['low','medium','high']
编码为
[0,1,2]
,因为
'low'<'medium'
(我们将这些分类变量称为有序变量),尽管您仍然隐含地做出了额外的(可能是不希望的)假设,
'low'
'medium'
之间的距离与
'medium'
'high'
之间的距离相同(在决策树中没有影响,但在k-nn和聚类中很重要)。但这种方法在诸如“红色”、“绿色”、“蓝色”或“男性”、“女性”等情况下完全失败,因为我们不能声称它们之间存在任何有意义的相对顺序


因此,对于非顺序分类变量,正确编码以用于sklearn决策树的方法是使用该模块。用户指南的部分可能也会有所帮助。

如何“第一个功能X[0]有6个可能的值0、1、2、3、4、5”虽然您的所有功能都是分类的??请发布一个数据样本,否则您的问题就完全不清楚了……如果您还没有,请尝试将分类功能中的所有元素转换为字符串,看看这是否解决了问题。@desertnaut它有6个编码为0、1、2、3、4、5的类别。我将添加一个样本though@Alexsk据我所知,learn DecisionTree不接受字符串作为参数。使用一种热编码可能会出现一些问题。不仅维度,而且树的深度可能比原始特征的数量更深。此外,我还想使用树进行教学,使用一种热向量格式的数据与理论上的决策树很好,但在教学时有局限性(特别是因为我们可以绘制树)。@Eytan You绝对正确,事实上这是一个原因(仍然开放)Github上的问题。您可能需要考虑其他工具,使过程对最终用户更加透明,如R。这里有一个问题。如果您使用的是从pip安装的sklearn软件包,它将处理dtype=category的分类值(在当前版本中).但是如果你从Conda发行版安装,在调用fit方法时会抛出错误!!好吧,如果一个分类变量中有50个类别,对它们进行热编码是不明智的,不是吗?那么你如何处理这种情况呢?@Kristada673还有其他编码分类变量的方法,比如BinaryEncoding。请查看python软件包分类编码器