前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >不要再对类别变量进行独热编码了

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

作者头像
石晓文
发布于 2020-09-07 09:07:49
发布于 2020-09-07 09:07:49
2.4K00
代码可运行
举报
文章被收录于专栏:小小挖掘机小小挖掘机
运行总次数:0
代码可运行

作者:Andre Ye 编译:ronghuaiyang

导读

还有很多更好的选择。

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

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

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

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

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

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

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的数学定义是比值比例的自然对数,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ln (% of non events / % of events)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ApiBoot:《SpringBoot》整合组件接口服务框架落地解决方案
ApiBoot是一款基础的接口服务框架的整合,开箱即用,对于接口服务的开发者而言可以很大的提高开发效率,之前在SpringBoot系列文章内也有很多同学让我出一个整合的示例,这个也可以当做结合我编写的文章的示例来看,每个版本的迭代都会把之前文章的内容加入进去,当然也会有很多的扩展,让使用者运用自如。
恒宇少年
2019/03/19
5030
接口服务落地解决方案ApiBoot 2.1.6/2.2.1.RELEASE版本发布
ApiBoot是接口服务的落地解决方案,提供了一系列开箱即用的组件,通过封装来简化主流第三方框架的集成,从而提高开发者开发效率、学习成本、降低入门门槛,真正的实现开箱即用!!!
恒宇少年
2019/12/19
4070
OAuth2使用Redis来存储客户端信息以及AccessToken
使用Redis来存储OAuth2相关的客户端信息以及生成的AccessToken是一个不错的选择,Redis与生俱来的的高效率、集群部署是比较出色的功能,如果用来作为服务认证中心的数据存储,可以大大的提高响应效率。
恒宇少年
2019/12/19
2.6K0
ApiBoot 官网发布 - 为接口服务而生
ApiBoot是一款基于SpringBoot1.x,SpringBoot2.x的接口服务集成基础框架,内部提供了框架的封装集成、使用扩展、自动化配置等,让接口开发者可以选着性完成开箱即用,不再为搭建接口框架而犯愁,从而极大的提高开发效率。
恒宇少年
2019/06/05
9000
ApiBoot 2.0.8.RELEASE 版本发布
ApiBoot是一款基于SpringBoot1.x,SpringBoot2.x的接口服务集成基础框架,内部提供了框架的封装集成、使用扩展、自动化配置等,让接口开发者可以选着性完成开箱即用,不再为搭建接口框架而犯愁,从而极大的提高开发效率。
恒宇少年
2019/05/29
7220
Api组件化解决方案:ApiBoot 2.1.0.RELEASE发布
ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调用者快速集成组件,降低学习、使用门槛,提高开发效率。
恒宇少年
2019/07/01
5080
ApiBoot发布2.1.4-RC1版本,修复无法拉取jar到本地问题
ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调用者快速集成组件,降低学习、使用门槛,提高开发效率。
恒宇少年
2019/08/20
4880
ApiBoot 2.1.3.RELEASE发布,支持Logging Admin 界面管理
ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调用者快速集成组件,降低学习、使用门槛,提高开发效率。
恒宇少年
2019/08/16
5030
ApiBoot 2.1.3.RELEASE发布,支持Logging Admin 界面管理
ApiBoot 2.0.7.RELEASE 版本发布
ApiBoot是一款基于SpringBoot1.x,SpringBoot2.x的接口服务集成基础框架,内部提供了框架的封装集成、使用扩展、自动化配置等,让接口开发者可以选着性完成开箱即用,不再为搭建接口框架而犯愁,从而极大的提高开发效率。
恒宇少年
2019/05/15
4630
ApiBoot 2.0.5.RELEASE 版本发布
GitHub Wiki:https://github.com/hengboy/api-boot/wiki 码云 Wiki:https://gitee.com/hengboy/api-boot/wikis
恒宇少年
2019/05/08
4240
使用ApiBoot Logging进行统一管理请求日志
ApiBoot Logging通过集成minbox-logging来进行管理每一次请求的日志信息,包含头信息、参数、主体内容、路径、发生的服务器相关信息等,根据接口的响应状态还可以记录响应的头信息、响应的内容以及发生异常时的堆栈信息。
恒宇少年
2019/10/18
6610
使用ApiBoot Logging进行统一管理请求日志
基于ApiBoot的前后分离演示脚手架诞生了~
ApiBoot发布到目前为止已经9个月的时光了,在这段时间内有过热泪迎面、有过沮丧、也有过无从下手的感觉,坚持开源是我作为程序员的愿景,尽我所能,继续坚持!!!
恒宇少年
2020/01/15
3890
基于ApiBoot的前后分离演示脚手架诞生了~
Api架构奥义:ApiBoot实现零代码整合Spring Security & OAuth2
接口服务的安全性一直是程序员比较注重的一个问题,成熟的安全框架也比较多,其中一个组合就是Spring Security与OAuth2的整合,在ApiBoot内通过代码的封装、自动化配置实现了自动化整合这两大安全框架。
恒宇少年
2019/11/13
6570
使用Swagger2作为文档来描述你的接口信息
接口文档在前后分离的项目中是必不可少的一部分,文档的编写一直以来都是一件头疼的事情,写程序不写注释、不写文档这几乎是程序员的通病,Swagger2的产生给广大的程序员们带来了曙光,只需要在接口类或者接口的方法上添加注解配置,就可以实现文档效果,除了可以应用到单体应用,在微服务架构中也是可以使用的,只需要整合zuul就可以实现各个服务的文档整合。
恒宇少年
2019/12/20
5190
使用Swagger2作为文档来描述你的接口信息
ApiBoot v2.3.x分支第一个版本发布,重构源码架构设计
ApiBoot 是接口服务的落地解决方案,提供了一系列开箱即用的组件,通过封装来简化主流第三方框架的集成,从而提高开发者开发效率、学习成本、降低入门门槛,真正的实现开箱即用!!!
恒宇少年
2020/07/23
3480
ApiBoot v2.3.x分支第一个版本发布,重构源码架构设计
ApiBoot - ApiBoot Swagger 使用文档
ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接口开发者可以选着性完成开箱即用, 不再为搭建接口框架而犯愁,从而极大的提高开发效率。
恒宇少年
2019/04/09
4980
SpringCloud核心技术 | 初识SpringCloud微服务解决方案
最近这几个月文章更新处于停滞状态,因为公司的事情比较多,公司系统一直处于高速的迭代更新阶段, 尽管如此,我这段时间也一直在整理接下来要更新的文章大纲以及知识点的梳理,希望在后续的文章更新中能给这段时间关注我的朋友以及将要关注我的朋友帮助。
恒宇少年
2018/09/20
5930
SpringCloud核心技术 | 初识SpringCloud微服务解决方案
Swagger2怎么整合OAuth2来在线调试接口?
Swagger2作为侵入式文档中比较出色的一员,支持接口认证的在线调试肯定是不在话下的,当我们在调用OAuth2所保护的接口时,需要将有效的AccessToken作为请求Header内Authorization的值时,我们才拥有了访问权限,那么我们在使用Swagger在线调试时该设置AccessToken的值呢? 本文所需ApiBoot相关链接:
恒宇少年
2019/12/26
1.2K0
Swagger2怎么整合OAuth2来在线调试接口?
SpringBoot核心技术:Actuator自定义节点路径 & 监控服务自定义配置
路径都是一样的,很容易就会暴露出去,导致信息泄露,发生一些无法估计的事情,如果我们可以自定义节点的映射路径或者自定义监控服务的管理信息,这样就不会轻易的暴露出去,Actuator已经为了们提供了对应的方法来解决这个问题,下面我们来看下吧。
恒宇少年
2018/11/29
1.1K0
ApiBoot Logging使用RestTemplate透传链路信息
在上一篇文章【ApiBoot Logging使用SpringCloud Openfeign透传链路信息】中我们详细的讲解了ApiBoot Logging整合SpringCloud通过Openfeign进行透传链路信息,包括traceId(链路编号)、parentSpanId(上级单元编号)等信息。 ApiBoot Logging不仅仅可以使用Openfeign传递链路信息,还支持RestTemplate方式,本篇文章来详细的讲解下具体的使用方式。
恒宇少年
2019/11/11
5300
推荐阅读
相关推荐
ApiBoot:《SpringBoot》整合组件接口服务框架落地解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验