為什么要對特征進行歸一化?
一句話描述:1)歸一化后加快了梯度下降求最優解的速度
2)歸一化有可能提高精度
1:歸一化后加快了梯度下降求最優解的速度
藍色的圈圈圖代表的是兩個特征的等高線。其中左圖兩個特征X1和X2的區間相差非常大,X1區間是[0,2000],X2區間是[1,5],其所形成的等高線非常尖。
當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;
而右圖對兩個原始特征進行了歸一化,其對應的等高線顯得很圓,在梯度下降進行求解時能較快的收斂。
因此如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。
如果不歸一化,不同變量的損失梯度圖可能會呈現一個橢圓,這樣在梯度下降的時候迭代次數會比較多;歸一化后損失的等高線圖就是一個圓,任意一點的切線方向便是梯度下降的方向,這樣便減少了迭代次數,加快了模型訓練。
2.提升模型的精度
歸一化的另一好處是提高精度,這在涉及到一些距離計算的算法時效果顯著,比如算法要計算歐氏距離,上圖中x2的取值范圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,所以這就會造成精度的損失。所以歸一化很有必要,他可以讓各個特征對結果做出的貢獻相同。
歸一化的方法有哪些?
線性歸一化,線性歸一化會把輸入數據都轉換到[0 1]的范圍,公式如下
0均值標准化,0均值歸一化方法將原始數據集歸一化為均值為0、方差1的數據集,該種歸一化方式要求原始數據的分布可以近似為高斯分布,否則歸一化的效果會變得很糟糕。
-
其中,μ和σ 分別代表均值和標准差
進一步明確二者含義
- 歸一化和標准化的相同點都是對某個特征(column)進行縮放(scaling)而不是對某個樣本的特征向量(row)進行縮放。對特征向量進行縮放是毫無意義的(暗坑1) 比如三列特征:身高、體重、血壓。每一條樣本(row)就是三個這樣的值,對這個row無論是進行標准化還是歸一化都是好笑的,因為你不能將身高、體重和血壓混到一起去!
- 在線性代數中,將一個向量除以向量的長度,也被稱為標准化,不過這里的標准化是將向量變為長度為1的單位向量,它和我們這里的標准化不是一回事兒,不要搞混哦(暗坑2)。
哪些算法需要進行歸一化?
包含w x + b的模型,一般需要歸一化:
- 線性回歸
- 邏輯回歸
- svm
- 神經網絡
不需要做歸一化的:
- 決策樹。其節點在分裂的時候往往看的是信息增益(比)
- GBDT,XGBOOST
概率模型不需要歸一化,因為它們不關心變量的值,而是關心變量的分布和變量之間的條件概率,如決策樹、rf。而像svm、lr、KNN、KMeans之類的最優化問題就需要歸一化。(小伙伴要記清楚哦,或者用sklearn里面的庫跑一下模型看看呢)、
關於歸一化方法的選擇
1) 在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,第二種方法(Z-score standardization)表現更好。
2) 在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用第一種方法或其他歸一化方法。比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍。
總結來說,在算法、后續計算中涉及距離度量(聚類分析)或者協方差分析(PCA、LDA等)的,同時數據分布可以近似為狀態分布,應當使用0均值的歸一化方法。其他應用中更具需要選用合適的歸一化方法。
----------------------------------------------------------------------------------------------
三、標准化/歸一化的對比分析
首先明確,在機器學習中,標准化是更常用的手段,歸一化的應用場景是有限的。我總結原因有兩點:
- 1、標准化更好保持了樣本間距。當樣本中有異常點時,歸一化有可能將正常的樣本“擠”到一起去。比如三個樣本,某個特征的值為1,2,10000,假設10000這個值是異常值,用歸一化的方法后,正常的1,2就會被“擠”到一起去。如果不幸的是1和2的分類標簽還是相反的,那么,當我們用梯度下降來做分類模型訓練時,模型會需要更長的時間收斂,因為將樣本分開需要更大的努力!而標准化在這方面就做得很好,至少它不會將樣本“擠到一起”。
- 2、標准化更符合統計學假設
對一個數值特征來說,很大可能它是服從正態分布的。標准化其實是基於這個隱含假設,只不過是略施小技,將這個正態分布調整為均值為0,方差為1的標准正態分布而已。
所以,下面的討論我們先集中分析標准化在機器學習中運用的情況,在文章末尾,簡單探討一下歸一化的使用場景。這樣更能凸顯重點,又能保持內容的完整性,暫時忘記歸一化,讓我們focus到標准化上吧。
四、邏輯回歸必須要進行標准化嗎?
我覺得,回答完上面的問題,就可以很好地掌握標准化在機器學習中的運用。
首先,請嘗試自己來回答一下(暫停5秒)
無論你回答必須或者不必須,你都是錯的!
真正的答案是,這取決於我們的邏輯回歸是不是用正則。
如果你不用正則,那么,標准化並不是必須的,如果你用正則,那么標准化是必須的。(暗坑3)
為什么呢?
因為不用正則時,我們的損失函數只是僅僅在度量預測與真實的差距,加上正則后,我們的損失函數除了要度量上面的差距外,還要度量參數值是否足夠小。而參數值的大小程度或者說大小的級別是與特征的數值范圍相關的。舉例來說,我們用體重預測身高,體重用kg衡量時,訓練出的模型是: 身高 = 體重*x x就是我們訓練出來的參數。
當我們的體重用噸來衡量時,x的值就會擴大為原來的1000倍。
在上面兩種情況下,都用L1正則的話,顯然對模型的訓練影響是不同的。
假如不同的特征的數值范圍不一樣,有的是0到0.1,有的是100到10000,那么,每個特征對應的參數大小級別也會不一樣,在L1正則時,我們是簡單將參數的絕對值相加,因為它們的大小級別不一樣,就會導致L1最后只會對那些級別比較大的參數有作用,那些小的參數都被忽略了。
如果你回答到這里,面試官應該基本滿意了,但是他可能會進一步考察你,如果不用正則,那么標准化對邏輯回歸有什么好處嗎?
答案是有好處,進行標准化后,我們得出的參數值的大小可以反應出不同特征對樣本label的貢獻度,方便我們進行特征篩選。如果不做標准化,是不能這樣來篩選特征的。
答到這里,有些厲害的面試官可能會繼續問,做標准化有什么注意事項嗎?
最大的注意事項就是先拆分出test集,不要在整個數據集上做標准化,因為那樣會將test集的信息引入到訓練集中,這是一個非常容易犯的錯誤!
五、通過例子來說明
我們先從簡單的預測房價的線性回歸模型開始:
有一組關於房價和房子變量的數據集,通過房子的面積,房間數量,房子的層數來預測房價。
占地面積1800尺,房間數量3間,房子層數2層-> 房價?;
為了方便對比,我們分別看一下標准化前和標准化后的模型輸出分布是怎么樣的。
可以看出,標准化前后變量的系數不同,誤差不同,但是R平方,和變量的t值是相同的。
5.1 解釋有區別嗎?
那標准化前后得到的公式,怎么來解釋呢?
標准化前 | 標准化后 |
---|---|
如果居住面積,房間數,房間層數都是0的情況下,房子的價格為91830萬 | 如果居住面積,房間數,房間層數是各自的平均數的情況下,房子的價格為539400萬 |
當一個外行人在聽解釋的時候,一定會問,什么呀?所有東西都是0,空氣造的房子還能賣9萬?!
接着你會問,系數不同,那預測出來的房價會相同嗎?
5.2 預測值有區別嗎?
現在我們來預測一個1590尺,3個卧室,3層的房屋
標准化前房價 | 標准化后房價 |
---|---|
$406641.02 | $406641.02 |
我們發現預測出來的房價是一樣的。
這時你一定會想,既然結果都一樣,做不做標准化,都一樣嘛。說到這里,我們再看一下,建模時尋找最優解的時間吧。
5.3 花費時間有區別嗎?
標准化前處理時間 | 標准化后處理時間 |
---|---|
0.026s | 0.021s |
為什么標准化后的建模時間會短呢?這時候就要說起尋找系數最優解-梯度下降法。
標准化前,由於變量的單位相差很大,導致了橢圓型的梯度輪廓。標准化后,把變量變成統一單位,產生了圓形輪廓。由於梯度下降是按切線方向下降,所以導致了系統在橢圓輪廓不停迂回地尋找最優解,而圓形輪廓就能輕松找到了。
還有一種比較極端的情況,有時沒做標准化,模型始終找不到最優解,一直不收斂。
5.4 PCA,Kmeans,KNN需要標准化數據嗎?
這種情況下,可見標准化的重要性了吧。
我們再來看一下,如果將預測房價的變量,用PCA方法來降維,會不會對結果產生影響。
我們看出在標准化前,用一個成分就能解釋99%的變量變化,而標准化后一個成分解釋了75%的變化。 主要原因就是在沒有標准化的情況下,我們給了居住面積過大權重,造成了這個結果。
那還有什么情況下,不做歸一化會發生這么大的影響?
Kmeans,KNN一些涉及到距離有關的算法,或者聚類的話,都是需要先做變量標准化的。
舉個例子,我們將3個城市分成兩類,變量有面積和教育程度占比;三個城市分別是這樣的:
- 城市A,面積挺大,但是整天發生偷盜搶劫,教育程度低;
- 城市B,面積也挺大,治安不錯,教育程度高;
- 城市C,面積中等,治安也挺好,教育程度也挺高;
我們如果不做標准化,直接做聚類模型的話,A城市和B城市分在一塊兒了,你想想,一個治安挺好的城市和一個整體偷盜搶劫城市分在一起,實在是有點違反常理。
六、總結
Tree-based models doesn’t depend on scaling
Non-tree-based models hugely depend on scaling
有時候,我們必須要特征在0到1之間,此時就只能用歸一化。有種svm可用來做單分類,里面就需要用到歸一化,由於沒有深入研究,所以我把鏈接放上,感興趣的可以自己看。
當然,也不是所有的模型都需要做歸一的,比如模型算法里面有沒關於對距離的衡量,沒有關於對變量間標准差的衡量。比如decision tree 決策樹,他采用算法里面沒有涉及到任何和距離等有關的,所以在做決策樹模型時,通常是不需要將變量做標准化的。