sklearn随机森林可以直接处理分类功能?

hah*_*awg 46 python random-forest scikit-learn one-hot-encoding

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

['red','blue','green','orange'],

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

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

Fre*_*Foo 30

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

  • [sklearn 中处理分类特征的 one-hot 编码示例](/sf/answers/1741216081/)。 (4认同)
  • 如果这最终得到实施,十个赞许。就个人而言,我会优先考虑 Pandas Categorical 而不是普通的 numpy,但核心维护者不希望如此。 (3认同)
  • “one-hot 编码”不能以“随机森林”的正确方式处理分类数据,只需为每个类别创建任意数字,您将获得比“one-hot 编码”更好的模型,但这也不是正确的方法。您可以轻松地看到,通过使用“R”randomForest 包,它给出了完全不同的结果,并且不仅仅是“随机”方差,您可以使用“scikit-learn”达到您想要的精度,重复使用“ one-hot编码` 甚至与`R` 的 randomForest 包相差甚远。 (2认同)

den*_*son 11

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

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

Will McGinnis撰写的这篇文章对单热编码和替代方案进行了非常好的讨论.

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

  • 最近另一个值得注意的例外是 LightGBM https://lightgbm.readthedocs.io/en/latest/Features.html#optimal-split-for-categorical-features with objective='rf' (4认同)

Hem*_*lli 10

您必须将分类变量分为一系列虚拟变量.是的,我知道它很烦人,似乎没有必要,但这就是sklearn的工作原理.如果你正在使用熊猫 使用pd.get_dummies,它的效果非常好.

  • 如果在训练和推理中存在相同的唯一值,它的效果非常好,因此它不可靠. (4认同)
  • 这不仅令人烦恼,而且不是最理想的。使用虚拟变量时,随机森林的表现更差。请参阅本文[文章](https://roamanalytics.com/2016/10/28/are-categorical-variables-getting-lost-in-your-random-forests/)中的以下引用:`想象一下我们的分类变量有100 个关卡,每个关卡出现的频率与其他关卡差不多。该算法通过分割其 one-hot 编码虚拟对象之一可以期望实现的最佳效果是减少约 1% 的杂质,因为每个虚拟对象对于大约 1% 的样本来说都是“热”的。 (3认同)