按照我们对于变量的分类:分为数值变量和分类变量,数值变量可以分为连续型和离散型,分类变量又有有序的和无序的。下面我将介绍一些对于这些变量进行离散化处理。
无序分类变量的离散化方法:
比如在泰坦尼克号当中,有一个变量叫做乘客登陆的港口,取值为(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方法,可以进行独热编码
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.cut方法可以进行等宽划分。
等频划分:将数据分成几等份,每等份数据里面的个数是一样的。pandas.qcut方法可以进行等频划分。
聚类划分:使用聚类算法将数据聚成几类,每一个类为一个划分。
有监督学习方法:
1R方法
基于信息熵的方法
基于卡方的方法
参考
One-Hot Encoding与类别特征处理
特征工程七种常用方法
原文地址:https://www.cnblogs.com/jiaxin359/p/8574510.html