在机器学习中,我们尽量的把数据转成均值为0,方差为1满足高斯分布的数据,这样的好处使得数据比较均衡,算法不会因为某一个奇异的数据值而更偏向某一个数据。但是实际的情况中,我们通常不会太多的考虑数据的分布情况,而是通过均值集中数据,然后除以他们的标准差。
一.标准化,减均值,按照方差等比缩放
数据的标准化:当个体的特征明显不服从正态分布时,标准化表现的结果比较差。实际操作中,经常忽略数据的分布,通过减去数据的均值,通过标准差,实现数据的中心化。
1.使用sklearn中scale函数把数据按照行或列缩放到均值为0,方差为1,下面的代码是从sklearn中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)
X_scaled
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
X_scaled.mean(axis=0)
array([0., 0., 0.])
X_scaled.std(axis=0)
array([1., 1., 1.])
其中scale的函数原型如下:详细参考sklearn使用手册
klearn.preprocessing.
scale
(X, axis=0, with_mean=True, with_std=True, copy=True)
Parameters:
X:待处理的数据
axis = 0(按照列处理)/1(按照行处理),默认=0
with_mean = True,在处理之前把数据去均值
with_std = True,在处理之前把数据除标准差
copy = True,处理之后的数据,复制一份
2.使用sklearn中StandardScaler计算训练数据集的平均值和标准差,以方便测试数据集进行同样的变换,以下代码来自sklearn
scaler = preprocessing.StandardScaler().fit(X_train)
scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
scaler.mean_
array([1. ..., 0. ..., 0.33...])
scaler.scale_
array([0.81..., 0.81..., 1.24...])
scaler.transform(X_train)
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
X_test = [[-1., 1., 0.]]
scaler.transform(X_test)
array([[-2.44..., 1.22..., -0.26...]])
注意:scaler = preprocessing.StandardScaler().fit(X_train),只能按照列来减均值,除标准差
二:讲数据集特征缩放到指定的范围:
1.MinMaxScaler进行缩放数据,通常我们指定区间为(0,1)
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)
X_train_minmax
array([[0.5 , 0. , 1. ],
[1. , 0.5 , 0.33333333],
[0. , 1. , 0. ]])
X_test = np.array([[-3., -1., 4.]])
>>> X_test_minmax = min_max_scaler.transform(X_test)
>>> X_test_minmax
array([[-1.5 , 0. , 1.66666667]])
也可以指定缩放的区间:MinMaxScaler = preprocessing.MinMaxScaler(feature_range=(1,2))