机器学习中最常使用的10种数据编码方式
大家好,在机器学习中,很多算法都需要我们对分类特征进行转换(编码)。
为了方便讲解,下面创建示例DataFrame
数值型数据
让我们先来讨论连续型数据的转换,也就是根据Score
列的值,来新增一列标签,即如果分数大于90,则标记为A,分数在80-90标记为B,以此类推。
自定义函数 + 循环遍历
首先当然是最简单,最笨的方法,自己写一个函数,并用循环遍历,那肯定就是一个def
加一个for
df1 = df.copy()def myfun(x):if x>90:return 'A'elif x>=80 and x<90:return 'B'elif x>=70 and x<80:return 'C'elif x>=60 and x<70:return 'D'else:return 'E'df1['Score_Label'] = None
for i in range(len(df1)):df1.iloc[i,3] = myfun(df1.iloc[i,2])
这段代码,相信所有人都能看懂,简单好想但比较麻烦
有没有更简单的办法呢?pandas
当然提供了很多高效的操作的函数,继续往下看。
自定义函数 + map
现在,可以使用map
来干掉循环(虽然本质上也是循环)
df2 = df.copy()def mapfun(x):if x>90:return 'A'elif x>=80 and x<90:return 'B'elif x>=70 and x<80:return 'C'elif x>=60 and x<70:return 'D'else:return 'E'df2['Score_Label'] = df2['Score'].map(mapfun)
结果是同样的
自定义函数 + apply
如果还想简洁代码,可以使用自定义函数 + apply来干掉自定义函数
df3 = df.copy()
df3['Score_Label'] = df3['Score'].apply(lambda x: 'A' if x > 90 else ('B' if 90 > x >= 80 else ('C' if 80 > x >= 70 else ('D' if 70 > x >= 60 else 'E'))))
结果和上面是一致的,只不过这么写容易被打。
使用 pd.cut
现在,让我们继续了解更高级的pandas
函数,依旧是对 Score
进行编码,使用pd.cut
,并指定划分的区间后,可以直接帮你分好组
df4 = df.copy()
bins = [0, 59, 70, 80, 100]
df4['Score_Label'] = pd.cut(df4['Score'], bins)
也可以直接使用labels
参数来修改对应组的名称,是不是方便多了
df4['Score_Label_new'] = pd.cut(df4['Score'], bins, labels=['low', 'middle', 'good', 'perfect'])
使用 sklearn 二值化
既然是和机器学习相关,sklearn
肯定跑不掉,如果需要新增一列并判定成绩是否及格,就可以使用Binarizer
函数,代码也是简洁好懂
df5 = df.copy()
binerize = Binarizer(threshold = 60)
trans = binerize.fit_transform(np.array(df1['Score']).reshape(-1,1))
df5['Score_Label'] = trans
文本型数据
下面介绍更常见的,对文本数据进行转换打标签。例如新增一列,将性别男、女分别标记为0、1
使用 replace
首先介绍replace
,但要注意的是,上面说过的自定义函数相关方法依旧是可行的
df6 = df.copy()
df6['Sex_Label'] = df6['Sex'].replace(['Male','Female'],[0,1])
上面是对性别操作,因为只有男女,所以可以手动指定0、1,但要是类别很多,也可以使用pd.value_counts()
来自动指定标签,例如对Course Name
列分组
df6 = df.copy()
value = df6['Course Name'].value_counts()
value_map = dict((v, i) for i,v in enumerate(value.index))
df6['Course Name_Label'] = df6.replace({'Course Name':value_map})['Course Name']
使用map
额外强调的是,新增一列,一定要能够想到map
df7 = df.copy()
Map = {elem:index for index,elem in enumerate(set(df["Course Name"]))}
df7['Course Name_Label'] = df7['Course Name'].map(Map)
使用astype
这个方法应该很多人不知道,这就属于上面提到的知乎问题,能实现的方法太多了
df8 = df.copy()
value = df8['Course Name'].astype('category')
df8['Course Name_Label'] = value.cat.codes
使用 sklearn
同数值型一样,这种机器学习中的经典操作,sklearn
一定有办法,使用LabelEncoder
可以对分类数据进行编码
from sklearn.preprocessing import LabelEncoder
df9 = df.copy()
le = LabelEncoder()
le.fit(df9['Sex'])
df9['Sex_Label'] = le.transform(df9['Sex'])
le.fit(df9['Course Name'])
df9['Course Name_Label'] = le.transform(df9['Course Name'])
一次性转换两列也是可以的
df9 = df.copy()
le = OrdinalEncoder()
le.fit(df9[['Sex','Course Name']])
df9[['Sex_Label','Course Name_Label']] = le.transform(df9[['Sex','Course Name']])
使用factorize
最后,再介绍一个小众但好用的pandas
方法,我们需要注意到,在上面的方法中,自动生成的Course Name_Label
列,虽然一个数据对应一个语言,因为避免写自定义函数或者字典,这样可以自动生成,所以大多是无序的。
如果我们希望它是有序的,也就是 Python
对应 0
,Java
对应1
,除了自己指定,还有什么优雅的办法?这时可以使用factorize
,它会根据出现顺序进行编码
df10 = df.copy()
df10['Course Name_Label'] = pd.factorize(df10['Course Name'])[0]
结合匿名函数,我们可以做到对多列进行有序编码转换
df10 = df.copy()
cat_columns = df10.select_dtypes(['object']).columnsdf10[['Sex_Label', 'Course Name_Label']] = df10[cat_columns].apply(lambda x: pd.factorize(x)[0])
总结
至此,我要介绍的十种pandas
数据编码的方法就分享完毕,代码拿走修改变量名就能用,关于这个问题如果你有更多的方法,可以在评论区进行留言。
推荐文章
李宏毅《机器学习》国语课程(2022)来了
有人把吴恩达老师的机器学习和深度学习做成了中文版
上瘾了,最近又给公司撸了一个可视化大屏(附源码)
如此优雅,4款 Python 自动数据分析神器真香啊
梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学
香的很,整理了20份可视化大屏模板
技术交流
欢迎转载、收藏、有所收获点赞支持一下!
目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
- 方式①、发送如下图片至微信,长按识别,后台回复:加群;
- 方式②、添加微信号:dkl88191,备注:来自CSDN
- 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
机器学习中最常使用的10种数据编码方式相关推荐
- 【机器学习】交叉验证详细解释+10种常见的验证方法具体代码实现+可视化图
[机器学习]交叉验证详细解释+10种常见的验证方法具体代码实现+可视化图 一.使用背景 由于在训练集上,通过调整参数设置使估计器的性能达到了最佳状态:但在测试集上可能会出现过拟合的情况. 此时,测试集 ...
- 逆境中激励员工士气的10种方法
逆境中激励员工士气的10种方法 如果你是主管,心里正想着要召集部属全员到齐,然后训示:"各位,现在是我们必须齐心协力的时刻否则我们就要经营不下去了."那你最好三思.再三思-- 现在 ...
- 苹果6s照相快门声音设置_手机隐藏的10种快门启动方式,你都知道吗?
上次我们讲了相机设置--手机照片尺寸的设置(错过的朋友可以在本文文末点击阅读)今天我们要来讲讲相机设置中的第二课「快门设置」.今天讲的快门设置不是我们以往说的设置"快门速度",而是 ...
- 10种创新方式 | 教你尝试用多种创新构筑企业护城河
在当今的数字化经济中,竞争护城河最经常来自创新的力量.企业如何从哪里着手创新?厌倦了把时间浪费在创新集思会议,抑或改善现有的产品也改变不了增长?发明并不总是导致创新.德勤的创新咨询Doblin团队提出 ...
- html中img显示图片的两种常用方式
html中img显示图片的两种常用方式 显示图片,尤其是二维码的时候,大都是自动生成的,所以就需要能够从后台返回字符串,前台浏览器进行解析.好了,下面是这两种方式. 1. <img src=&q ...
- ABAQUS中Cohesive粘聚力模型的2种定义方式(附案例操作步骤)
附赠仿真学习包,包含结构.流体.电磁.热仿真等多学科视频教程,点击领取: 仿真秀粉丝专属礼包 导读:大家好,我是仿真秀专栏作者-烧仙草.消费电子行业仿真,擅长胶材等材料的本构模型研究和构建 ...
- 思科新版EI CCIE 企业网软定义中的VxLAN分布式网关两种部署方式
思科新版EI CCIE 企业网软定义中的VxLAN分布式网关两种部署方式VXLAN集中式网关部署的不足:第一,同一二层网关下跨子网的数据中心三层流量都需要经过集中三层网关转发.第二,由于采用了集中三层 ...
- 在PyTorch中使用Logistic回归进行10种猴子物种分类
欢迎关注 "小白玩转Python",发现更多 "有趣" 引言 本文提供了一个使用PyTorch构建一个非常基本的 Logistic模型的简单步骤,并将其应用于猴 ...
- 从COVID-19大流行中汲取哪些教训?10种方法帮CIO预防下一次危机
导读:以下这些从COVID-19大流行中汲取的经验教训,可以帮助IT领导者和TI经理为下一次紧急情况做好准备. 您的IT团队准备好应对COVID-19大流行了吗?您的网络可以一次使用VPN处理所有员工 ...
- 激活层是每一层都有吗_我心目中最值得栽种的10种藤本月季,每一种都很优秀,你喜欢吗...
我是从2015年开始接触藤本月季,当时藤本还比较贵,一株好一点的苗要二三十块,而且花市没有,都要从网上购买,一不小心就会买到小白花.截止目前,栽种过的藤本月季品种至少也有50种以上了,但真正保留下来的 ...
最新文章
- [T-ARA][Bo Peep Bo Peep]
- python五十:反射
- eclipse工程 'cocostudio/CocoStudio.h' file not found
- Office - 安装程序找不到office.zh-cn\*.文件
- python颜色相关系数_python相关系数 - osc_w6qmyr6s的个人空间 - OSCHINA - 中文开源技术交流社区...
- JVM常见垃圾收集器
- linux 安装onos 记录
- csv文件的常用方法--持续更新
- pkcs1与pkcs8格式RSA私钥互相转换
- 基于R语言的聚类分析
- JavaScript字符串的长度
- java 计算正态分布_使用Java计算正态分布
- el-dialog 圆角 白边问题
- 接上篇手工课 材料:美女图片一张, 要求将其制成 边旋转边渐隐的魔幻图片
- SDL游戏开发之四-卡马克卷轴
- 股市逃顶的技巧和方法
- 他们为国效力40年,不如Angelababy发呆1天
- sql server 整数转换成小数,并保留小数点后两位
- signature=66ee059bbdb9aa026cf4962f2fe679a7,a00896.html
- Overview of the TREC-2011 Microblog Track