抄袭/参考资料
提要
未经处理的特征,进行建模往往会有以下问题:
- 不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
- 信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
- 定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
- 存在缺失值:缺失值需要补充。
- 信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。
sklearn中的数据预处理库(preprocessing)里提供了以下这些类class对数据预处理
class | 功能 | 说明 | 行/列 |
---|---|---|---|
StandardScaler | 无量纲化 | 标准化,将特征值转换至服从标准正态分布 | 列 |
MinMaxScaler | 无量纲化 | 区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上 | 列 |
Normalizer | 归一化 | 基于特征矩阵的行,将样本向量转换为“单位向量” | 行 |
Binarizer | 二值化 | 基于给定阈值,将定量特征按阈值划分 | 列 |
OneHotEncoder | 哑编码 | 将定性数据编码为定量数据 | 列 |
Imputer | 缺失值填充 | - | |
PolynomialFeatures | 多项式数据转换 | - | |
FunctionTransformer | 自定义单元数据转换 | - |
使用策略
以上的几个预处理类使用接口与模型接口一致
- fit()
使用fit训练出一个容器,使该容器含有对数据进行处理的参数。 - transfrom()
使用容器对数据进行处理,处理过程使用的参数(如方差、均值等)是之前用于fit()训练的数据集的属性,而不是本次处理数据集的属性,这样可以确保每次使用该容器处理出来的数据都是一致(经过同样的加工)。 - fit_transfrom()
把fit()训练用的数据集,在训练后容器后,直接用该容易处理这个样本急,减少计算和代码量。
注意点:后续建模中使用的 trina set 和 test set 必选保持处理的一致性,所以才有了先fit()后transfrom()的策略。
标准化Standardization
标准化是依照特征矩阵的列处理数据
Zero-mean normalization
说明
Z-score 标准化 ,也叫标准差标准化,经过处理的数据符合均值为0,标准差为1的标准正态分布。下面是计算公式,其中$μ$为所有样本数据的均值,$σ$为所有样本数据的标准差。
$$
x=\frac{x-u}{\alpha }
$$
|
|
参数 | 格式 | 默认值 | 说明 |
---|---|---|---|
copy | boolean | True | - |
with_mean | boolean | True | - |
with_std | boolean | True | - |
使用
df1
A | B | C | D | |
---|---|---|---|---|
0 | 2 | 2 | 5 | 1 |
1 | 2 | 3 | 10 | 2 |
2 | 2 | 3 | 15 | 3 |
3 | 2 | 4 | 20 | 4 |
df2
A | B | C | D | |
---|---|---|---|---|
0 | 3 | 11 | 55 | 22 |
1 | 3 | 26 | 36 | 37 |
2 | 3 | 16 | 62 | 13 |
3 | 3 | 46 | 83 | 45 |
|
|
Z-score处理后的数据如下,注意看df1和df2各自的A列,结果很清楚,df1的按自己的属性进行处理,而df2是按df1的属性进行处理。
t-df1 | A | B | C | D | t-df2 | A | B | C | D |
---|---|---|---|---|---|---|---|---|---|
0 | 0.0 | -1.414214 | -1.341641 | -1.341641 | 1.0 | 11.313708 | 7.602631 | 17.441330 | |
1 | 0.0 | 0.000000 | -0.447214 | -0.447214 | 1.0 | 32.526912 | 4.203808 | 30.857738 | |
2 | 0.0 | 0.000000 | 0.447214 | 0.447214 | 1.0 | 18.384776 | 8.854829 | 9.391486 | |
3 | 0.0 | 1.414214 | 1.341641 | 1.341641 | 1.0 | 60.811183 | 12.611423 | 38.013156 |
0-1 normalization
说明
0-1标准化,或叫离差标准化,0-1标准化对原始数据的线性变换,使结果落到[0,1]区间。下面是计算公式,其中max为样本数据的最大值,min为样本数据的最小值。
$$
x=\frac{x-\min}{\max-\min }
$$
|
|
参数 | 格式 | 默认值 | 说明 |
---|---|---|---|
feature_range | tuple(min,max) | (0,1) | -转化范围 |
copy | boolean | True | - |
feature_range可以选择转化的范围大小,单一般不用改动它,默认的0到1很好。
使用
|
|
输出结果也很明显,df1用自己的属性(所以范围在0到1内),df2是用df1的属性。
t-df1 | A | B | C | D | t-df2 | A | B | C | D |
---|---|---|---|---|---|---|---|---|---|
0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 1.0 | 4.5 | 3.333333 | 7.000000 | |
1 | 0.0 | 0.5 | 0.333333 | 0.333333 | 1.0 | 12.0 | 2.066667 | 12.000000 | |
2 | 0.0 | 0.5 | 0.666667 | 0.666667 | 1.0 | 7.0 | 3.800000 | 4.000000 | |
3 | 0.0 | 1.0 | 1.000000 | 1.000000 | 1.0 | 22.0 | 5.200000 | 14.666667 |
规范化Normalization
说明
规范化/归一化/正则化
是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”(使单个样本具有单位范数的缩放操作)。
规则为$l_2$的公式(默认为$l_2$)如下:
$$
x=\frac{x}{\sqrt{\sum_{j}^{d}({x_{j}})^2}}
$$
|
|
参数 | 格式 | 默认值 | 说明 |
---|---|---|---|
X | - | - | 处理的数据集 |
norm | ** ‘l1’, ‘l2’, or ‘max’ | ‘l2’ | |
axis | 0 or 1 | 1 | 默认对行,sample进行处理,pandas和sklearn对axis的数据好像是相反的 |
copy | boolean | True | - |
return_norm | boolean | False | - |
使用
|
|
t-df1 | A | B | C | D | t-df2 | A | B | C | D |
---|---|---|---|---|---|---|---|---|---|
0 | 0.342997 | 0.342997 | 0.857493 | 0.171499 | 0.049731 | 0.182348 | 0.911741 | 0.364697 | |
1 | 0.184900 | 0.277350 | 0.924500 | 0.184900 | 0.051832 | 0.449212 | 0.621985 | 0.639263 | |
2 | 0.127257 | 0.190885 | 0.954427 | 0.190885 | 0.045867 | 0.244624 | 0.947919 | 0.198757 | |
3 | 0.095783 | 0.191565 | 0.957826 | 0.191565 | 0.028553 | 0.437817 | 0.789975 | 0.428300 |
其实Normalizer是都行,即对sample进行处理的,所以fit()这个动作对其是没有用的,有这一个接口的原因是为了接口的整齐统一,方便后期操作,不信可以看看下面这句代码,结果说明fit()是无用的。
|
|
t-df2 | A | B | C | D |
---|---|---|---|---|
0 | 0.049731 | 0.182348 | 0.911741 | 0.364697 |
1 | 0.051832 | 0.449212 | 0.621985 | 0.639263 |
2 | 0.045867 | 0.244624 | 0.947919 | 0.198757 |
3 | 0.028553 | 0.437817 | 0.789975 | 0.428300 |
二值化Binarization
说明
定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式表达如下:
$$
x=\left\{\begin{matrix}
1 , x> threshold\
0,x\leqslant threshold
\end{matrix}\right.
$$
|
|
参数 | 格式 | 默认值 | 说明 |
---|---|---|---|
threshold | float | 0.0 | 阈值 |
copy | boolean | True | - |
使用
哑编码Encoding categorical features
说明
哑编码是对分类特征(定性特征)进行标准化处理的一种方法
|
|
使用
实际使用
pandas.get_dummies()
缺失值Imputation of missing values
说明
Imputer类提供了缺失数值处理的基本策略,比如使用缺失数值所在行或列的均值、中位数、众数来替代缺失值。
该类也兼容不同的缺失值编码:missing_values的值可以为NaN,也可以为0。前者对缺失值填充,后者对0值进行填充。
|
|
参数 | 格式 | 默认值 | 具体说明 |
---|---|---|---|
missing_values | integer or “NaN” | “NaN” | 缺失值的格式,一般是:“NaN” or integer,默认“NaN” |
strategy | string | “mean” | 填充方式,“mean”,“median”,“most_frequent” |
axis | integer | 0 | - |
verbose | integer | 0 | - |
copy | boolean | True | - |
使用
实际使用
fillna()
多项式Generating polynomial features
很多情况下,考虑输入数据中的非线性特征来增加模型的复杂性是非常有效的。一个简单常用的方法就是使用多项式特征,它能捕捉到特征中高阶和相互作用的项。可以使用preprocessing.PolynomialFeatures
类进行多项式转换。听说用的少,就不写了!
自定义Custom transformers
你可能经常需要将一个已经存在的python函数转换成转换器以便于在数据清理和预处理当中使用。你可以通过 preprocessing.FunctionTransformer
类将任意一个函数转换成转换器。听说也用的少,就不写了!