69

假设我有一个分类特征颜色,它采用值

['红色','蓝色','绿色','橙色'],

我想用它来预测随机森林中的某些东西。如果我对其进行一次热编码(即我将其更改为四个虚拟变量),我如何告诉 sklearn 这四个虚拟变量实际上是一个变量?具体来说,当 sklearn 随机选择要在不同节点上使用的特征时,它应该包括红色、蓝色、绿色和橙色的假人,或者不应该包括任何一个。

我听说没有办法做到这一点,但我想必须有一种方法来处理分类变量,而不是将它们任意编码为数字或类似的东西。

4

5 回答 5

54

不,没有。有人正在研究这个,补丁可能有一天会合并到主线中,但是现在除了虚拟(one-hot)编码之外,scikit-learn 中不支持分类变量。

于 2014-07-12T17:01:13.260 回答
25

大多数接受分类输入的随机森林(以及许多其他机器学习算法)的实现要么只是为您自动编码分类特征,要么使用一种对于大量类别而言在计算上变得难以处理的方法。

一个值得注意的例外是 H2O。H2O 有一种非常有效的直接处理分类数据的方法,这通常使其优于需要一次性编码的基于树的方法。

Will McGinnis 的这篇文章对 one-hot-encoding 和替代方案进行了很好的讨论

Nick Dingwall 和 Chris Potts 的这篇文章对分类变量和基于树的学习器进行了很好的讨论

于 2017-03-27T05:44:31.473 回答
16

您必须将分类变量变成一系列虚拟变量。是的,我知道这很烦人,而且似乎没有必要,但这就是 sklearn 的工作方式。如果您使用的是熊猫。使用 pd.get_dummies,效果非常好。

于 2016-02-18T02:36:12.823 回答
1

也许你可以用1~4来代替这四种颜色,也就是那一列是数字而不是颜色名称。然后可以在模型中使用带有数字的列

于 2021-03-26T02:51:10.700 回答
-2

您可以使用以下方法直接将分类变量提供给随机森林:

  1. 首先使用 sklearn 标签编码器将特征类别转换为数字
  2. 其次将标签编码的特征类型转换为字符串(对象)
le=LabelEncoder()
df[col]=le.fit_transform(df[col]).astype('str')

以上代码将解决您的问题

于 2021-10-10T14:20:06.327 回答