数据预处理
0 - 引入
一般通过特征提取或者数据集给出的特征,可能都有如下问题:
- 不属于同一个量纲:即不同特征可能由于单位不一致或者分布区间不一致而导致数值上的差异,所以不能直接放在一起进行比较;
- 特征信息存在冗余:有可能不同特征实质上描述的是同一个我们想关注的特征,因此对于特定问题可能存在多余的特征;
- 定性特征不能直接使用:定性特征最直观的理解就是数据集中用字符串表示的特征(当然这只是一种片面的理解),所以需要将其转换成定量特征进行描述,one-hot编码是一种常用的方法;
- 存在缺失值:有可能某些特征的某些个体存在缺失的记录,这时候需要通过分析选择进补全或者舍弃;
- 信息利用率低:其实对于不同任务不同模型,特征的选择应该是不同的,换句话说,对于特征的利用程度是不同的,所以可以通过人工筛选、one-hot编码或者定量变量多项式化来提高特征的利用率。
由于存在上述问题,因此在我们设计算法和模型之前,我们需要相对数据进行预处理,下面通过sklearn中的preprocessing模块并基于iris数据集来介绍不同的数据预处理。
导入iris数据集。
from sklearn.datasets import load_iris iris = load_iris()
1 - sklearn方法查询表
下面给出preprocessing中对应不同数据预处理过程的方法,以便于查询,具体的使用后面部分将详细展开
类 | 功能 | 说明 |
StandardScaler | 无量纲化 | 标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布 |
MinMaxScaler | 无量纲化 | 区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上 |
Normalizer | 归一化 | 基于特征矩阵的行,将样本向量转换为“单位向量” |
Binarizer | 二值化 | 基于给定阈值,将定量特征按阈值划分 |
OneHotEncoder | 哑编码 | 将定性数据编码为定量数据 |
Imputer | 缺失值计算 | 计算缺失值,缺失值可填充为均值等 |
PolynomialFeatures | 多项式数据转换 | 多项式数据转换 |
FunctionTransformer | 自定义单变元函数转换 | 使用单变元的函数来转换数据 |
2 - 无量纲化
2.1 - 标准化
标准化的公式为$x^{'}=\frac{x-\bar{X}}{S}$,代码如下:
from sklearn.preprocessing import StandardScaler StandardScaler().fit_transform(iris.data)
2.2 - 区间放缩
区间放缩的公式为$x^{'}=\frac{x-x_{min}}{x_{max}-x_{min}}$,代码如下:
from sklearn.preprocessing import MinMaxScaler MinMaxScaler().fit_transform(iris.data)
3 - 归一化
无量纲化是依据特征矩阵的列来处理数据,而归一化是依据特征矩阵的行来处理数据,其公式为$x^{'}=\frac{x}{\sqrt{\sum^m_jx[j]^2}}$,代码如下:
from sklearn.preprocessing import Normalizer Normalizer().fit_transform(iris.data)
4 - 二值化
设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,其公式为
$$x^{'}=\left\{\begin{matrix}1,x>threshold\\0,x\leq threshold\end{matrix}\right.$$
代码如下:
from sklearn.preprocessing import Binarizer Binarizer(threshold=3).fit_transform(iris.data)
5 - 哑编码
假如有一个定性特征具有n个离散值,则可以将其编码为长度为n的向量,对于具有第i个离散值的特征,将向量的第i位置为1,其余置为0,代码如下:
from sklearn.preprocessing import OneHotEncoder OneHotEncoder().fit_transform(iris.target.reshape((-1, 1)))
6 - 缺失值计算
由于IRIS数据集不存在缺失值,所以直接对数据集增加一个样本,4个特征之均赋值为nan,而后通过缺失值计算计算出这四个特征之,代码如下:
from numpy import vstack, array, nan from sklearn.preprocessing import Imputer Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))
7 - 数据变换
常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。对于IRIS数据集的4个特征,做度数为2的多项式转换公式如下:
$$\begin{matrix}(x^{'}_{1},x^{'}_{2},x^{'}_{3},x^{'}_{4},x^{'}_{5},x^{'}_{6},x^{'}_{7},x^{'}_{8},x^{'}_{9},x^{'}_{10},x^{'}_{11},x^{'}_{12},x^{'}_{13},x^{'}_{14},x^{'}_{15})\\
=(1,x_{1},x_{2},x_{3},x_{4},x^{2}_{1},x_{1}*x_{2},x_{1}*x_{3},x_{1}*x_{4},x^{2}_{2},x_{2}*x_{3},x_{2}*x_{4},x^{2}_{3},x_{3}*x_{4},x^{2}_{4})
\end{matrix}$$
代码如下:
from sklearn.preprocessing import PolynomialFeatures PolynomialFeatures().fit_transform(iris.data)
8 - 值定义单变元函数转换
可以通过基于单变元的数据变化来转换特征,代码如下:
from numpy import log1p from sklearn.preprocessing import FunctionTransformer FunctionTransformer(log1p).fit_transform(iris.data)