Python sklearn DecisionTreeClassifier真的可以处理分类数据吗?
在使用DecisionTreeClassifier时,我不得不说,令我惊讶的是,它似乎获取了分类数据,并将其用作连续数据 我的所有功能都是分类的,例如,您可以看到以下树(请注意,第一个功能X[0],有6个可能的值0、1、2、3、4、5): 从我发现的情况来看,这个类使用了一个二叉树的树类,所以这是sklearn的一个限制 任何人都知道我缺少一种分类使用树的方法吗?(我知道这对任务来说并不更好,但因为我目前需要分类,所以我在数据上使用了一个热向量) 原始数据的示例如下所示: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
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软件包分类编码器