sklearn随机森林能直接处理分类特征吗?
假设我有一个分类特征,颜色,它的值是:
['红色', '蓝色', '绿色', '橙色']。
我想用这个特征在随机森林中进行预测。如果我对它进行独热编码(也就是把它变成四个虚拟变量),那么我该如何告诉sklearn这四个虚拟变量其实是一个变量呢?具体来说,当sklearn在不同的节点随机选择特征时,它应该要么一起包含红色、蓝色、绿色和橙色这四个虚拟变量,要么一个都不包含。
我听说没有办法做到这一点,但我想应该有办法处理分类变量,而不是随便把它们编码成数字之类的。
6 个回答
0
也许你可以用1到4这几个数字来替代这四种颜色,也就是说在那一列里用数字而不是颜色名称。然后,带有数字的那一列就可以在模型中使用了。
2
不可以。
分类特征有两种类型:
- 有序的(Ordinal):使用 OrdinalEncoder
- 无序的(Cardinal):使用 LabelEncoder 或 OnehotEncoder
注意:LabelEncoder 和 OnehotEncoder 的区别:
- LabelEncoder:只适用于一列数据 => 通常我们用它来编码标签列(也就是目标列)
- OnehotEncoder:适用于多列数据 => 可以一次处理更多的特征
15
你需要把分类变量转换成一系列的虚拟变量。这就是sklearn的工作方式。
如果你在使用pandas,可以用 pd.get_dummies
,这个方法效果很好。
32
大多数随机森林的实现(还有很多其他机器学习算法)在处理分类输入时,要么就是在帮你自动转换这些分类特征,要么就是用一种在类别数量很大时变得非常复杂的方法。
一个特别的例子是H2O。H2O有一种非常高效的方法,可以直接处理分类数据,这通常让它在需要进行独热编码的树模型中占据优势。
Will McGinnis写的这篇文章对独热编码和其他替代方法进行了很好的讨论。
Nick Dingwall和Chris Potts的这篇文章对分类变量和基于树的学习器进行了很好的讨论。
68
不,目前没有这个功能。有人正在努力开发这个功能,未来可能会合并到主版本中,但现在在scikit-learn里,除了使用虚拟变量(也叫做独热编码)之外,暂时不支持分类变量。