还没决定

sklearn-数据预处理

抄袭/参考资料


提要

未经处理的特征,进行建模往往会有以下问题:

  • 不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
  • 信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“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 }
$$

1
2
# StandardScaler
class sklearn.preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)
参数 格式 默认值 说明
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
1
2
3
4
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit_transform(df1)
ss.transform(df2)

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 }
$$

1
2
# MinMaxScaler
class sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)
参数 格式 默认值 说明
feature_range tuple(min,max) (0,1) -转化范围
copy boolean True -

feature_range可以选择转化的范围大小,单一般不用改动它,默认的0到1很好。

使用

1
2
3
4
from sklearn.preprocessing import MinMaxScaler
ms = MinMaxScaler()
ms.fit_transform(df1)
ms.transform(df2)

输出结果也很明显,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}}
$$

1
2
# normalize
class sklearn.preprocessing.normalize(X, norm='l2', axis=1, copy=True, return_norm=False)
参数 格式 默认值 说明
X - - 处理的数据集
norm ** ‘l1’, ‘l2’, or ‘max’ ‘l2’
axis 0 or 1 1 默认对行,sample进行处理,pandas和sklearn对axis的数据好像是相反的
copy boolean True -
return_norm boolean False -

使用

1
2
3
4
from sklearn.preprocessing import Normalizer
NL = Normalizer()
NL.fit_transform(df1)
NL.transform(df2)
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()是无用的。

1
NL.fit_transform(df1)
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.
$$

1
2
# Binarizer
class sklearn.preprocessing.Binarizer(threshold=0.0, copy=True)
参数 格式 默认值 说明
threshold float 0.0 阈值
copy boolean True -

使用


哑编码Encoding categorical features

说明

哑编码是对分类特征(定性特征)进行标准化处理的一种方法

1
2
# OneHotEncoder
class sklearn.preprocessing.OneHotEncoder(n_values='auto', categorical_features='all', dtype=<type 'numpy.float64'>, sparse=True, handle_unknown='error')

使用

实际使用

pandas.get_dummies()


缺失值Imputation of missing values

说明

Imputer类提供了缺失数值处理的基本策略,比如使用缺失数值所在行或列的均值、中位数、众数来替代缺失值。
该类也兼容不同的缺失值编码:missing_values的值可以为NaN,也可以为0。前者对缺失值填充,后者对0值进行填充。

1
2
# Imputer
class sklearn.preprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0, verbose=0, copy=True)
参数 格式 默认值 具体说明
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 类将任意一个函数转换成转换器。听说也用的少,就不写了!