在機器學習中,我們盡量的把資料轉成均值為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))