今天是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 array_uintersect() 函数

    实例 比较两个数组的键值(使用用户自定义函数比较键值),并返回交集: <?php function myfunction($a,$b) { if ($a===$b) { return 0; } ...

  2. PHP strtotime() 函数

    ------------恢复内容开始------------ 实例 将任何字符串的日期时间描述解析为 Unix 时间戳: <?php // 设置时区 date_default_timezone_ ...

  3. MySQL主从同步-原理&实践篇

    来源:Onegoleya 简栈文化 什么是mysql的主从复制? MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点 ...

  4. day18.os模块 对系统进行操作

    一.os操作 1.system()在python中执行系统命令 # os.system("ifconfig") # os.system("touch 1.txt" ...

  5. LeetCode 164. Maximum Gap[翻译]

    164. Maximum Gap 164. 最大间隔 Given an unsorted array, find the maximum difference between the successi ...

  6. C# Hello Word

    不管学习什么语言,第一个例子绝对是一个经典的HelloWorld程序那么接下来我们使用 vs studio 2019 来创建一个 HelloWorld 程序 启动vs2019选择 文件-新建-项目-新 ...

  7. Rx.js实现原理浅析

    前言 上次给大家分享了cycle.js的内容,这个框架核心模块的代码其实只有一百多行,要理解这个看似复杂的框架,其实最核心的是理解它依赖的异步数据流处理框架--rx.js.今天,给大家分享一下rx.j ...

  8. ORACLE在linux下的启动方法

    一.启动方法 方法1: Sql代码 cd $ORACLE_HOME/bin #进入到oracle的安装目录  ./dbstart #重启服务器  ./lsnrctl start #重启监听器 ---- ...

  9. SpringMvc接收multipart/form-data 传输的数据 及 PostMan各类数据类型的区别

    前段时间遇到一个问题,在spring mvc 服务端接收post请求时,通过html 表单提交的时候,服务端能够接收到参数的值.但是使用httpclient4.3构造post请求,却无法接收到参数的值 ...

  10. mogilefs 安装与配置

    安装步骤 配置yum 的epel源 yum install perl-Sys-Syslog perl-IO-AIO perl-Net-Netmask -y # 安装依赖的包 取得mogilefs的rp ...