【问题标题】:scikit learn creation of dummy variablesscikit学习虚拟变量的创建
【发布时间】:2014-03-18 20:53:20
【问题描述】:

在 scikit-learn 中,我需要哪些模型将分类变量分解为虚拟二进制字段?

例如,如果列是political-party,值是democratrepublicangreen,对于许多算法,您必须将其分成三列,每行只能包含一个@ 987654325@,其余的必须是0

这避免了执行离散化 [democrat, republican and green] => [0, 1, 2] 时不存在的序数,因为 democratgreen 实际上并不比另一对“更远”。

对于 scikit-learn 中的哪些算法,这种转换为虚拟变量是必要的?对于那些不是的算法,它不会受到伤害,对吧?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    对于 scikit-learn 中的哪些算法,这种转换为虚拟变量是必要的?对于那些不是的算法,它不会受到伤害,对吧?

    除了基于树的方法之外,sklearn 中的所有算法都需要对名义分类变量进行 one-hot 编码(也称为虚拟变量)。

    对具有非常大基数的分类特征使用虚拟变量可能会损害基于树的方法,尤其是在特征分割采样器中引入偏差的随机树方法。基于树的方法往往与分类特征的基本整数编码一起工作得相当好。

    【讨论】:

    • 如果我理解正确,您的意思是,由于 RF 将采用列的随机子集,它很可能会采用所有零列并错过唯一的信息(1)?有没有办法将 RF 选择/离开功能作为组而不是单个索引列?
    • 确实,这会在特征拆分中引入采样偏差,但不会出现灾难性故障,因为 RF 将继续对新特征进行采样,直到找到一个不恒定的特征(例如,并非全为零)。
    • @larsmans,ogrisel 说“使用虚拟变量......可能会伤害基于树的方法......通过引入偏差......”,但你是说使用虚拟变量可以防止偏差。你支持哪个论点?
    • @ogrisel 我不明白你的意思。根据定义,虚拟变量列永远不能是常量 0,对吗?否则 one-hot 编码不会创建该列。
    • 经过几次拆分后,到达特定节点的样本很可能都具有统一为零值的特定特征。
    【解决方案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.
    

    希望对您有所帮助,如果您还有其他问题,请告诉我。

    【讨论】:

    • 我不明白你的例子。我有兴趣将分类选项存储在尽可能小的空间中,而不是在没有的地方强制执行序数。
    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 2023-03-27
    • 2018-04-06
    • 2020-01-31
    • 1970-01-01
    • 2016-04-29
    • 2017-10-24
    • 2017-02-24
    相关资源
    最近更新 更多