一、概念
歸一化(Normlization)
數(shù)據(jù)歸一化就是將訓(xùn)練集中某一列數(shù)值特征的值縮放到0和1之間。
1、把數(shù)變?yōu)椋?,1)之間的小數(shù)
主要是為了數(shù)據(jù)處理方便提出來的,把數(shù)據(jù)映射到0~1范圍之內(nèi)處理,更加便捷快速。
2、把有量綱表達(dá)式變?yōu)闊o量綱表達(dá)式
歸一化是一種簡(jiǎn)化計(jì)算的方式,即將有量綱的表達(dá)式,經(jīng)過變換,化為無量綱的表達(dá)式,成為純量。
主要算法有:
(1)線性轉(zhuǎn)換,即min-max歸一化(常用方法)
y=(x-min)/(max-min)
(2) 對(duì)數(shù)函數(shù)轉(zhuǎn)換
y=log10(x)
(3)反余切函數(shù)轉(zhuǎn)換
y=atan(x)*2/PI
標(biāo)準(zhǔn)化(standardization)
數(shù)據(jù)的標(biāo)準(zhǔn)化是將數(shù)據(jù)按比例縮放,使之落入一個(gè)小的特定區(qū)間。由于信用指標(biāo)體系的各個(gè)指標(biāo)度量單位是不同的,為了能夠?qū)⒅笜?biāo)參與評(píng)價(jià)計(jì)算,需要對(duì)指標(biāo)進(jìn)行規(guī)范化處理,通過函數(shù)變換將其數(shù)值映射到某個(gè)數(shù)值區(qū)間。
最常見的就是將訓(xùn)練集中某一列數(shù)值特征的值縮放成均值為0,方差為1的狀態(tài)。
主要方法:
(1) z-score標(biāo)準(zhǔn)化,即零-均值標(biāo)準(zhǔn)化(常用方法)
y=(x-μ)/σ
二、標(biāo)準(zhǔn)化/歸一化的好處
1、 提升模型精度
在機(jī)器學(xué)習(xí)算法的目標(biāo)函數(shù)(例如SVM的RBF內(nèi)核或線性模型的l1和l2正則化),許多學(xué)習(xí)算法中目標(biāo)函數(shù)的基礎(chǔ)都是假設(shè)所有的特征都是零均值并且具有同一階數(shù)上的方差。如果某個(gè)特征的方差比其他特征大幾個(gè)數(shù)量級(jí),那么它就會(huì)在學(xué)習(xí)算法中占據(jù)主導(dǎo)位置,導(dǎo)致學(xué)習(xí)器并不能像我們說期望的那樣,從其他特征中學(xué)習(xí)。
例如在KNN中,我們需要計(jì)算待分類點(diǎn)與所有實(shí)例點(diǎn)的距離。假設(shè)每個(gè)實(shí)例點(diǎn)(instance)由n個(gè)features構(gòu)成。如果我們選用的距離度量為歐式距離,如果數(shù)據(jù)預(yù)先沒有經(jīng)過歸一化,那么那些絕對(duì)值大的features在歐式距離計(jì)算的時(shí)候起了決定性作用。
從經(jīng)驗(yàn)上說,歸一化是讓不同維度之間的特征在數(shù)值上有一定比較性,可以大大提高分類器的準(zhǔn)確性。
2、 提升收斂速度
對(duì)于線性model來說,數(shù)據(jù)歸一化后,最優(yōu)解的尋優(yōu)過程明顯會(huì)變得平緩,更容易正確的收斂到最優(yōu)解。

比較這兩個(gè)圖,前者是沒有經(jīng)過歸一化的,在梯度下降的過程中,走的路徑更加的曲折,而第二個(gè)圖明顯路徑更加平緩,收斂速度更快。 對(duì)于神經(jīng)網(wǎng)絡(luò)模型,避免飽和是一個(gè)需要考慮的因素,通常參數(shù)的選擇決定于input數(shù)據(jù)的大小范圍。
三、標(biāo)準(zhǔn)化/歸一化的對(duì)比分析
首先明確,在機(jī)器學(xué)習(xí)中,標(biāo)準(zhǔn)化是更常用的手段,歸一化的應(yīng)用場(chǎng)景是有限的。原因有兩點(diǎn):
1、標(biāo)準(zhǔn)化更好保持了樣本間距。當(dāng)樣本中有異常點(diǎn)時(shí),歸一化有可能將正常的樣本“擠”到一起去。比如三個(gè)樣本,某個(gè)特征的值為1,2,10000,假設(shè)10000這個(gè)值是異常值,用歸一化的方法后,正常的1,2就會(huì)被“擠”到一起去。如果不幸的是1和2的分類標(biāo)簽還是相反的,那么,當(dāng)我們用梯度下降來做分類模型訓(xùn)練時(shí),模型會(huì)需要更長(zhǎng)的時(shí)間收斂,因?yàn)閷颖痉珠_需要更大的努力!而標(biāo)準(zhǔn)化在這方面就做得很好,至少它不會(huì)將樣本“擠到一起”。
2、標(biāo)準(zhǔn)化更符合統(tǒng)計(jì)學(xué)假設(shè)
對(duì)一個(gè)數(shù)值特征來說,很大可能它是服從正態(tài)分布的。標(biāo)準(zhǔn)化其實(shí)是基于這個(gè)隱含假設(shè),只不過是略施小技,將這個(gè)正態(tài)分布調(diào)整為均值為0,方差為1的標(biāo)準(zhǔn)正態(tài)分布而已。
四、什么時(shí)候不需要標(biāo)準(zhǔn)化/歸一化
Tree-based models doesn’t depend on scaling
Non-tree-based models hugely depend on scaling
有時(shí)候,我們必須要特征在0到1之間,此時(shí)就只能用歸一化。當(dāng)然,也不是所有的模型都需要做歸一的,比如模型算法里面有沒關(guān)于對(duì)距離的衡量,沒有關(guān)于對(duì)變量間標(biāo)準(zhǔn)差的衡量。比如decision tree 決策樹,他采用算法里面沒有涉及到任何和距離等有關(guān)的,所以在做決策樹模型時(shí),通常是不需要將變量做標(biāo)準(zhǔn)化的。
五、sklearn代碼實(shí)現(xiàn)
python三方包sklearn提供了方便的接口來進(jìn)行數(shù)據(jù)的預(yù)處理——標(biāo)準(zhǔn)化和歸一化。
1、標(biāo)準(zhǔn)化
函數(shù) scale 為數(shù)組形狀的數(shù)據(jù)集的標(biāo)準(zhǔn)化提供了一個(gè)快捷實(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_scaled = preprocessing.scale(X_train)
>>> X_scaled
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
經(jīng)過縮放后的數(shù)據(jù)具有零均值以及標(biāo)準(zhǔn)方差:
array([ 0., 0., 0.])
>>> X_scaled.std(axis=0)
array([ 1., 1., 1.])
preprocessing 模塊還提供了一個(gè)實(shí)用類 StandardScaler ,它實(shí)現(xiàn)了轉(zhuǎn)化器的API來計(jì)算訓(xùn)練集上的平均值和標(biāo)準(zhǔn)偏差,以便以后能夠在測(cè)試集上重新應(yīng)用相同的變換:
>>> 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...]])
縮放類對(duì)象可以在新的數(shù)據(jù)上實(shí)現(xiàn)和訓(xùn)練集相同縮放操作:
>>>
>>> X_test = [[-1., 1., 0.]]
>>> scaler.transform(X_test)
array([[-2.44..., 1.22..., -0.26...]])
fit、fit_transform和transform的用法區(qū)別:
fit函數(shù)直接對(duì)數(shù)據(jù)集進(jìn)行標(biāo)準(zhǔn)化,而fit_transform則是不僅對(duì)數(shù)據(jù)集進(jìn)行處理(fit),還會(huì)存儲(chǔ)fit的參數(shù),然后transform使用儲(chǔ)存好的相同參數(shù)對(duì)別的數(shù)據(jù)進(jìn)行處理。
2、歸一化
使用 MinMaxScaler 和 MaxAbsScaler 可以方便的實(shí)現(xiàn)歸一化。
使用這種縮放的目的包括實(shí)現(xiàn)特征極小方差的魯棒性以及在稀疏矩陣中保留零元素。
以下是一個(gè)將簡(jiǎn)單的數(shù)據(jù)矩陣縮放到[0, 1]的例子:
... [ 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. ]])
同樣的轉(zhuǎn)換實(shí)例可以被用與在訓(xùn)練過程中不可見的測(cè)試數(shù)據(jù):實(shí)現(xiàn)和訓(xùn)練數(shù)據(jù)一致的縮放和移位操作:
>>> 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]])
類 MaxAbsScaler 的工作原理非常相似,但是它只通過除以每個(gè)特征的最大值將訓(xùn)練數(shù)據(jù)特征縮放至 [-1, 1] 范圍內(nèi),這就意味著,訓(xùn)練數(shù)據(jù)應(yīng)該是已經(jīng)零中心化或者是稀疏數(shù)據(jù)。 例子::用先前例子的數(shù)據(jù)實(shí)現(xiàn)最大絕對(duì)值縮放操作。
3、 縮放單個(gè)樣本以具有單位范數(shù)
函數(shù) normalize 提供了一個(gè)快速簡(jiǎn)單的方法在類似數(shù)組的數(shù)據(jù)集上執(zhí)行操作。
這個(gè)目前還不太懂,以后再進(jìn)行補(bǔ)充。
參考:
Sklearn官方文檔
[機(jī)器學(xué)習(xí)] 數(shù)據(jù)特征 標(biāo)準(zhǔn)化和歸一化你了解多少?