读芯术|别再对分类变量进行独热编码!你还有更好的选择
全文共2365字 , 预计学习时长6分钟
本文插图
图源: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的性能(解释的方差)最大化 。
本文插图
下次遇到分类变量别再进行独热编码啦 , 这么多种方法任君挑选!
本文插图
留言点赞关注
我们一起分享AI学习与发展的干货
如转载 , 请后台留言 , 遵守转载规范
【读芯术|别再对分类变量进行独热编码!你还有更好的选择】本文为***作者原创 , 未经授权不得转载
推荐阅读
- 小龙虾|三农探析:池塘养殖小龙虾如何高产?高产养殖技术全解析
- 别再买坚果零食吃了,自己在家就能做,酥脆香甜,没有一点苦涩味!
- 剩米饭别再炒了,试试这样做,比蛋炒饭好吃一百倍
- 虾别再煮着吃了,我换种做法外酥里嫩,老公一口气干掉一盘,佩服
- 烙饼时,别再用凉水和开水了,用它,又软又香还出层,放凉也不硬
- 豆腐别再下锅炸,加上两个鸡蛋,吃着比肉还香,吃一次就忘不了
- 早餐别再出去买,教你做懒人早餐饼,5分钟就上桌,上班族的最爱
- 西葫芦别再炒着吃了,做成馅饼更营养,好吃还不贵,简单又易做!
- 腰椎间盘突出症|经常腰痛,可能与哪些疾病有关?别再拖下去了
- 春天,五花肉别再做红烧肉了,试试此做法,肥而不腻,真下饭
