Preprocessing Data : 數據特徵標準化和歸一化

Ryan Lu
AI反斗城
Published in
8 min readJan 11, 2019

一、標準化/歸一化定義

歸一化和標準化經常被搞混,程度還比較嚴重,非常干擾大家的理解。為了方便後續的討論,必須先明確二者的定義。

  • 歸一化:
    就是將訓練集中某一列數值特徵(假設是第i行)的值縮放到0和1之間。方法如下所示:
  • 標準化:
    就是將訓練集中某一列數值特徵(假設是第i行)的值縮放成均值為0,方差為1的狀態。如下所示:
  • 歸一化和標準化的相同點都是對某個特徵(column)進行縮放(scaling)而不是對某個樣本的特徵向量(row)進行縮放。對特徵向量(row)進行縮放是毫無意義的(暗坑1)比如三列特徵:身高、體重、血壓。每一條樣本(row)就是三個這樣的值,對這個row無論是進行標準化還是歸一化都是好笑的,因為不能將身高、體重和血壓混到一起去!
  • 在線性代數中,將一個向量除以向量的長度,也被稱為標準化,不過這裡的標準化是將向量變為長度為1的單位向量,它和我們這裡的標準化不是一回事(暗坑2)。

二、標準化/歸一化的好處

2.1 提升模型精度

在機器學習算法的目標函數(例如SVM的RBF內核或線性模型的l1和l2正則化),許多學習算法中目標函數的基礎都是假設所有的特徵都是零均值並且具有同一階數上的平方差。如果某個特徵的平方差比其他特徵大幾個數量級,那麼它就會在學習算法中佔據主導位置,導致學習器並不能像我們說期望的那樣,從其他特徵中學習。

舉一個簡單的例子,在KNN中,我們需要計算待分類點與所有實例點的距離。假設每個實例點(instance)由n個features構成。如果我們選用的距離度量為歐式距離,如果數據預先沒有經過歸一化/標準化歸一化,那麼那些絕對值大的特徵在歐式距離計算的時候起了決定性作用。下圖中x2的取值範圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,所以這就會造成精度的損失。所以歸一化很有必要,可以讓各個特徵對結果做出的貢獻相同。

數據歸一化處理主要包括數據同趨化處理和無量綱化處理兩個方面。數據同趨化處理主要解決不同性質數據問題,對不同性質指標直接加總不能正確反映不同作用力的綜合結果,須先考慮改變逆指標數據性質,使所有指標對測評方案的作用力同趨化,再加總才能得出正確結果。數據無量綱化處理主要解決數據的可比性。經過上述標準化處理,原始數據均轉換為無量綱化指標測評值,即各指標值都處於同一個數量級別上,可以進行綜合測評分析。

從經驗上說,歸一化是讓不同維度之間的特徵在數值上有一定比較性,可以大大提高分類器的準確性。

2.2 提升收斂速度

對於線性model來說,數據歸一化後,最優解的尋優過程明顯會變得平緩,更容易正確的收斂到最優解。
如下圖,x1的取值為0–2000,而x2的取值為1–5,假如只有這兩個特徵,對其進行優化時,會得到一個窄長的橢圓形,導致在梯度下降時,梯度的方向為垂直等高線的方向而走之字形路線,這樣會使迭代很慢,相比之下,右圖的迭代就會很快(理解:也就是步長走多走少方向總是對的,不會走偏)

比較這兩個圖,前者是沒有經過歸一化的,在梯度下降的過程中,走的路徑更加的曲折,而第二個圖明顯路徑更加平緩,收斂速度更快。對於神經網絡模型,避免飽和是一個需要考慮的因素,通常參數的選擇決定於輸入數據的大小範圍。

三、標準化/歸一化的對比分析

首先明確,在機器學習中,標準化是更常用的手段,歸一化的應用場景是有限的。我總結原因有兩點:

  • 標準化更好保持了樣本間距。當樣本中有異常點時,歸一化有可能將正常的樣本“擠”到一起去。比如三個樣本,某個特徵的值為1, 2, 10000,假設10000這個值是異常值,用歸一化的方法後,特徵值變為0, 0.0001, 1,正常的1,2就會被“擠”到一起去。如果不幸的是1和2的分類標籤還是相反的,那麼當用梯度下降來做分類模型訓練時,模型會需要更長的時間收斂,因為將樣本分開需要更大的努力!而標準化在這方面就做得很好,特徵值變為-0.5574, -0.5572, 1.1547,至少它不會將樣本“擠到一起”。
  • 標準化更符合統計學假設。對一個數值特徵來說,很大可能它是服從常態分佈的。標準化其實是基於這個隱含假設,只不過是略施小技,將這個常態分佈調整為均值為0,方差為1的標準常態分佈而已。

所以,下面的討論我們先集中分析標準化在機器學習中運用的情況,在文章末尾,簡單探討一下歸一化的使用場景。這樣更能凸顯重點,又能保持內容的完整性,暫時忘記歸一化,讓我們focus到標準化上吧。

四、邏輯回歸必須要進行標準化嗎?

無論你回答必須或者不必須,你都是錯的!真正的答案是,這取決於我們的邏輯回歸是不是用L1、L2正則(即算歐式距離)

如果你不用正則,那麼,標準化並不是必須的,如果你用正則,那麼標準化是必須的。(暗坑3)

因為不用正則時,損失函數只是僅僅在度量預測與真實的差距,加上正則後,我們的損失函數除了要度量上面的差距外,還要度量參數值是否足夠小。而參數值的大小程度或者說大小的級別是與特徵的數值範圍相關的。

舉例來說,我們用體重預測身高,體重用kg衡量時,訓練出的模型是:身高=體重*x x就是我們訓練出來的參數。
當我們的體重用噸來衡量時,x的值就會擴大為原來的1000倍。
在上面兩種情況下,都用L1正則的話,顯然對模型的訓練影響是不同的。

假如不同的特徵的數值範圍不一樣,有的是0到0.1,有的是100到10000,那麼,每個特徵對應的參數大小級別也會不一樣,在L1正則時,是簡單將參數的絕對值相加,因為它們的大小級別不一樣,就會導致L1最後只會對那些級別比較大的參數有作用,那些小的參數都被忽略了。

如果你回答到這裡,面試官應該基本滿意了,但是他可能會進一步考察你,如果不用正則,那麼標準化對邏輯回歸有什麼好處嗎?

答案是有好處,進行標準化後,得出的參數值的大小可以反應出不同特徵對樣本label的貢獻度,方便我們進行特徵篩選。如果不做標準化,是不能這樣來篩選特徵的。

答到這裡,有些厲害的面試官可能會繼續問,做標準化有什麼注意事項嗎?

最大的注意事項就是先拆分出test集,不要在整個數據集上做標準化,因為那樣會將test集的信息引入到訓練集中,這是一個非常容易犯的錯誤!

五、需要標準化數據的算法

PCA、SVM、 SGD、linear/logistic regression 、Kmeans、KNN、NN(如果有用L1/L2 regularization)涉及到距離有關的算法,或者聚類的話,都是需要先做變量標準化的。
DecisionTree 、0/1取值的特徵、 基於平方損失的最小二乘法OLS,不需要歸一化。

如果將預測房價的變量,用PCA方法來降維,會不會對結果產生影響。

我們看出在標準化前,用一個成分就能解釋99%的變量變化,而標準化後一個成分解釋了75%的變化。主要原因就是在沒有標準化的情況下,我們給了居住面積過大權重,造成了這個結果。

那還有什麼情況下,不做歸一化會發生這麼大的影響?

舉個例子,我們將3個城市分成兩類,變量有面積和教育程度佔比;三個城市分別是這樣的:

  1. 城市A,面積挺大,但是整天發生偷盜搶劫,教育程度低;
  2. 城市B,面積也挺大,治安不錯,教育程度高;
  3. 城市C,面積中等,治安也挺好,教育程度也挺高;

我們如果不做標準化,直接做聚類模型的話,A城市和B城市分在一塊兒了,你想想,一個治安挺好的城市和一個整體偷盜搶劫城市分在一起,實在是有點違反常理。

[參考]
https://blog.csdn.net/zhaobinbin2015/article/details/81228027
其他常見的數據歸一化方法:
https://blog.csdn.net/pipisorry/article/details/52247379

--

--