新浪新闻客户端

别再对分类变量进行独热编码!你还有更好的选择

别再对分类变量进行独热编码!你还有更好的选择
2020年09月23日 12:37 新浪网 作者 人工智能读芯术

  图源:unsplash

  独热编码(又称虚拟变量)是一种将分类变量转换为若干二进制列的方法,其中1表示存在属于该类别的行。显然,从机器学习的角度来看,它并不适合对分类变量进行编码。

  很明显,它增加了大量的维度,但通常来说,维数越小越好。例如,如果设置一个列代表美国的州(例如加利福尼亚州、纽约州)的话,那么独热编码方案将会多出50个维度。

  这样做不仅会为数据集增加大量维度,而且实际上并没有太多信息——大量0中零散分布着几个1。这使得优化难以进行,对于神经网络来说尤其如此,其优化器在大量的空白维度中很容易进入错误的空间。

  更糟糕的是,每个信息稀疏列之间都具有线性关系。这意味着一个变量可以很容易地使用其他变量进行预测,从而可能导致高维的并行性和多重共线性问题。

  最佳数据集包含了信息具有独立价值的特征,而独热编码可创建一个完全不同的环境。当然,如果只有三个或甚至四个类,那么独热编码可能并不是一个糟糕的选择。不过根据数据集的相对大小,其他的替代方法有可能值得一探。

  目标编码可以有效表示分类列,而且仅占用一个特征空间。它也称为均值编码,该列中的每个值都被该类别的平均目标值代替。这样可以更直接地表示分类变量和目标变量之间的关系,并且这也是一种非常流行的技术(尤其是在Kaggle比赛中)。

  这种编码方法有一些缺点。首先,它使模型更难以学习均值编码变量和另一个变量之间的关系。它只能根据它与目标的关系在在列中绘制相似性,这有利有弊。

  这种编码方法对y变量非常敏感,会影响模型提取编码信息的能力。

  由于该类别的每个值都被相同的数值替换,因此该模型可能会趋于过拟合它所看到的编码值(例如,将0.8与完全不同于0.79的值相关联)。这是将连续规模上的值视为严重重复的类处理的结果。因此,需要仔细监控y变量是否存在异常值。

  为实现这一目的,可以使用category_encoders库。目标编码器是一种受监督的方法,因此需要X和y训练集。

  from category_encoders importTargetEncoder                  enc =TargetEncoder(cols=['Name_of_col','Another_name'])                  training_set = enc.fit_transform(X_train, y_train)

  留一法编码(Leave-one-out encoding)试图通过计算平均值(不包括当前行值)来弥补对y变量和值多样性的依赖。这使异常值的影响趋于平稳,并创建了更多不同的编码值。

  模型不仅为每个编码的类提供了相同的值,还为其提供了一个范围,可以更好地进行泛化。可以像往常一样使用LeaveOneOutEncoder在category_encoders库中执行实现。

  from category_encoders importLeaveOneOutEncoder                   enc =LeaveOneOutEncoder(cols=['Name_of_col','Another_name'])                   training_set = enc.fit_transform(X_train, y_train)

  实现类似效果的另一种策略是将正态分布的噪声添加到编码分数中,其中标准偏差是可以调整的参数。

  贝叶斯目标编码(Bayesiantarget encoding)是一种将目标用作编码方法的数学方法。仅使用均值可能是一种欺骗性度量,因此贝叶斯目标编码试图结合使用其他统计量来衡量目标变量的分布,例如其方差或偏度(highermoments)。

  然后,通过贝叶斯模型合并这些分布的属性,该模型能够产生一种编码,这种编码可以更清楚类别目标分布的各个方面。但是,结果却难以解释。

  证据权重(WoE)是对分类自变量与因变量之间关系的另一种细微看法。WoE源自信用评分行业,用于衡量拖欠或偿还贷款的客户之间的差别。证据权重的数学定义是优势比的自然对数,或:

  ln (% of non events / % of events)

  WoE越高,事件发生的可能性就越大。“Non-events”是指那些不属于某个类的事件所占的百分比。使用证据权重与因变量建立单调(永不停止朝一个方向发展)关系,并在逻辑尺度范围内确保类别。WoE是“信息价值”指标的关键组成部分,该指标用于衡量功能如何为预测提供信息。

  from category_encoders importWOEEncoder                  enc =WOEEncoder(cols=['Name_of_col','Another_name'])                  training_set = enc.fit_transform(X_train, y_train)

  这些方法是监督编码器,或者是考虑目标变量的编码方法,因此在预测任务中它们通常是更有效的编码器。但是,当需要执行无监督分析时,就并不一定是这种情况了。

  非线性PCA(Nonlinear PCA)是一种处理主成分分析的方法,可以通过使用分类量化来处理分类变量。这样可以找到类别的最佳数值,从而使常规PCA的性能(解释的方差)最大化。

  下次遇到分类变量别再进行独热编码啦,这么多种方法任君挑选!

特别声明:以上文章内容仅代表作者本人观点,不代表新浪网观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与新浪网联系。
权利保护声明页/Notice to Right Holders

举报邮箱:jubao@vip.sina.com

Copyright © 1996-2024 SINA Corporation

All Rights Reserved 新浪公司 版权所有