数据处理 | pandas入门专题——离散化与one-hot

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

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

离散化

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

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

这种状况很是多,由于现实生活当中不少数据的分布是很是不均匀的。每每不是正态分布而是二八分布,甚至更加两极分化。那针对这种状况该怎么处理呢?机器学习

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

那么假设咱们但愿在dataframe当中作这样离散化的操做,应该怎么办呢?svg

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

income = [2000100001500008000200003000050000100000020000000300000000]

而后咱们再人为的设置分桶用来对收入进行划分:flex

bins = [030000100000100000001000000000]

以后咱们只须要调用pandas当中的cut方法,将income和bins数组都传入就能够了:url

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 -

原文连接,求个关注