不要再对类别变量进行独热编码了

时间:2022-07-24
本文章向大家介绍不要再对类别变量进行独热编码了,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

作者:Andre Ye 编译:ronghuaiyang

导读

还有很多更好的选择。

独热编码,也称为dummy变量,是一种将分类变量转换为若干二进制列的方法,其中1表示属于该类别的行。

很明显,从机器学习的角度来看,它不是分类变量编码的好选择。最明显的是它增加了大量的维数,这是常识,通常低维数是更好的。例如,如果我们要用一列表示美国的一个州(例如加利福尼亚、纽约),那么独热编码方案将会导致50个额外的维度。

它不仅给数据集增加了大量的维数,而且确实没有多少信息 —— 一大堆零中偶尔点缀着几个1。这导致了一个异常稀疏的现象,这使得它很难进行最优化。这对于神经网络来说尤其如此,它的优化器在几十个空维度的情况下很容易进入错误的优化空间。

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

最优数据集由信息具有独立价值的特征组成,而独热编码创建了一个完全不同的环境。

诚然,如果只有3个或者甚至4个类别,独热编码可能不是一个糟糕的选择,但是它可能值得探索其他选择,这取决于数据集的相对大小。

目标编码是表示分类列的一种非常有效的方法,它只占用一个特征空间。也称为均值编码,将列中的每个值替换为该类别的均值目标值。这允许对分类变量和目标变量之间的关系进行更直接的表示,这是一种非常流行的技术(尤其是在Kaggle比赛中)。

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

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

由于每个类别的值都被相同的数值所取代,模型可能会倾向于过拟合它所看到的编码值(例如,将0.8与某个与0.79完全不同的值相关联)。这是将连续尺度上的值当作重复的类来处理的结果。

因此,需要仔细监视y变量,以发现异常值等情况。

要实现这一点,请使用category_encoders库。由于目标编码器是一个受监督的方法,它需要Xy训练集。

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

Leave-one-out encoding试图通过计算平均值(不包括当前行值)来弥补对y变量的依赖以及在值方面的多样性。这将消除异常值的影响,并创建更多样化的编码值。

由于模型对每个编码类不仅给予相同的值,而且给予一个范围,因此它学会了更好地泛化。

像往常一样,可以在category_encoders库中使用LeaveOneOutEncoder实现。

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

另一个实现类似效果的策略是在编码分数中加入正态分布的噪声,其中标准偏差是一个可以调优的参数。

Bayesian Target Encoding是一种使用目标作为编码方法的数学方法。只使用平均值可能是一个欺骗的度量,所以贝叶斯目标编码试图合并目标变量的分布的其他统计度量,例如它的方差或偏度 —— 被称为‘higher moments’。

这些分布的属性然后通过贝叶斯模型合并,从而能够产生一种编码,这种编码更了解分类目标分布的各个方面。然而,其结果却难以解释。

Weight of Evidence是另一种关于分类自变量和因变量之间关系的方案。WoE 源自信用评分领域,被用来衡量违约或偿还贷款的客户之间的区别。Weight of Evidence的数学定义是比值比例的自然对数,即:

ln (% of non events / % of events)

WoE越高,事件越有可能发生。‘Non-events’是那些不属于某个类的百分比。使用Weight of Evidence因变量建立单调的关系,并在逻辑尺度上确保类别,这对于逻辑回归来说很自然。WoE是另一个度量标准 —— Information Value中的一个关键组件,IV值衡量一个特征如何为预测提供信息。

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

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

Nonlinear PCA是一种利用分类量化方法处理分类变量的主成分分析方法。这将为类别找到最佳数值,从而使常规PCA的性能(解释方差)最大化。

—END—

英文原文:https://towardsdatascience.com/stop-one-hot-encoding-your-categorical-variables-bbb0fba89809