在scikit-learn中,我需要将分类变量分解为虚拟二进制字段?
例如,如果列为political-party
,且值为democrat
,republican
和green
,则对于许多算法,您必须将其分为三列其中每行只能容纳一个1
,其余行必须为0
。
这可以避免在离散[democrat, republican and green]
=>时强制执行不存在的常规。 [0, 1, 2]
,因为democrat
和green
实际上并不比另一对“更远”。
scikit-learn中的哪些算法是否必须转换为虚拟变量?对于那些没有的算法,它不会受到伤害,对吧?
答案 0 :(得分:4)
scikit-learn中的哪些算法是否必须转换为虚拟变量?对于那些没有的算法,它不会伤害,对吧?
除了基于树的方法之外,sklearn中的所有算法都需要对名义分类变量进行单热编码(也称为虚拟变量)。
对具有非常大的基数的分类特征使用虚拟变量可能会损害基于树的方法,尤其是通过在特征分割采样器中引入偏差来实现随机树方法。基于树的方法倾向于使用分类特征的基本整数编码来合理地工作。
答案 1 :(得分:0)
对于任何基于矢量化输入进行计算的算法(大多数算法,但我确定有例外),你需要做某种"矢量化"。但是,您不必按照上述方式进行操作。
由于大多数算法只关心它们被赋予一系列映射到一系列其他数字的数字,因此如果您具有该级别的粒度,通常可以用置信度替换任何二进制字段。
值得注意的是,这些不是"虚拟变量",但只是一个不同的表示。它们直接代表您的课程。要回答你的上一个问题,只有在你丢弃信息时才会受到伤害,因此将分类转换为二进制向量是完全没问题的。更具体地说:
['republican'] -> [0, 1, 0] # binary vectorization, totally fine
['republican', 'green'] -> [0, 0.5, 0.5] # non-binary vectorization, also totally fine
{'republican': 0.75, 'green': 0.25} -> [0, 1, 0] # information lost, not fine.
希望有所帮助,如果您有任何疑问,请与我联系。