当前位置: 首页 > 科技观察

停止一次性编码分类变量!你有更好的选择

时间:2023-03-22 16:09:07 科技观察

本文转载自公众号《读书芯》(ID:AI_Discovery)。单热编码(又名虚拟变量)是一种将分类变量转换为多个二进制列的方法,其中1表示存在属于该类别的行。显然,从机器学习的角度来看,它不适合编码分类变量。显然,它增加了很多维度,但总的来说,维度越少越好。例如,如果设置一列代表美国各州(如加利福尼亚州、纽约州),那么one-hot编码方案将多出50个维度。这不仅给数据集增加了很多维度,而且它实际上没有太多信息——很多0和一些1。这使得优化变得困难,特别是对于神经网络,其优化器很容易在大量空维度中输入错误的空间。更糟糕的是,每个信息稀疏列之间都存在线性关系。这意味着可以很容易地使用其他变量来预测一个变量,这会导致高维度的并行性和多重共线性问题。最好的数据集包含信息具有独立价值的特征,而单热编码会创建一个完全不同的环境。当然,如果你只有三个甚至四个类,那么one-hotencoding可能不是一个糟糕的选择。然而,根据数据集的相对大小,其他替代方案可能值得探索。目标编码可以有效地表示分类列并且只占用一个特征空间。它也称为均值编码,列中的每个值都替换为该类别的平均目标值。这允许更直接地表示分类变量和目标变量之间的关系,也是一种非常流行的技术(尤其是在Kaggle竞赛中)。这种编码方法有一些缺点。首先,它使模型更难学习均值编码变量与另一个变量之间的关系。它只能根据与目标的关系在一列中绘制相似度,这有利也有弊。这种编码方法对y变量非常敏感,会影响模型提取编码信息的能力。由于类别的每个值都被相同的数值替换,模型可能倾向于过度拟合它看到的编码值(例如,将0.8与完全不同于0.79的值相关联)。这是将连续尺度上的值视为大量重复类的结果。因此,需要仔细监测y变量是否存在异常值。为此,可以使用category_encoders库。目标编码器是一种监督方法,因此需要X和y训练集。fromcategory_encodersimportTargetEncoderenc=TargetEncoder(cols=['Name_of_col','Another_name'])training_set=enc.fit_transform(X_train,y_train)留一法编码尝试计算平均值(不包括当前行值)以补偿依赖关于y变量和值的多样性。这消除了异常值的影响并创建了更多不同的编码值。该模型不仅为每个编码类赋予了相同的值,而且还为其赋予了一个泛化能力更好的范围。可以像往常一样使用LeaveOneOutEncoder在category_encoders库中执行实现。fromcategory_encodersimportLeaveOneOutEncoderenc=LeaveOneOutEncoder(cols=['Name_of_col','Another_name'])training_set=enc.fit_transform(X_train,y_train)实现类似效果的另一种策略是向编码分数添加正态分布噪声,其中标准差是可调参数。贝叶斯目标编码是一种使用目标作为编码方法的数学方法。仅使用均值可能是一种具有欺骗性的度量,因此贝叶斯目标编码试图结合其他统计量来衡量目标变量的分布,例如其方差或偏度(高阶矩)。然后通过贝叶斯模型合并这些分布的属性,该模型能够生成一种编码,阐明类目标分布的各个方面。然而,结果很难解释。证据权重(WoE)是分类自变量和因变量之间关系的另一种细微差别观点。WoE起源于信用评分行业,用于衡量客户拖欠或偿还贷款的差异。证据权重的数学定义是优势比的自然对数,或:ln(%ofnonevents/%ofevents)WoE越高,事件发生的可能性就越大。“非事件”是不属于某个类别的事件的百分比。使用证据权重与逻辑尺度内的因变量和安全类别建立单调(永不停止朝一个方向前进)关系。WoE是“信息价值”指标的关键组成部分,该指标衡量特征对预测的影响程度。fromcategory_encodersimportWOEEncoderenc=WOEEncoder(cols=['Name_of_col','Another_name'])training_set=enc.fit_transform(X_train,y_train)这些方法是有监督的编码器,或者说是考虑到目标变量的编码方法,所以在预测任务中它们通常是更高效的编码器。但是,当需要执行无监督分析时,情况不一定如此。非线性主成分分析(NonlinearPCA)是一种处理主成分分析的方法,它可以使用分类量化来处理分类变量。这为最大化常规PCA性能(方差解释)的类找到了最佳数值。下次遇到分类变量,就别搞one-hotencoding了,有这么多方法任君选择!