在scikit-learn中,我需要哪些模型将分类变量分解为虚拟二进制字段?
例如,如果列是political-party
,值是democrat
, republican
和green
,对于许多算法,您必须将其分成三列,每行只能容纳一个1
,其余的必须是0
。
这避免了在离散[democrat, republican and green]
=> [0, 1, 2]
时不存在的有序性,因为democrat
和green
实际上并不比另一对"更远"。
在scikit-learn中,哪些算法需要转换成虚拟变量?而对于那些不是这样的算法,也不会有什么坏处,对吧?
在scikit-learn中,哪些算法需要转换成虚拟变量?而对于那些不是这样的算法,也不会有什么坏处,对吧?
除了基于树的方法外,sklearn中的所有算法都需要对名义分类变量进行单热编码(也称为虚拟变量)。
对于基数非常大的分类特征使用虚拟变量可能会损害基于树的方法,特别是随机树方法,因为它在特征分割采样器中引入了偏差。基于树的方法对于分类特征的基本整数编码往往工作得相当好。
对于任何基于向量化输入进行计算的算法(大多数是这样,但我相信也有例外),您将需要进行某种"向量化"。然而,你不必按照上面解释的方式去做。
由于大多数算法只关心它们被给定的一系列数字映射到一系列其他数字,如果你有这种粒度级别,你通常可以用置信度替换任何二进制字段。
同样值得注意的是,这些不是"虚拟变量",而只是不同的表示。它们直接表示你的类。回答你的最后一个问题,它只会在你丢弃信息时造成伤害,所以将分类转换为二进制向量是完全可以的。更具体地说:
['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.
希望这对你有帮助,如果你还有什么问题,请告诉我。