正則化,歸一化,標(biāo)準(zhǔn)化的區(qū)別與聯(lián)系

首先,標(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)差。用方程表示如下:
x_{new}=(x-μ)/σ
其中,\mu是樣本均值,σ是樣本標(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

用方程表示如下:
x_{new}=\frac{x-x_{min}}{x_{max}-x_{min}}
歸一化的區(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

用方程表示如下:
x_{new}=\frac{x-x_{mean}}{x_{max}-x_{min}}
歸一化的區(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ù)集D=\{\textbf{(x}_1,y_1),(\textbf{x}_2,y_2),...,(\textbf{x}_m,y_m)\},考慮最簡(jiǎn)單的線性回歸模型,以平方誤差作為損失函數(shù),優(yōu)化目標(biāo)如下:
min_\omega\sum_{i = 1}^{N}{(y_{i} -\omega^{T} x_{i})^{2} }
引入L2范數(shù)正則化,稱為嶺回歸[ridge regression],如下所示:
min_\omega\sum_{i = 1}^{N}{(y_{i} -\omega^{T} x_{i})^{2} } + C||\omega||_{2}^{2}
引入L1范數(shù)正則化,稱為L(zhǎng)ASSO[Least Absolute Shrinkage and Selection Operator]回歸,如下所示:
min_\omega\sum_{i = 1}^{N}{(y_{i} -\omega^{T} x_{i})^{2} } + C||\omega||_{1}
假設(shè)數(shù)據(jù)維度為2維,通過(guò)方程\sum_{j=1}^M|\omega_j|^q≤\frac1\lambda可以做出下圖,其中左圖即\omega_1^2+\omega_2^2≤\frac1\lambda,右圖即\omega_1+\omega_2≤\frac1\lambda。可見(jiàn)隨著\lambda增大,越來(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)軸上,即\omega_1=0或者\omega_2=0。當(dāng)采用L2范數(shù)時(shí),兩者的交叉點(diǎn)常出現(xiàn)在某個(gè)象限中,即\omega_1≠0\omega_2≠0。這樣采用L1正則化比L2正則化更容易得到稀疏解。L2正則化優(yōu)勢(shì)是處處可導(dǎo),L1正則化有拐點(diǎn),不是處處可微,但可以得到更加稀疏的解。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容