可以通过sklearn DecisionTreeClassifier真正使用分类数据吗?

时间:2017-12-18 17:18:45

标签: machine-learning scikit-learn decision-tree categorical-data

在使用DecisionTreeClassifier I visualized 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不接受字符串。

1 个答案:

答案 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部分也可能有所帮助。