假设我有一个分类特征颜色,它采用值
['红色','蓝色','绿色','橙色'],
我想用它来预测随机森林中的某些东西。如果我对其进行一次热编码(即我将其更改为四个虚拟变量),我如何告诉 sklearn 这四个虚拟变量实际上是一个变量?具体来说,当 sklearn 随机选择要在不同节点上使用的特征时,它应该包括红色、蓝色、绿色和橙色的假人,或者不应该包括任何一个。
我听说没有办法做到这一点,但我想必须有一种方法来处理分类变量,而不是将它们任意编码为数字或类似的东西。
假设我有一个分类特征颜色,它采用值
['红色','蓝色','绿色','橙色'],
我想用它来预测随机森林中的某些东西。如果我对其进行一次热编码(即我将其更改为四个虚拟变量),我如何告诉 sklearn 这四个虚拟变量实际上是一个变量?具体来说,当 sklearn 随机选择要在不同节点上使用的特征时,它应该包括红色、蓝色、绿色和橙色的假人,或者不应该包括任何一个。
我听说没有办法做到这一点,但我想必须有一种方法来处理分类变量,而不是将它们任意编码为数字或类似的东西。
不,没有。有人正在研究这个,补丁可能有一天会合并到主线中,但是现在除了虚拟(one-hot)编码之外,scikit-learn 中不支持分类变量。
大多数接受分类输入的随机森林(以及许多其他机器学习算法)的实现要么只是为您自动编码分类特征,要么使用一种对于大量类别而言在计算上变得难以处理的方法。
一个值得注意的例外是 H2O。H2O 有一种非常有效的直接处理分类数据的方法,这通常使其优于需要一次性编码的基于树的方法。
您必须将分类变量变成一系列虚拟变量。是的,我知道这很烦人,而且似乎没有必要,但这就是 sklearn 的工作方式。如果您使用的是熊猫。使用 pd.get_dummies,效果非常好。
也许你可以用1~4来代替这四种颜色,也就是那一列是数字而不是颜色名称。然后可以在模型中使用带有数字的列
您可以使用以下方法直接将分类变量提供给随机森林:
le=LabelEncoder()
df[col]=le.fit_transform(df[col]).astype('str')
以上代码将解决您的问题