首先,標(biāo)準(zhǔn)化的英文是Standardization,歸一化的英文是Normalization,正則化的英文是Regularization。標(biāo)準(zhǔn)化是特征縮放的一種方式,需要注意的是標(biāo)準(zhǔn)化之后的數(shù)據(jù)分布并不一定是正態(tài)分布,因?yàn)闃?biāo)準(zhǔn)化并不會(huì)改變?cè)紨?shù)據(jù)的分布。歸一化的目的是消除不同量綱及單位影響,提高數(shù)據(jù)間的可比性。正則化的目的是為了防止過(guò)擬合。文中涉及代碼下載參考[5]。
一.標(biāo)準(zhǔn)化
1.標(biāo)準(zhǔn)化方程
最常用的標(biāo)準(zhǔn)化就是Z-Score標(biāo)準(zhǔn)化,簡(jiǎn)單理解就是減均值,并除以標(biāo)準(zhǔn)差。用方程表示如下:
其中,是樣本均值,
是樣本標(biāo)準(zhǔn)差。
2.標(biāo)準(zhǔn)化可視化
標(biāo)準(zhǔn)化的過(guò)程分為2個(gè)步驟,第1步是減均值,第2步是除以標(biāo)準(zhǔn)差??梢暬治鋈缦拢?/p>

上圖中左圖是原圖可視化,中圖是減均值后的可視化,右圖是除以標(biāo)準(zhǔn)差后的可視化。
3.標(biāo)準(zhǔn)化實(shí)現(xiàn)
from sklearn import preprocessing
import numpy as np
X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
X_train_result = preprocessing.scale(X_train, axis=0) #axis=0表示按列進(jìn)行標(biāo)準(zhǔn)化
print(X_train_result)
print(X_train_result.mean(axis=0)) #均值為0
print(X_train_result.std(axis=0)) #標(biāo)準(zhǔn)差為1
輸出結(jié)果如下:
[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
[0. 0. 0.]
[1. 1. 1.]
如果在做機(jī)器學(xué)習(xí)模型訓(xùn)練的時(shí)候,想把訓(xùn)練集的縮放標(biāo)準(zhǔn)應(yīng)用到測(cè)試集上,那就要使用StandardScaler()這個(gè)類(lèi)了,代碼如下:
from sklearn import preprocessing
import numpy as np
X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
scaler = preprocessing.StandardScaler().fit(X_train)
X_scaled = scaler.transform(X_train)
print(X_scaled.mean(axis=0)) #均值為0
print(X_scaled.std(axis=0)) #標(biāo)準(zhǔn)差為1
X_test = [[-1., 1., 0.]] #使用訓(xùn)練集的縮放標(biāo)準(zhǔn)來(lái)標(biāo)準(zhǔn)化測(cè)試集,這里的縮放標(biāo)準(zhǔn)指的就是訓(xùn)練集的列的均值和標(biāo)準(zhǔn)差
print(scaler.transform(X_test))
輸出結(jié)果如下:
[0. 0. 0.]
[1. 1. 1.]
[[-2.44948974 1.22474487 -0.26726124]]
二.歸一化
歸一化就是把數(shù)據(jù)壓縮到一個(gè)區(qū)間內(nèi),比如[0,1]、[-1,1]。常用的2種方法如下:
1.Min-Max Normalization
用方程表示如下:
歸一化的區(qū)間范圍是[0,1]。代碼實(shí)現(xiàn)如下:
import numpy as np
from sklearn import preprocessing as pp
X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]])
scaler = pp.MinMaxScaler().fit(X_train) #默認(rèn)數(shù)據(jù)壓縮范圍為[0,1]
print(scaler.transform(X_train))
輸出結(jié)果如下:
[[0.5 0. 1. ]
[1. 0.5 0. ]
[0. 1. 0.125]]
2.Mean Normalization
用方程表示如下:
歸一化的區(qū)間范圍是[-1,1]。
import numpy as np
from sklearn import preprocessing as pp
X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]])
scaler = pp.MinMaxScaler(feature_range=(-1, 1)) #設(shè)置數(shù)據(jù)壓縮范圍為[-1,1]
scaler = scaler.fit(X_train)
print(scaler.transform(X_train))
輸出結(jié)果如下:
[[ 0. -1. 1. ]
[ 1. 0. -1. ]
[-1. 1. -0.75]]
上述代碼主要使用scikit-learn的預(yù)處理子模塊preprocessing提供MinMaxScaler類(lèi)來(lái)實(shí)現(xiàn)歸一化功能。MinMaxScaler類(lèi)有一個(gè)重要參數(shù)feature_range,該參數(shù)用于設(shè)置數(shù)據(jù)壓縮的范圍,默認(rèn)值是[0,1]。
三.正則化
簡(jiǎn)單理解使用正則化的目的就是為了防止過(guò)擬合,當(dāng)然還有其它防止過(guò)擬合的方法,比如降低特征維度。先舉個(gè)例子說(shuō)下為什么降低特征維度也可以防止過(guò)擬合,然后再說(shuō)明正則化是如何防止過(guò)擬合的。首先要搞明白過(guò)擬合的本質(zhì)是什么?就是把噪音也當(dāng)做事物的特征進(jìn)行了建模。假如一只小鳥(niǎo)受傷了,暫時(shí)不會(huì)飛翔,在構(gòu)建鳥(niǎo)類(lèi)分類(lèi)器的時(shí)候,把能否飛翔這個(gè)噪音也學(xué)習(xí)成模型的特征了,這樣正常的能夠飛翔的小鳥(niǎo)就判斷為不是鳥(niǎo)類(lèi)了,當(dāng)然這是一個(gè)過(guò)擬合的很牽強(qiáng)的例子,但是也可說(shuō)明一定的問(wèn)題。正則化是如何防止過(guò)擬合的呢?
對(duì)于給定的數(shù)據(jù)集,考慮最簡(jiǎn)單的線性回歸模型,以平方誤差作為損失函數(shù),優(yōu)化目標(biāo)如下:
引入L2范數(shù)正則化,稱為嶺回歸[ridge regression],如下所示:
引入L1范數(shù)正則化,稱為L(zhǎng)ASSO[Least Absolute Shrinkage and Selection Operator]回歸,如下所示:
假設(shè)數(shù)據(jù)維度為2維,通過(guò)方程可以做出下圖,其中左圖即
,右圖即
。可見(jiàn)隨著
增大,越來(lái)越多的參數(shù)會(huì)變?yōu)?:

目的是為了找到損失函數(shù)取最小值時(shí)對(duì)應(yīng)的權(quán)重值,其中下圖藍(lán)色圓圈是平方誤差項(xiàng)等值線,當(dāng)取橢圓中心點(diǎn)時(shí),損失函數(shù)(這里說(shuō)的損失函數(shù)不包含正則化)值最小??偟膿p失函數(shù)(這里說(shuō)的損失函數(shù)包含正則化)就是求藍(lán)圈+紅圈的和的最小值。
正則化方法是一個(gè)常量,它通過(guò)限制模型的復(fù)雜度,使得復(fù)雜的模型能夠在有限大小的數(shù)據(jù)集上進(jìn)行訓(xùn)練,而不會(huì)產(chǎn)生嚴(yán)重的過(guò)擬合。正則項(xiàng)越小,懲罰力度越小,極端情況正則項(xiàng)為0時(shí),就會(huì)造成過(guò)擬合問(wèn)題;正則化越大,懲罰力度越大,就會(huì)容易出現(xiàn)欠擬合問(wèn)題。

通過(guò)上圖可以直觀的看到采用L1范數(shù)時(shí)平方誤差項(xiàng)等值線與正則化項(xiàng)等值線的交點(diǎn)出現(xiàn)在坐標(biāo)軸上,即或者
。當(dāng)采用L2范數(shù)時(shí),兩者的交叉點(diǎn)常出現(xiàn)在某個(gè)象限中,即
且
。這樣采用L1正則化比L2正則化更容易得到稀疏解。L2正則化優(yōu)勢(shì)是處處可導(dǎo),L1正則化有拐點(diǎn),不是處處可微,但可以得到更加稀疏的解。