標準化和歸一化的區別

1、是什麼?

1. 歸一化

  是爲了將數據映射到0~1之間,去掉量綱的過程,讓計算更加合理,不會由於量綱問題致使1米與100mm產生不一樣。python

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

     歸一化就是讓不一樣維度之間的特徵在數值上有必定比較性,能夠大大提升分類器的準確性。算法

缺點:這種方法有個缺陷就是當有新數據加入時,可能致使max和min的變化,須要從新定義機器學習

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

2. z-標準化

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

 

2、怎麼選?

1. 標準化

  • 標準化更好保持了樣本間距。當樣本中有異常點時,歸一化有可能將正常的樣本「擠」到一塊兒去。好比三個樣本,某個特徵的值爲1,2,10000,假設10000這個值是異常值,用歸一化的方法後,正常的1,2就會被「擠」到一塊兒去。若是不幸的是1和2的分類標籤仍是相反的,那麼,當咱們用梯度降低來作分類模型訓練時,模型會須要更長的時間收斂,由於將樣本分開須要更大的努力!而標準化在這方面就作得很好,至少它不會將樣本「擠到一塊兒」。
  • 標準化更符合統計學假設:對一個數值特徵來講,很大可能它是服從正態分佈的。標準化實際上是基於這個隱含假設,只不過是略施小技,將這個正態分佈調整爲均值爲0,方差爲1的標準正態分佈而已。

(1)邏輯迴歸必需要進行標準化嗎?

答案:這取決於咱們的邏輯迴歸是否是用正則。spa

  若是你不用正則,那麼,標準化並非必須的,若是你用正則,那麼標準化是必須的。(暗坑3)
  爲何呢?
  由於不用正則時,咱們的損失函數只是僅僅在度量預測與真實的差距,加上正則後,咱們的損失函數除了要度量上面的差距外,還要度量參數值是否足夠小。而參數值的大小程度或者說大小的級別是與特徵的數值範圍相關的。舉例來講,咱們用體重預測身高,體重用kg衡量時,訓練出的模型是: 身高 = 體重*x ,x就是咱們訓練出來的參數。
當咱們的體重用噸來衡量時,x的值就會擴大爲原來的1000倍。
  在上面兩種狀況下,都用L1正則的話,顯然對模型的訓練影響是不一樣的。.net

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

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

  答案是有好處,進行標準化後,咱們得出的參數值的大小能夠反應出不一樣特徵對樣本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可用來作單分類,裏面就須要用到歸一化。

 

3、怎麼用?

#導入數據到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】[機器學習] 數據特徵 標準化和歸一化

相關文章
相關標籤/搜索