数据分析最重要的 3 种特征编码,你真的能分清楚?
对于数据处理的新手来说,你可能听说过:标签编码、特征编码、独热编码 等类似的概念
但是在用的时候却不知道什么时候用哪个,彻底混为一谈
归根结底,还是对概念混淆了,或者你当时看的帖子就是错的,被误导了。
其实这样的错误帖子很多,csdn、博客园,一抓一大把,被误导也很正常
误导了没关系,忘掉错误的,从头开始就行
ok,let's go
首先
需要明确一点,在大多数模型算法中,对于数值型数据,可以直接拿来训练模型。
但是对于类别型特征,算法不能把字符数据像数值数据一样构成数组矩阵,所以模型会直接报错。
这种情况的处理也很容易,使用下面几种方法进行简单的特征转换即可。
这么说你可能不是很理解,举个例子:
现在有一个用户数据集,其中用户字段包括:身高、学历、性别、婚姻状态、等级、收入等,预通过这些用户字段 去预测该用户是否会发生逾期行为
用户字段里面除了身高和收入,其他都是类别型特征,如下:
一般情况下,我们是这样转换的:
是否逾期:是 转换为 1、否 转换为 0
性别特征:男 转换为 1、女 转换为 0
....
所以,在 sklearn 中,提供了下面几种方法用来实现这样的转换:
▶第一种:LabelEncoder
LabelEncoder 能够将分类特征转换为分类数值,使用起来也很简单
直接看代码:
from sklearn.preprocessing import LabelEncoder
# 读入数据
df_data = pd.read_csv("数据.csv", encoding='gbk')
df_data_2 = df_data.copy()# 特征转换
le = LabelEncoder()
df_data_2['是否逾期_fit'] = le.fit_transform(df_data['是否逾期'])
df_data_2['性别_fit'] = le.fit_transform(df_data['性别'])
文中的代码用到了 fit_transform 函数,不清楚用法的点这篇,讲的很透彻了:做数据处理,你连 fit、transform、fit_transform 都分不清?
转换后的效果如下:
可以看到,此种方法只能一次转换一个特征,这个比较 适合于标签列 进行特征转换
像上面的需要转换的特征比较多的情况,可以用第二种方法
▶第二种:OrdinalEncoder
OrdinalEncoder 可以实现同样的功能,而且可以批量
直接看代码:
from sklearn.preprocessing import LabelEncoder, OrdinalEncoderdf_data_3 = df_data.copy()
# 特征转换
df_data_3['是否逾期'] = le.fit_transform(df_data['是否逾期'])
df_data_3[['学历', '性别', '婚姻状态', '等级']] = OrdinalEncoder().fit_transform(df_data[['学历', '性别', '婚姻状态', '等级']])
转换后的效果如下:
怎么样,是不是觉得上面这种方法转换起来是不是更快一些?
快是快,但是,上面这种方法存在本质上的错误!
首先,我们转换的目的是为了让算法在训练模型的时候,能够将类别型特征量化,然后转换成特征矩阵进行计算等操作
但是,实际上,你将性别转换为 0 和 1,对于算法来说,1 和 0 是可以进行计算的
将学历转换为 1、2、3、4、5,算法会认为 3 对应的学历是 1 的 3倍。
事实上,我们知道,性别男和女是不可达的,本身就互斥的概念不能通过数值算出来,学历你总不能说 5个小学学历=1个硕士学历 吧?
类似的特征还有:颜色、等级、邮编 等,都不可以直接用上面的方式进行转换
正确的方式是这样的:
对了性别特征:用两列表示,男性列+女性列
对于婚姻状态特征:也是两列,已婚列+未婚列
....
对应的处理效果是这样的:
在 sklearn 中,可以用第三种方法实现这样的特征转换
▶第三种:OneHotEncoder
OneHotEncoder:独热编码,可以通过创建哑变量的方式进行特征转换。
代码如下:
from sklearn.preprocessing import OneHotEncoderdf_data_4 = df_data.copy()
# 特征转换-独热编码
df_data_onehot = OneHotEncoder().fit_transform(df_data[['学历', '性别', '婚姻状态']])
df_data_onehot.toarray()
转换后的效果如下:
最终是一个二维数组的形式,之后需要进一步的将二维数组转换为 DataFrame,然后和原始的 DataFrame 进行合并,并且删除原特征。
这一步有一个 更简单、高效 的方法:使用 Pandas 的 get_dummies 函数
# 独热编码
df_data_dummies = pd.get_dummies(df_data[['性别', '婚姻状态', '学历']].head(5))
df_data_dummies
转换后的效果是一样的:
▶小技巧
上面三种方法针对的特征转换都是特征 1V1,或者 1V多 的场景。
如果是需要将 多个类别值 转换成 1个 特征 呢?
比如在 泰坦尼克号生还者预测 里面,乘客姓名中的称呼就可以作为乘客的 title 进行转换。
例如:
Miss、Mlle、Ms、Mme 为一个等级
Col、Major、Capt 为一个等级
Master、Don、Dona、Countess、Jonkheer 为一个等级
根据不同称呼将乘客映射为不同的等级,这种处理方式能极大的提高模型预测的正确率。
对应的代码可以这样写:
title_mapping = {'Mr': 1, 'Miss': 2, 'Mlle': 2, 'Ms': 2, 'Mrs': 2, 'Mme': 2,'Rev': 3, 'Dr': 3, 'Col': 4, 'Major': 4, 'Capt': 4,'Master': 5, 'Don': 5, 'Dona': 5, 'Lady': 5, 'Countess': 5, 'Jonkheer': 5, 'Sir': 5,}
# 对 title 信息进行转换
df_data['TitleType'] = df_data['Title'].map(title_mapping)
本文总结
今天的文章比较简单,稍微总结一下:
特征转换一共有三种方式,分别是:LabelEncoder、OrdinalEncoder 和 OneHotEncoder
其中,第一种方式适合标签列,将 是/否、好客户/坏客户 等类别标签进行数值转换
第二种方式适合特征列,将可以量化的特征,如:年龄、重量、长度、温度等特征进行批量数值转换
第三种方式适合特征列,将无法量化、不能用数值代表内在含义的特征进行独热编码。
另外还介绍了如何将 多V1 的数值进行转换操作。
最后,本文中用到的数据集也比较简单,需要的同学可以直接下载练练手
链接:https://pan.baidu.com/s/14wi199hcbnrp5tvO91F5DQ
提取码:1025
推荐阅读
误执行了rm -fr /*之后,除了跑路还能怎么办?!
程序员必备58个网站汇总
大幅提高生产力:你需要了解的十大Jupyter Lab插件
数据分析最重要的 3 种特征编码,你真的能分清楚?相关推荐
- 大数据分析的方法有几种?
大数据分析的方法有几种?大数据分析六种方法:数字和趋势.维度分解.用户分群.转化漏斗.行为轨迹.留存分析.看数字及趋势是最基础进行展示相关数据管理信息的方法,对于谁符合一定的行为或背景资料,分类处理用 ...
- CCF CSP 2019-9-1 小明种苹果 C语言100分
CCF CSP 2019-9-1 小明种苹果 C语言100分 小明种苹果 完成时间11-18 16:54 代码长度510B C 正确 100分 耗时93ms 空间使用6.167MB 这道题简单,仅附上 ...
- 集群分为几种,用的软件分别是什么?
集群分为几种,用的软件分别是什么? 补充:涉及的组件 1.1.apache 跨平台的网页服务器,主要使用它做静态资源服务器,也可以做代理服务器转发请求 1.2.ngnix 高性能的 HTTP和反向代理 ...
- 异常数据4种剔除方法_数据分析系列 22/32 | 9种常用的数据分析方法
要使各种结构化的.非结构化的.海量的数据实现标准化.信息化,能够提供业务绩效评估.业务决策支持等要求,我们首先需要进行数据分析. 同时,围绕业务问题,采用合适的分析方法,分析模型,以及分析工具,这是数 ...
- 企业如何选择数据分析架构?——谈谈3种架构的利弊
作者:燕飞 Kyligence 大数据老司机,拥有超过15年的大数据/数据仓库领域从业经验,对大数据/数据仓库的建设规划.架构设计.技术体系.方法论及主流厂商的产品和解决方案,均有深入的研究和实践. ...
- Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)
本文已在公众号 " 数据分析与商业实践 " 首发.关注一下~,更多商业数据分析案例源码等你来撩.后台回复 "异常值" ,即可获取本文的案例示范与包含详细注释的源 ...
- 写给数据分析入门者:一种通用的数据分析思路
数据分析是一个庞大的工程,有的时候过于抽象且依赖经验.本文是笔者对学习和实践数据分析的一个总结,希望提供一种通用的数据分析思路,并在分析思路的每个步骤中介绍相关的分析算法及其应用场景,对于算法只做浅层 ...
- 2022年10大最流行的数据分析工具,掌握3种算你厉害
目录 1.SAS BA 2.QlikView 3.Board 4.Splunk 5.Sisense 6.Microstrategy 7.KNIME 8.Dundas BI 9.TIBCO Spotfi ...
- 大尺度数据分析方法之间的一种比较
[原文] A Comparison of Approaches to Large-Scale Data Analysis [作者] Andrew Pavlo Brown University p ...
最新文章
- 深入理解Spring系列之六:bean初始化
- java pca资料整理
- 深度学习入门课程学习笔记06 反向传播
- Product Master data in C4C and data exchange with CRM via PI
- 6款国内外SNS开源软件 搭建社交网站利器
- 用node.js读写文件
- java mysql大小写_MySQL大小写敏感的解决方案
- Node做网页爬虫时遇到的Html entites对象造成乱码
- EDI Party Resolution in Biztalk R2
- NOIP2008pj luoguP1058 立体图 模拟
- SQL学习笔记之游标
- 什么是长连接 | 短连接?
- Java进阶诀窍httpwww.china-pub.com44147
- 入门 HTML JavaScript Jquery学习回顾 有小案例
- 如何将旧手机soul聊天记录导入到新手机中
- 基于html+css+javascript+jquery+bootstarp响应式网页设计——大理我的家乡旅游景点
- 怎么把中文用户名改成英文?
- Java程序员 面试如何介绍项目经验? Java程序员应该如何介绍自己的项目经验和自我介绍?面试如何突出自己
- 一套打通 Github 搜索语法
- 抢占1000万辆级别市场风口,这家国产Tier 1定点车型已超20款
热门文章
- 关于graphviz绘制的点(dot)图在显示时中文乱码问题的解决方法(亲测)
- Redis的Errorlog或者启动日志(错误日志)的配置
- Git的fatal: Not a git repository (or any parent up to mount point /home)
- 数据查找matlab,MATLAB:使用矢量化查找已排序数据的统计信息
- CRMEB Dockerfile文件
- html 按下和松开事件,利用JQuery实现一个键盘按下与松开触发事件
- python import 文件路径_python之import子目录文件
- unity中单位是米还是厘米_2019-08-22Unity中的单位长度与像素之间的关系
- vue搜索好友_Vue实现类似通讯录功能(中)
- 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导