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

发布于 2021-01-29 17:02:04

在使用DecisionTreeClassifier时,我使用graphviz对其进行了可视化,我不得不说,令我惊讶的是,它似乎需要分类数据并将其用作连续数据。

我所有的功能都是分类的,例如,您可以看到下面的树(请注意,第一个功能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不接受字符串。

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    好吧,我很惊讶,但事实证明,sklearn的决策树确实无法处理分类数据。从2015年6月开始,这个问题(#4899)出现了Github问题,但是它仍然是开放的(我建议您快速浏览一下该线程,因为有些评论非常有趣)。

    正如您在此处所做的那样,将分类变量编码为整数的问题在于,它对它们强加了一个 顺序 ,根据情况的不同,该 顺序
    可能有意义,也可能没有意义。例如,你可以编码['low', 'medium', 'high'][0, 1, 2],因为'low' < 'medium' < 'high'(我们称这些分类变量 序数
    ),但你仍然隐含作出额外的(也可能是不希望的)假设之间的距离'low''medium'与之间的距离相同'medium',并'high'(在没有影响决策树,但很重要,例如在k-
    nn和聚类中)。但是这种方法在诸如['red','green','blue']或的情况下完全失败了['male','female'],因为我们不能要求它们之间有任何有意义的相对顺序。

    因此,对于非常规分类变量,正确编码它们以供sklearn决策树使用的方法是使用OneHotEncoder模块。用户指南的“编码分类功能”部分也可能会有所帮助。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看