数据预处理之离散化

按照我们对于变量的分类:分为数值变量和分类变量,数值变量可以分为连续型和离散型,分类变量又有有序的和无序的。下面我将介绍一些对于这些变量进行离散化处理。

 

无序分类变量的离散化方法:

  比如在泰坦尼克号当中,有一个变量叫做乘客登陆的港口,取值为(C, Q, S)代表三个地方。这是一个典型的无序分类变量,我们在进行数据预处理的时候应该如何进行。 一种很容易想到的方法就是把每个值映射为一个数字,比如C=0, Q=1, S=2。 但是这样容易产生一个问题:我们实际上是把它们当做了有序的数字来进行看待了,2比1大,这就存在了顺序关系。但是我们的数据本来并不存在这样的关系。

  为了解决上面的问题,我们使用独热编码(One-Hot Encoding)对无序的分类变量进行处理。对于取值有m种情况的变量,我们用m维来表示。比如上面的变量可以取值100, 010,001, 仅当样本取值为第i种情况的时候,在第i维上面编码为1,其余维均编码为0。独热编码形成的变量也叫做虚变量或者哑变量(dummpy variable)。

sklearn 中有提供的OneHotEncoder的方法

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()

enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])

print(enc.n_values_)

print(enc.transform([[0, 1, 1]]).toarray())
'''
数据为这样的情况
0 0 3
1 1 0
0 2 1 
1 0 2
一共有三个特征,第一个特征有两个取值,第二个特征有三个取值,第四个特征有四个取值
所以n_values_输出为[2,3,4]
当我们对[0, 1, 1]进行编码的时候为10 010 0100 

'''

输出结果如下:

[2 3 4]
[[1. 0. 0. 1. 0. 0. 1. 0. 0.]]

 

另外,panda当中也有一个get_dummies方法,可以进行独热编码。当get_dummies接受的是一个DataFrame类型的时候,将其中变量类型为object和category的类型(可以使用info()查看类型)转化为哑变量。int64,float64和bool类型不进行转换。

import pandas as pd
import seaborn as sns

#我们从seaborn当中调入 titanic的数据。
titanic = sns.load_dataset("titanic")

print(titanic['embarked'].head())

embarked_dummpy = pd.get_dummies(titanic['embarked'])

print(embarked_dummpy.head())

#我们可以使用 pd.concat方法,把得到的dummpy数据和元数据连接在一起
new_data = pd.concat([titanic, embarked_dummpy], axis=1)

输出结果如下

0    S
1    C
2    S
3    S
4    S
Name: embarked, dtype: object
   C  Q  S
0  0  0  1
1  1  0  0
2  0  0  1
3  0  0  1
4  0  0  1

 

有序分类变量的离散化

  有序分类变量可以直接利用划分后的数值。如分类变量 [贫穷,温饱,小康,富有],直接可以将他们转换为[0,1,2,3]就可以了。可以直接使用pandas当中的map函数进行映射离散化;

train_df['Sex'] = train_df['Sex'].map({'male':0, 'female':1})

或者是借用sklearn.preprocessing.LabelEncoder 来完成这样的操作。

 

连续变量的离散化

对于连续变量,我们直接把他们扔进我们的模型当中,为什么还有进行离散化?

离散化有很多的好处,比如能够使我们的模型更加的简单,因为相对于连续类型数据,离散类型数据的可能性更少。对于某些模型比如计算广告中常用的逻辑回归,是非常需要我们输入离散化的特征的。

连续特征离散化的方法可以分为有监督的和无监督的。前者主要是利用了数据集中的类信息。

 

无监督的方法分为:

等宽划分:按照相同宽度将数据分成几等份。缺点是受到异常值的影响比较大。 pandas.cut方法可以进行等宽划分。

等频划分:将数据分成几等份,每等份数据里面的个数是一样的。pandas.qcut方法可以进行等频划分。

聚类划分:使用聚类算法将数据聚成几类,每一个类为一个划分。

 

 有监督学习方法:

1R方法

基于信息熵的方法

基于卡方的方法

 

 参考

One-Hot Encoding与类别特征处理

特征工程七种常用方法

连续特征离散化方法综述

 

posted @ 2018-03-15 21:19  小舔哥  阅读(20947)  评论(1编辑  收藏  举报