【问题标题】:Can sklearn DecisionTreeClassifier truly work with categorical data?sklearn DecisionTreeClassifier 真的可以处理分类数据吗?
【发布时间】:2018-06-01 02:02:54
【问题描述】:

在使用 DecisionTreeClassifier I visualized it using graphviz 时,我不得不说,令我惊讶的是,它似乎需要分类数据并将其用作连续数据。

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

【问题讨论】:

  • “第一个特征 X[0] 有 6 个可能的值 0、1、2、3、4、5”,而您的所有特征都是分类的?请发布您的数据样本,否则您的问题完全不清楚......
  • 如果还没有,请尝试将分类特征中的所有元素转换为字符串,看看是否能解决问题。
  • @desertnaut 它有 6 个类别,编码为 0、1、2、3、4、5。不过我会添加一个示例
  • @Alex sklearn DecisionTree 据我所知不接受字符串作为参数..

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


【解决方案1】:

好吧,我很惊讶,但事实证明 sklearn 的决策树确实无法处理分类数据。自 2015 年 6 月以来,此问题 (#4899) 存在一个 Github 问题,但它仍然处于打开状态(更新:它现已关闭,但在 #12866 中继续存在,因此问题仍未解决)。

正如您在此处所做的那样,将分类变量编码为整数的问题在于,它对它们施加了一个顺序,这可能有意义,也可能没有意义,具体取决于具体情况;例如,您可以将['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 部分也可能会有所帮助。

【讨论】:

  • 使用一种热编码可能会出现一些问题。不仅维度而且树深度可能比原始特征的数量更深。我还想用树进行教学,使用一种热矢量格式的数据可以与理论决策树在语义上相等,这很好,但在教学时会受到限制(特别是因为我们可以绘制树)。
  • @Eytan 你是绝对正确的,实际上这是 Github 上(仍然开放)问题的原因之一。您可能需要考虑使用其他工具,使过程对最终用户更加透明,例如 R...
  • 这里有个问题。如果您使用从 pip 安装的 sklearn 包,它会使用 dtype=category 处理分类值(在当前版本中)。但是如果你从 Conda 发行版安装,它会在调用 fit 方法时抛出错误!
  • 好吧,如果一个分类变量中有 50 个类别,那么对它们进行一次热编码是不明智的,不是吗?那你怎么处理这个案子呢?
  • @Kristada673 还有其他方法可以对分类变量进行编码,例如 BinaryEncoding。查看python包分类编码器github.com/scikit-learn-contrib/categorical-encoding
猜你喜欢
  • 2023-03-09
  • 2014-09-03
  • 2017-11-22
  • 2018-11-25
  • 2019-08-12
  • 2012-10-10
  • 2020-03-10
  • 2011-02-16
  • 2011-03-08
相关资源
最近更新 更多