文章目录
sklearn中的数据预处理方法学习
(更新中。。。)
我们一般开始拿到的数据并非是方便我们后期分析的类型,因此需要我们进行数据的预处理。sklearn.preprocessing
包提供了几个常用的函数和转换类,用它们将一个原始的特征向量转化为一个更适于数据分析的表示形式。一般来说,学习算法收益于数据集的标准形式。如果数据中存在异常点,稳健的数据规范或转换是更适合的。
一、标准化
对于大多数数据挖掘算法来说,数据集的标准化是基本要求。如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。例如,我们经常忽略数据的分布形状,而仅仅做零均值、单位标准差的处理。在一个机器学习算法的目标函数里的很多元素所有特征都近似零均值,方差具有相同的阶。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得模型不能从其它特征有效地学习。
Z-score标准化
Z-score标准化学习
想系统了解点这里:Z-score是什么.下面是简要的介绍:
Z-Score标准化是数据处理的一种常用方法。通过它能够将不同量级的数据转化为统一量度的Z-Score分值进行比较。数据分析与挖掘中,很多方法需要样本符合一定的标准,如果需要分析的诸多自变量不是同一个量级,就会给分析工作造成困难,甚至影响后期建模的精准度。
举例来说,假设我们要比较A与B的考试成绩,A的考卷满分是100分(及格60分),B的考卷满分是700分(及格420分)。很显然,A考出的70分与B考出的70分代表着完全不同的意义。但是从数值来讲,A与B在数据表中都是用数字70代表各自的成绩。
那么如何能够用一个同等的标准来比较A与B的成绩呢?Z-Score就可以解决这一问题。
这种方法基于原始数据的均值mean
和标准差standard deviation
进行数据的标准化。将特征A
的原始值x
使用z-score
标准化到x’
。z-score
标准化方法适用于特征A
的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在0
附近,方差值为1
。数学公式如下:
(x:观测值;x mean:总体平均值;x std:总体标准差)
Z-score标准化实现
函数scale
为数组形状的数据集的标准化提供了一个快捷实现:
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
X_scaled = preprocessing.scale(X_train)
print(X_scaled)
'''[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]'''
经过缩放后的数据具有零均值以及标准方差:
print(X_scaled.mean(axis=0))
#[0. 0. 0.]
print(X_scaled.std(axis=0))
#[1. 1. 1.]
Min-max标准化
Min-max
标准化方法是对原始数据进行线性变换。设minA
和maxA
分别为特征A
的最小值和最大值,将A
的一个原始值x
通过min-max
标准化映射成在区间[0,1]
中的值x'
,其公式为:
这个比较好理解,给出一个简单的图示例:
可以使用MinMaxScaler
实现,以下是一个将简单的数据矩阵缩放到[0, 1]
的例子:
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
print(X_train_minmax)
'''
[[0.5 0. 1. ]
[1. 0.5 0.33333333]
[0. 1. 0. ]]'''
MaxAbs标准化
MaxAbs
的工作原理与Min-max
非常相似,但它只通过除以每个特征的最大值将训练数据特征缩放至 [-1, 1]
范围内,这就意味着,训练数据应该是已经零中心化或者是稀疏数据。公式如下:
可以使用MaxAbsScale
实现,以下是使用上例中数据运用这个缩放器的例子:
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
print(X_train_maxabs)
'''
[[ 0.5 -1. 1. ]
[ 1. 0. 0. ]
[ 0. 1. -0.5]]'''