今天是pandas数据处理专题第7篇文章,可以点击上方专辑查看往期文章。

在上一篇文章当中我们介绍了对dataframe进行排序以及计算排名的一些方法,在今天的文章当中我们来了解一下dataframe两个非常重要的功能——离散化和one-hot。

离散化

离散对应的反面是连续,离散化也就是将连续性的数值映射到一个离散的值。举个很简单的例子,比如说现在有一个特征是用户的收入,我们都知道贫富差距是非常巨大的,一个马云的收入顶的上成千上万人收入之和。而最穷的人收入非常少,甚至每天不到一美元。

我们来设想一下,假设我们将收入这个值作为特征放入模型,会发生什么。如果是线性模型,很显然模型会被这个特征值给带跑偏。我们来看下线性回归的公式:,这里的W表示的样本矩阵X的系数向量。假设某一维是收入,那么它对应的系数显然必须非常非常小,因为样本当中有马云这种顶级大佬的收入存在,也就是说为了拟合这样的极端数据,模型被带跑偏了。

这种情况非常多,因为现实生活当中很多数据的分布是非常不均匀的。往往不是正态分布而是二八分布,甚至更加两极分化。那针对这种情况该怎么处理呢?

比较简单也比较常用的一种方法就是将它离散化,将原本连续的值映射成离散的变量。比如说收入,我们不再直接用收入这个值来作为特征,而是将它分成几个桶,比如分为低收入群体,中等收入群体,高收入群体。这样对模型训练来说,就不会被带偏了,但是缺点是损失了部分信息。比如说马云和东哥都是高收入群体,但是两人的挣钱能力其实还是相差蛮远的。如果采用这种方式就体现不出来了,所以离散化的设计也不是拍脑门的,也要根据实际情况具体分析。

那么假设我们希望在dataframe当中做这样离散化的操作,应该怎么办呢?

其实非常简单,pandas的开发人员早就想到了这个需求,有现成且成熟的api可以使用。我们来看个例子,首先我们创建一批数据,表示一批用户的年收入:

income = [2000, 10000, 150000, 8000, 20000, 30000, 50000, 1000000, 20000000, 300000000]

然后我们再人为的设置分桶用来对收入进行划分:

bins = [0, 30000, 100000, 10000000, 1000000000]

之后我们只需要调用pandas当中的cut方法,将income和bins数组都传入就可以了:

pandas返回的结果是Categorical的对象,表示一种类别。像是(0, 30000]既是这个分桶的值的范围,也表示这个分桶的名字。我们也可以自己传入我们定义的分桶名称来替换这个范围:

这里要注意我们传入的labels的数量要比bins也就是划分范围少一个,因为划分的区间是半闭半开的,区间的数量是bins-1,所以我们指定的labels数量也应该是bins-1。在默认的划分方法当中,采用的是左开右闭区间,和我们常用的左闭右开区间不同,我们可以通过right=False这个参数将它设置成左闭右开区间。

在使用cut的过程当中,如果我们希望按照值的范围来进行均等划分的话,我们也可以传入我们希望划分的分桶数量代替bins,这样pandas会根据这一列值的范围按照指定的数量进行均分进行划分:

如果是采用均等划分,想要对划分的精度进行限定,可以通过precision参数进行限定。比如说我们希望精度保留两位小数,那么传入precision=2即可。

离散化的方法除了cut之外,还有一个叫做qcut,和cut不同之处在于qcut是根据分位数进行划分的。比如我们希望忽视具体的数值,按照数据的数量进行等分,就需要用到qcut了。

除了传入想要得到的划分数量之外,我们也可以指定想要划分的分位数,是0到1之间的小数,包含端点:

one-hot

one-hot也是机器学习当中非常非常常用的一种数据处理方式,one-hot这个词乍看不是很明白,也有地方翻译成独热码,也很费解。其实它的含义很简单,就是将一系列非数值型的值进行类别分桶,

我们举个很简单的例子,假设我们把男生分为三种:高富帅、矮矬穷和理工男,我们现在有4个男生:[高富帅、矮矬穷、理工男、高富帅],这显然是一个特征,但问题是大部分模型是不接受字符串类型的特征的,我们必须将它转化成数值才行。问题就在转化这里,我们很难做这个映射。

有人会说我们可以让高富帅、矮矬穷这些标签对应不同的数值,做一个映射不就可以了吗?比如说矮矬穷等于1,高富帅等于2,这样一映射不就变成数值了吗?很可惜不行,原因也很简单,因为我们单纯地把它们映射成数值之后,它们就从一个抽象的概念变成数了。抽象的概念之间是没有大小关系也没有倍数关系的,但是数值有。比如说高富帅等于2,矮矬穷等于1,那在模型当中是否一个高富帅等于两个矮矬穷?是否高富帅大于矮矬穷?

这些额外的信息对模型是非常致命的,我们不希望模型得到这些信息。最好的方法是我们生成一个列表,列表当中有三列分别是高富帅、矮矬穷和理工男。你是高富帅就高富帅那一列为1,其他列都为0,同理你是矮矬穷就矮矬穷那一列为1,其他列为0。在这个列表当中每一行只有一列为1,其他都为0,相当于只有一列热,其他列都是冷的,one-hot就是这么来的。

我们噼里啪啦说了很多,但实际上one-hot的实现非常简单,只有一行:

pd.get_dummies(dataframe)

默认得到的列表的名称会加上这一列的列名作为前缀,我们也可以自己通过prefix传入我们想要的前缀:

多列一起进行one-hot也没有关系:

总结

离散化和one-hot都是非常常用的功能, 一般来说这两个功能通常会连在一起使用,先将某一个值进行离散化,然后再将离散化的结果进行one-hot,从而适应模型。因此本文的内容非常实用,不要错过哦。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

- END -

原文链接,求个关注

数据处理 | pandas入门专题——离散化与one-hot的更多相关文章

  1. Python 数据处理库 pandas 入门教程

    Python 数据处理库 pandas 入门教程2018/04/17 · 工具与框架 · Pandas, Python 原文出处: 强波的技术博客 pandas是一个Python语言的软件包,在我们使 ...

  2. < 利用Python进行数据分析 - 第2版 > 第五章 pandas入门 读书笔记

    <利用Python进行数据分析·第2版>第五章 pandas入门--基础对象.操作.规则 python引用.浅拷贝.深拷贝 / 视图.副本 视图=引用 副本=浅拷贝/深拷贝 浅拷贝/深拷贝 ...

  3. 利用Python进行数据分析——pandas入门

    利用Python进行数据分析--pandas入门 基于NumPy建立的 from pandas importSeries,DataFrame,import pandas as pd 一.两种数据结构 ...

  4. 利用python进行数据分析之pandas入门

    转自https://zhuanlan.zhihu.com/p/26100976 目录: 5.1 pandas 的数据结构介绍5.1.1 Series5.1.2 DataFrame5.1.3索引对象5. ...

  5. jQuery快速入门专题

    jQuery入门专题 本人博客特点:最高重要等级为*****(五红星),依次减少代表重要性相对较低! 一.jQuery简介 jQuery 是一个 JavaScript的一个库,也就是说jQuery是基 ...

  6. 利用python进行数据分析--pandas入门2

    随书练习,第五章  pandas入门2 # coding: utf-8 # In[1]: from pandas import Series,DataFrame import pandas as pd ...

  7. 利用python进行数据分析--pandas入门1

    随书练习,第五章  pandas入门1 # coding: utf-8 # In[1]: from pandas import Series, DataFrame # In[2]: import pa ...

  8. pandas 入门(3)

    from pandas import Series, DataFrame, Index import numpy as np # 层次化索引 对数据重塑和分组操作很有用 data = Series(n ...

  9. SpringBoot之基础入门-专题一

    SpringBoot之基础入门-专题一 一.Spring介绍 1.1.SpringBoot简介 在初次学习Spring整合各个第三方框架构建项目的时候,往往会有一大堆的XML文件的配置,众多的dtd或 ...

随机推荐

  1. PHP fclose() 函数

    定义和用法 fclose() 函数关闭打开的文件. 该函数如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 fclose(file) 参数 描述 file 必需.规定要关闭的文件. 实例 ...

  2. PHP fnmatch() 函数

    定义和用法 fnmatch() 函数根据指定的模式来匹配文件名或字符串. 语法 fnmatch(pattern,string,flags) 参数 描述 pattern 必需.规定要检索的模式. str ...

  3. luogu 6046 纯粹容器 期望dp

    LINK:纯粹容器 一道比较不错的期望题目. 关键找到计算答案的方法. 容易发现对于每个点单独计算答案会好处理一点. 暴力枚举在第k轮结束统计情况 然后最后除以总方案数即可. 考虑在第k轮的时候结束 ...

  4. Spring学习总结(8)-接口多个实现类的动态调用

    需求描述:当一个接口有2个以上的实现类时,调用方需要根据参数选择只其中一个实现类 Spring版本:5.1.8.RELEASE 1. 接口和实现类 /** * 接口 */ public interfa ...

  5. 使用Flask开发简单接口(2)--POST请求接口

    今天我们继续学习如何使用Flask开发POST接口:用户注册接口和用户登录接口. request接收参数 当我们在页面发出一个POST请求,请求传到服务器时,需要如何拿到当前请求的数据呢?在Flask ...

  6. 授人以渔:stm32资料查询技巧

    摘要:本章以stm32f103作为案例向大家讲解arm公司和st公司的关系以及我们在对stm32开发时需要如何正确的查找手册. ARM公司和ST公司的关系 这里要从一块芯片的生产说起,比如我们要生成一 ...

  7. OO第一单元(前四周)作业总结

    OO第一单元(前四周)作业总结 OO第一单元(前四周)作业总结要求(第四次作业) 0.前言 本次博客针对的是本人学习Java的第一阶段的三次作业的作业总结 第一次作业的内容是:7-1 计算税率 (20 ...

  8. [深度学习] Pytorch(三)—— 多/单GPU、CPU,训练保存、加载模型参数问题

    [深度学习] Pytorch(三)-- 多/单GPU.CPU,训练保存.加载预测模型问题 上一篇实践学习中,遇到了在多/单个GPU.GPU与CPU的不同环境下训练保存.加载使用使用模型的问题,如果保存 ...

  9. Qt之先用了再说系列-多线程方式2

    继Qt之先用了再说系列-多线程方式2 本次说说在Qt里多线程使用第2种方式,也是qt官方比较推荐用的方式,相对与直接继承QThread 重写run方法中灵活了一些,如果第一次使用可能会转不湾来,没有直 ...

  10. C#设计模式之17-中介者模式

    中介者模式(Mediator Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/419 访问. 中介者模式 ...