假设我有一个分类特征,颜色,可以取值为
['红色', '蓝色', '绿色', '橙色'],
我想用它来预测随机森林中的某些内容。如果我对其进行“one-hot编码”(即将其更改为四个虚拟变量),该如何告诉sklearn这四个虚拟变量实际上是一个变量?具体而言,在随机选择不同节点要使用的特征时,它应该将红、蓝、绿和橙色的虚拟变量一起包含,或者不包含它们中的任何一个。
我听说没有方法可以做到这一点,但我想必须有一种处理分类变量的方法,而不是以数字或类似方法对其进行任意编码。
假设我有一个分类特征,颜色,可以取值为
['红色', '蓝色', '绿色', '橙色'],
我想用它来预测随机森林中的某些内容。如果我对其进行“one-hot编码”(即将其更改为四个虚拟变量),该如何告诉sklearn这四个虚拟变量实际上是一个变量?具体而言,在随机选择不同节点要使用的特征时,它应该将红、蓝、绿和橙色的虚拟变量一起包含,或者不包含它们中的任何一个。
我听说没有方法可以做到这一点,但我想必须有一种处理分类变量的方法,而不是以数字或类似方法对其进行任意编码。
没有,目前除了使用虚拟编码(one-hot encoding)之外,在scikit-learn中还没有支持分类变量的功能。有人正在working on this,可能会将补丁合并到主线上,但现在还没有支持。
sklearn.preprocessing.OneHotEncoder
类来执行独热编码操作。 - Zhiyong大多数实现随机森林(以及许多其他机器学习算法)的程序都接受分类输入,但它们要么只是自动为您编码分类特征,要么使用一种在大量类别时变得计算上难以处理的方法。
H2O是一个值得注意的例外。H2O具有非常高效的方法,可以直接处理分类数据,这通常使其比需要进行独热编码的基于树的方法更具优势。
Will McGinnis的这篇文章对独热编码和替代方法进行了非常好的讨论。
这篇文章由Nick Dingwall和Chris Potts撰写,对分类变量和基于树的学习器进行了非常好的讨论。
你需要将分类变量转换为一系列虚拟变量。这是sklearn的工作方式。
如果你正在使用pandas,可以使用pd.get_dummies
,它非常有效。
假设我们的分类变量有100个水平,每个水平出现的频率大约相同。通过在其One-Hot编码的虚拟变量之一上进行分割,算法可以期望的最佳结果是将不纯度降低约1%,因为每个虚拟变量在大约1%的样本中都是“热点”。
- James Mchugh不是这样的。 分类特征有两种类型:
注意:LabelEncoder和OnehotEncoder之间的区别:
您可以使用以下方法直接将分类变量提供给随机森林:
le=LabelEncoder()
df[col]=le.fit_transform(df[col]).astype('str')
以上代码将解决您的问题。