专栏首页凹凸玩数据pandas:数据离散化与离散化数据的后期处理(one-hot)

pandas:数据离散化与离散化数据的后期处理(one-hot)

大家好,我是黄同学

今天跟大家聊聊数据离散化与离散化数据的后期处理。

1、什么是数据离散化?

连续属性的离散化,就是将连续属性的值域划分为若干个离散的区间。

最后用不同的符号或整数值,代表每个子区间的属性值。

2、为什么要进行数据离散化?

  数据离散化可以有效的降低时间复杂度和内存开销。

  对于某些机器学习算法来说,像决策树、随机森林、朴素贝叶斯。他们的数据集大多数都是针对的离散型数据。因此做出有效的数据离散化,对于降低计算复杂度和提高算法准确率有很重要的影响。

  离散型数据更容易理解。针对收入字段,一个人是3000,一个人是20000。如果将收入看成一个连续型变量,对于这么多数字,我们需要通过数字层面的比较才能知道,谁属于高薪,谁属于低薪,看起来并不直观。如果将收入转换为离散化数据类型(低薪、中薪、高薪),就能够很清楚的看出原始数字的含义。

  离散化后的特征对异常数据有很强的鲁棒性:对于年龄这个特征,如果年龄>30是1,否则0。假如特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰。

更多数据离散化的内容,可以参考如下文章:https://zhuanlan.zhihu.com/p/91181935

3、怎么进行数据离散化?

  对于获取到的数据集,会有很多个特征,也就是我们常说的字段。有的特征是连续性数据类型,有的数据本身就是离散型数据变量。

  已经是离散型数据变量,我们不用管。但是对于连续性数据变量,如果需要进行数据离散化,应该怎么办?

1)pd.cut()和pd.qcut()的参数说明

  • qcut():表示自动分组,一般用的不太多。
  • cut():表示自定义分组,这个用的最多。
  • 语法:pd.cut(x, bins=, labels=, right=, )
  • x表示一个序列(列表、Series等),也就是我们想要离散化的数据类型。
  • bins在定义分组的时候,可以传入一个序列,进行自定义分组。
  • labels表示给每个分组起别名。
  • right=False表示左闭右开区间。默认是right=True表示左开右闭区间。
  • pd.cut()一般会与value_counts()进行搭配使用,用于统计每个分组的个数。

2)pd.cut()和pd.qcut()的使用说明

① pd.qcut()的使用说明

x = [165,174,160,180,159,163,192,184]
s = pd.Series(x,index=["NO1:165","NO1:174","NO1:160","NO1:180",\
                       "NO1:159","NO1:163","NO1:192","NO1:184"])
s_qcut = pd.qcut(s,3)
print(s_qcut)

结果如下:

② pd.cut()的使用说明

x = [165,174,160,180,159,163,192,184]
s = pd.Series(x,index=["NO1:165","NO1:174","NO1:160","NO1:180",\
                       "NO1:159","NO1:163","NO1:192","NO1:184"])
s_cut = pd.cut(s,bins=[150,165,180,195])
print(s_cut)

# 添加labels参数后
x = [165,174,160,180,159,163,192,184]
s = pd.Series(x,index=["NO1:165","NO1:174","NO1:160","NO1:180",\
                       "NO1:159","NO1:163","NO1:192","NO1:184"])
s_cut = pd.cut(s,bins=[150,165,180,195],labels=["低","中","高"])
print(s_cut)

# 添加right参数后
x = [165,174,160,180,159,163,192,184]
s = pd.Series(x,index=["NO1:165","NO1:174","NO1:160","NO1:180",\
                       "NO1:159","NO1:163","NO1:192","NO1:184"])
s_cut = pd.cut(s,bins=[150,165,180,195],labels=["低","中","高"],right=False)
print(s_cut)

结果如下:

3)pd.cut()配合value_counts()使用

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False

x = [165,174,160,180,159,163,192,184]
s = pd.Series(x,index=["NO1:165","NO1:174","NO1:160","NO1:180",\
                       "NO1:159","NO1:163","NO1:192","NO1:184"])
s_cut = pd.cut(s,bins=[150,165,180,195],labels=["低","中","高"],right=False)
count = s_cut.value_counts()
print(count)

count.plot(kind="bar")
plt.xticks(rotation=360)

结果如下:

4、离散化数据的后期处理(one-hot编码)

  不管是连续性数据变量,还是离散型数据编码,都是数据的一个特征,都有它独特的含义。但是对于离散型数据编码,一般展现出来的是文本字符串,我们虽然认识,但是机器不认识,因此在处理这些数据的时候,就需要将其变成数字。

  比如说,我们有这样两组数据。一组数据代表的是性别,一组数据代表的是物种,另外一组数据代表的是毛发。

如下所示:

从图中可以看出。对于性别来说,不是男、就是女,一般的处理方式都是采取二值编码,即“男=1”,“女=0”。对于物种来说,有很多个物种,图中我们采取的是1,2,3…这种格式的编码。对于毛发来说,我们采取的也是1,2,3…这种格式的编码。

  但是很显然不太合适,对于性别、物种来说,采用图中的编码方式,很显然3>2>1>0,计算机会将这样的数字会等效看代,因为存在着一种大小关系。但是对于毛发、学历来说,采用这种编码方式,却是可以的,因此毛发有多有少,学历有高有低,因此不同的数字大小,表示等级的不同。

  因此,我们需要使用one-hot编码处理一下,最终效果如下:

1)pd.get_dummies(data,prefix=)的使用

  • data表示数组、Series或DataFrame。
  • prefix表示给分组加前缀。

① data传入一个Series

x = [165,174,160,180,159,163,192,184]
s = pd.Series(x,index=["NO1:165","NO1:174","NO1:160","NO1:180",\
                       "NO1:159","NO1:163","NO1:192","NO1:184"])
s_cut = pd.cut(s,bins=[150,165,180,195],labels=["低","中","高"])
print(s_cut)
pd.get_dummies(s_cut)

结果如下:

② data传入一个DataFrame

df = pd.DataFrame({"性别":["男","女","男"],
                   "物种":["主","狗","猫"]})
print(df)
pd.get_dummies(df)

结果如下:

本文分享自微信公众号 - 凹凸数据(alltodata),作者:黄伟呢

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 破解大众点评的字体加密,这一篇就够了。

    之前写过一篇最火的文章,《中国撸串指北:13万家烧烤店的吃货最爱》,就属于第一种。

    朱小五
  • matplotlib绘图技巧详解(一)

    我们之前已经讲述了matplotlib的绘图原理,陆续会更新绘图技巧、相关图形绘制。

    朱小五
  • R可视化 | 地理信息空间(下)

    张杰.《R语言数据可视化之美-专业图表绘制指南(增强版)》第11章 地理空间型图表: https://www.cnblogs.com/zzj420133722/...

    朱小五
  • 模糊测试(fuzzing)是什么

    大学时两个涉及“模糊”的概念自己感觉很模糊。一个是学数据库出现的“模糊查询”,后来逐渐明白是指sql的like语句;另一个是学专业课时出现的“模糊测试”。

    小老鼠
  • eclipse tomcat下网页修改不生效

    大家打开eclipse JavaEE新建一个动态网页工程(File,new,project,web,Dynamic Web Project)。新建一个html静...

    似水的流年
  • eclipse tomcat下网页修改不生效

    大家打开eclipse JavaEE新建一个动态网页工程(File,new,project,web,Dynamic Web Project)。新建一个html静...

    似水的流年
  • eclipse tomcat下网页修改不生效

    大家打开eclipse JavaEE新建一个动态网页工程(File,new,project,web,Dynamic Web Project)。新建一个html静...

    似水的流年
  • 前端学习 第2周 第4天

    Joel
  • Flask模板

    在模板中{{ variable }}结构表示变量,是一种特殊的占位符,告诉模板引擎这个位置的值,从渲染模板时使用的数据中获取;Jinja2除了能识别基本类型的变...

    py3study
  • 实在是妙啊!Java中强软虚弱引用,居然还能这样去操作

    ThreadLocal 在什么情况下可能发生内存泄漏?如果你想清楚这个问题的来龙去脉,看源码是必不可少的,看了源码之后你发现, ThreadLocal 中用到 ...

    Java程序猿阿谷

扫码关注云+社区

领取腾讯云代金券