scikit learn 创建虚拟变量
在scikit-learn这个库里,哪些模型需要把分类变量转换成虚拟二进制字段呢?
举个例子,如果有一列叫做 political-party
,里面的值是 democrat
(民主党)、republican
(共和党)和 green
(绿党),那么对于很多算法来说,你需要把这一列拆成三列,每一行只能有一个 1
,其他的都要是 0
。
这样做的目的是为了避免把 [democrat, republican and green]
这种分类简单地转成 [0, 1, 2]
,因为其实 democrat
和 green
之间并没有“距离”上的差别。
那么在scikit-learn中,哪些算法需要这种虚拟变量的转换呢?对于那些不需要的算法,使用这种转换也没坏处,对吧?
2 个回答
对于任何基于向量输入进行计算的算法(大多数算法都是这样,虽然可能有例外),你需要进行某种形式的“向量化”。不过,你不一定要按照你之前说的那种方式来做。
因为大多数算法只关心你给他们一系列数字,并把这些数字映射到另一系列数字,所以如果你有足够的细节,通常可以用置信度来替代任何二进制字段。
值得注意的是,这些并不是“虚拟变量”,而只是另一种表示方式。它们直接代表了你的分类。回答你最后一个问题,只有在你丢弃信息的时候才会有负面影响,所以把分类转换成二进制向量是完全可以的。为了更具体一点:
['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.
希望这能帮到你,如果还有其他问题,随时问我。
在scikit-learn中,哪些算法需要将变量转换为虚拟变量?对于那些不需要的算法,使用虚拟变量也没坏处,对吧?
在sklearn中,除了基于树的方法,几乎所有的算法都需要对名义型分类变量进行独热编码(也叫虚拟变量)。
对于具有非常大类别数的分类特征,使用虚拟变量可能会对基于树的方法造成影响,特别是随机树方法,因为这会在特征分割时引入偏差。基于树的方法通常对分类特征的基本整数编码效果还不错。