假设我有一个分类特征color,它的值为
['红','蓝','绿','橙'],
,我想用它来预测随机森林中的一些东西。如果我对它进行one-hot编码(即我将其更改为四个虚拟变量),我如何告诉sklearn这四个虚拟变量实际上是一个变量?具体来说,当sklearn随机选择在不同节点上使用的特征时,它应该包括红色、蓝色、绿色和橙色的假人,或者不包括任何一个。
我听说没有办法做到这一点,但我想一定有一种方法来处理分类变量,而不需要将它们任意编码为数字或类似的东西。
没有。有人在做这个工作,补丁可能会在某一天被合并到主线中,但是现在scikit-learn中除了dummy (one-hot)编码之外不支持分类变量。
大多数接受分类输入的随机森林(以及许多其他机器学习算法)的实现要么只是为你自动编码分类特征,要么使用一种对大量类别来说在计算上变得难以处理的方法。
一个明显的例外是H2O。H2O有一种非常有效的方法来直接处理分类数据,这通常使它比需要一次热编码的基于树的方法有优势。
Will McGinnis的这篇文章很好地讨论了单热编码和替代方法。
Nick Dingwall和Chris Potts的这篇文章对分类变量和基于树的学习器进行了很好的讨论。
您必须将分类变量转换为一系列虚拟变量。这就是sklearn的工作原理。
如果您使用的是pandas,请使用pd.get_dummies
,它的效果非常好。
No。分类特征有两种:
- 序数:使用OrdinalEncoder
- 基数:使用LabelEncoder或OnehotEncoder
注意:LabelEncoder &OnehotEncoder:
- 标签:仅用于一列=>通常我们用它来对标签进行编码列(即目标列)
- Onehot: for multiple columns =>可以同时处理更多的功能
也许你可以用1~4来代替这四种颜色,也就是说,在那一列是数字而不是颜色名。然后带number的列可以用于模型
您可以使用以下方法直接将分类变量输入随机森林:
- 首先使用sklearn标签编码器将特征类别转换为数字
- 第二,将标签编码的特征类型转换为字符串(对象)
le=LabelEncoder()
df[col]=le.fit_transform(df[col]).astype('str')
以上代码将解决您的问题