標准化和歸一化


一、是什么?

1. 歸一化

  是為了將數據映射到0~1之間,去掉量綱的過程,讓計算更加合理,不會因為量綱問題導致1米與100mm產生不同。

  歸一化是線性模型做數據預處理的關鍵步驟,比如LR,非線性的就不用歸一化了。

     歸一化就是讓不同維度之間的特征在數值上有一定比較性,可以大大提高分類器的准確性。

缺點:這種方法有個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義

另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小數據場景

2. z-標准化

  消除分布產生的度量偏差,例如:班級數學考試,數學成績在90-100之間,語文成績在60-100之間,那么,小明數學90,語文100,小花數學95,語文95,如何評價兩個綜合成績好壞的數學處理方式。

 

二、怎么選?

1. 標准化

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

(1)邏輯回歸必須要進行標准化嗎?

答案:這取決於我們的邏輯回歸是不是用正則。

  如果你不用正則,那么,標准化並不是必須的,如果你用正則,那么標准化是必須的。(暗坑3)
  為什么呢?
  因為不用正則時,我們的損失函數只是僅僅在度量預測與真實的差距,加上正則后,我們的損失函數除了要度量上面的差距外,還要度量參數值是否足夠小。而參數值的大小程度或者說大小的級別是與特征的數值范圍相關的。舉例來說,我們用體重預測身高,體重用kg衡量時,訓練出的模型是: 身高 = 體重*x ,x就是我們訓練出來的參數。
當我們的體重用噸來衡量時,x的值就會擴大為原來的1000倍。
  在上面兩種情況下,都用L1正則的話,顯然對模型的訓練影響是不同的。

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

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

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

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

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

舉例:簡單的預測房價的線性回歸模型:

  有一組關於房價和房子變量的數據集,通過房子的面積,房間數量,房子的層數來預測房價。

  占地面積1800尺,房間數量3間,房子層數2層-> 房價?;為了方便對比,我們分別看一下標准化前和標准化后的模型輸出分布是怎么樣的。

  可以看出,標准化前后變量的系數不同,誤差不同,但是R平方,和變量的t值是相同的

  現在我們來預測一個1590尺,3個卧室,3層的房屋

  我們發現預測出來的房價是一樣的。
  這時你一定會想,既然結果都一樣,做不做標准化,都一樣嘛。說到這里,我們再看一下,建模時尋找最優解的時間吧。

  為什么標准化后的建模時間會短呢?這時候就要說起尋找系數最優解-梯度下降法。

  標准化前,由於變量的單位相差很大,導致了橢圓型的梯度輪廓。標准化后,把變量變成統一單位,產生了圓形輪廓。由於梯度下降是按切線方向下降,所以導致了系統在橢圓輪廓不停迂回地尋找最優解,而圓形輪廓就能輕松找到了。

  還有一種比較極端的情況,有時沒做標准化,模型始終找不到最優解,一直不收斂。

(2)PCA需要標准化嗎?

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

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

(3)Kmeans,KNN需要標准化嗎?

  Kmeans,KNN一些涉及到距離有關的算法,或者聚類的話,都是需要先做變量標准化的。

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

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

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

總結:

  在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,Z-score standardization表現更好

基於樹的模型不需要標准化;

用到正則的線性模型一定要標准化,沒用到正則的線性模型不一定要標准化, 但標准化可以加快收斂;

基於距離或聚類需要先做標准化,如KNN、kmeans

PCA最好先做標准化

 

2. 歸一化

  模型算法里面有沒關於對距離的衡量,沒有關於對變量間標准差的衡量。比如decision tree 決策樹,他采用算法里面沒有涉及到任何和距離等有關的,所以在做決策樹模型時,通常是不需要將變量做標准化的。

  在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用歸一化方法。比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍。有時候,我們必須要特征在0到1之間,此時就只能用歸一化。有種svm可用來做單分類,里面就需要用到歸一化。

 

三、怎么用?

#導入數據到data變量中
import pandas
data = pandas.read_csv('路徑.csv')

#(一)Min-Max 標准化

from sklearn.preprocessing import MinMaxScaler
#初始化一個scaler對象
scaler = MinMaxScaler()
#調用scaler的fit_transform方法,把我們要處理的列作為參數傳進去

data['標准化后的A列數據'] = scaler.fit_transform(data['A列數據'])
data['標准化后的B列數據'] = scaler.fit_transform(data['B列數據'])

#(二)Z-Score標准化 (可在scale中直接實現)

from sklearn.preprocessing import scale
data['標准化后的A列數據'] = scale(data['A列數據'])
data['標准化后的B列數據'] = scale(data['B列數據'])

# (三) Normalizer歸一化

from sklearn.preprocessing import Normalizer
scaler = Normalizer()
#歸一化可以同時處理多個列,所以[0]第一個進行賦值
data['歸一化后的A列數據'] = scaler.fit_transform(data['A列數據'])[0]
data['歸一化后的B列數據'] = scaler.fit_transform(data['B列數據'])[0]

  

 

參考文獻:

【1】關於數據建模變量標准化

【2】機器學習面試之歸一化與標准化

【3】[機器學習] 數據特征 標准化和歸一化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM