对于数据处理的新手来说,你可能听说过:标签编码、特征编码、独热编码 等类似的概念

但是在用的时候却不知道什么时候用哪个,彻底混为一谈

归根结底,还是对概念混淆了,或者你当时看的帖子就是错的,被误导了。

其实这样的错误帖子很多,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 种特征编码,你真的能分清楚?相关推荐

  1. 大数据分析的方法有几种?

    大数据分析的方法有几种?大数据分析六种方法:数字和趋势.维度分解.用户分群.转化漏斗.行为轨迹.留存分析.看数字及趋势是最基础进行展示相关数据管理信息的方法,对于谁符合一定的行为或背景资料,分类处理用 ...

  2. CCF CSP 2019-9-1 小明种苹果 C语言100分

    CCF CSP 2019-9-1 小明种苹果 C语言100分 小明种苹果 完成时间11-18 16:54 代码长度510B C 正确 100分 耗时93ms 空间使用6.167MB 这道题简单,仅附上 ...

  3. 集群分为几种,用的软件分别是什么?

    集群分为几种,用的软件分别是什么? 补充:涉及的组件 1.1.apache 跨平台的网页服务器,主要使用它做静态资源服务器,也可以做代理服务器转发请求 1.2.ngnix 高性能的 HTTP和反向代理 ...

  4. 异常数据4种剔除方法_数据分析系列 22/32 | 9种常用的数据分析方法

    要使各种结构化的.非结构化的.海量的数据实现标准化.信息化,能够提供业务绩效评估.业务决策支持等要求,我们首先需要进行数据分析. 同时,围绕业务问题,采用合适的分析方法,分析模型,以及分析工具,这是数 ...

  5. 企业如何选择数据分析架构?——谈谈3种架构的利弊

    作者:燕飞 Kyligence 大数据老司机,拥有超过15年的大数据/数据仓库领域从业经验,对大数据/数据仓库的建设规划.架构设计.技术体系.方法论及主流厂商的产品和解决方案,均有深入的研究和实践. ...

  6. Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)

    本文已在公众号 " 数据分析与商业实践 " 首发.关注一下~,更多商业数据分析案例源码等你来撩.后台回复 "异常值" ,即可获取本文的案例示范与包含详细注释的源 ...

  7. 写给数据分析入门者:一种通用的数据分析思路

    数据分析是一个庞大的工程,有的时候过于抽象且依赖经验.本文是笔者对学习和实践数据分析的一个总结,希望提供一种通用的数据分析思路,并在分析思路的每个步骤中介绍相关的分析算法及其应用场景,对于算法只做浅层 ...

  8. 2022年10大最流行的数据分析工具,掌握3种算你厉害

    目录 1.SAS BA 2.QlikView 3.Board 4.Splunk 5.Sisense 6.Microstrategy 7.KNIME 8.Dundas BI 9.TIBCO Spotfi ...

  9. 大尺度数据分析方法之间的一种比较

    [原文] A Comparison of Approaches to Large-Scale Data Analysis [作者] Andrew Pavlo  Brown University   p ...

最新文章

  1. 深入理解Spring系列之六:bean初始化
  2. java pca资料整理
  3. 深度学习入门课程学习笔记06 反向传播
  4. Product Master data in C4C and data exchange with CRM via PI
  5. 6款国内外SNS开源软件 搭建社交网站利器
  6. 用node.js读写文件
  7. java mysql大小写_MySQL大小写敏感的解决方案
  8. Node做网页爬虫时遇到的Html entites对象造成乱码
  9. EDI Party Resolution in Biztalk R2
  10. NOIP2008pj luoguP1058 立体图 模拟
  11. SQL学习笔记之游标
  12. 什么是长连接 | 短连接?
  13. Java进阶诀窍httpwww.china-pub.com44147
  14. 入门 HTML JavaScript Jquery学习回顾 有小案例
  15. 如何将旧手机soul聊天记录导入到新手机中
  16. 基于html+css+javascript+jquery+bootstarp响应式网页设计——大理我的家乡旅游景点
  17. 怎么把中文用户名改成英文?
  18. Java程序员 面试如何介绍项目经验? Java程序员应该如何介绍自己的项目经验和自我介绍?面试如何突出自己
  19. 一套打通 Github 搜索语法
  20. 抢占1000万辆级别市场风口,这家国产Tier 1定点车型已超20款

热门文章

  1. 关于graphviz绘制的点(dot)图在显示时中文乱码问题的解决方法(亲测)
  2. Redis的Errorlog或者启动日志(错误日志)的配置
  3. Git的fatal: Not a git repository (or any parent up to mount point /home)
  4. 数据查找matlab,MATLAB:使用矢量化查找已排序数据的统计信息
  5. CRMEB Dockerfile文件
  6. html 按下和松开事件,利用JQuery实现一个键盘按下与松开触发事件
  7. python import 文件路径_python之import子目录文件
  8. unity中单位是米还是厘米_2019-08-22Unity中的单位长度与像素之间的关系
  9. vue搜索好友_Vue实现类似通讯录功能(中)
  10. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导