前言
我在學李宏毅的機器學習課程,助教給的回歸作業代碼中有數據標准化的操作。
我聽過數據標准化,還有歸一化、批量歸一化等等,但不是很懂,不知道他們具體是什么、有什么區別。
百度上找了挺多文章,講得都不是很系統,比如大多文章都沒講懂標准化和歸一化的區別或者是不同文章講的內容矛盾了。
用谷歌一搜,就找到了很多很有價值的相關文章,然后我也寫了這篇文章做個記錄。
相對來講,中文社區要比英文社區差些,部分原因是名詞濫用或中英翻譯問題,比如標准化和歸一化、常量指針和指針常量。emmm
概要
本文主要講解了以下內容
- 特征縮放是什么/特征縮放的定義
- 歸一化是什么/歸一化的定義
- 標准化是什么/標准化的定義
- 歸一化和標准化的區別
- 為什么要進行特征縮放/特征縮放有什么作用
- 有哪些常見的特征縮放方法
- 什么時候適合進行特征縮放/特征縮放方法的應用
名詞定義
這幾個詞是有區別的,特別是標准化和歸一化,不要濫用(在本文中也請區分這幾個詞)。
中文 | 英文 |
---|---|
特征縮放 | Feature Scaling |
標准化 | Standardization(Z-Score Normalization) |
歸一化 | Normalization |
可以認為Feature Scaling包括Standardization和Normalization,其中Standardization可以叫做Z-Score Normalization。
為什么需要進行特征縮放
背景:多指標量綱和數量級不同
使用單一指標對某事物進行評價並不合理,因此需要多指標綜合評價方法。多指標綜合評價方法,就是把描述某事物不同方面的多個指標綜合起來得到一個綜合指標,並通過它評價、比較該事物。
由於性質不同,不同評價指標通常具有不同的量綱和數量級。當各指標相差很大時,如果直接使用原始指標值計算綜合指標,就會突出數值較大的指標在分析中的作用、削弱數值較小的指標在分析中的作用。
為消除各評價指標間量綱和數量級的差異、保證結果的可靠性,就需要對各指標的原始數據進行特征縮放(也有數據標准化、數據歸一化的說法,但這些叫法不准確,所以不推薦)。
由於量綱和數量級不同,所以需要特征縮放。特征縮放可以顯著提升部分機器學習算法的性能,但它對部分算法沒有幫助。
不進行特征縮放會有什么后果
假如特征\(x_1\)的數值是100左右,特征\(x_2\)的數值是1左右,方程為\(y=b+w_1x_1+w_2x_2\),那\(w_1\)對\(y\)的影響就更大,對Loss的影響也更大,損失函數關於\(w_1\)的梯度也更大,而損失函數關於\(w_2\)的梯度卻很小,因此兩個特征就不能使用相同的學習率。
不進行特征縮放的話,Error Surface就是一個橢圓,梯度下降時不一定是朝着最優點(圓心),速度就慢。
如果進行了特征縮放,Error Surface會盡可能趨近於圓,因此梯度下降時會一直朝着最優點(圓心),所以速度快。
各類算法是否需要進行特征縮放
基於梯度下降的算法(Gradient Descent Based Algorithms)
在基於梯度下降進行優化的算法中,需要進行特征縮放,比如線性回歸、邏輯回歸、神經網絡等。
因為計算梯度時會使用特征的值,如果各特征的的取值范圍差異很大,不同特征對應梯度的值就會差異很大。
為保證平滑走到最優點、按相同速率更新各特征的權重,需要進行特征放縮。
通過特征放縮,可以使數值范圍變小,進而加速梯度下降。
基於距離的算法(Distance-Based Algorithms)
在基於距離進行優化的算法中,需要進行特征縮放,比如K近鄰、K-Means、SVM、PCA等。
因為這些算法是基於數據點的特征值計算它們的距離,距離越小則兩者越相似。
基於樹的算法(Tree-Based Algorithms)
基於樹的算法(比如決策樹)對特征(features)的數值范圍並不敏感,不需要進行特征縮放。
決策樹僅基於單個feature拆分節點,並不受其它feature的影響。
線性判別分析、朴素貝葉斯等算法
這兩個算法處理了特征數量級差異大的問題,因此不需要進行特征縮放。
四種特征縮放的方法
標准化和歸一化都可以實現特征縮放,但兩者是有區別的。
假設我們有一份數據\(x\),它有\(N\)行\(M\)列,即有\(N\)個對象,每個對象有\(M\)個特征,\(x^i_j\)表示對象\(i\)的特征\(j\)。
- Standardization(Z-Score Normalization)
- Mean Normalization
- Min-Max Normalization
- Unit Vector Normalization/Scaling to unit length
標准化(Standardization/Z-Score Normalization)
-
定義
公式為\(\hat x[:,j]=\frac{x[:,j]-mean(x[:,j])}{std(x[:,j])}\),其中\(mean\)代表平均值,\(std\)代表標准差,
\(mean(x[:,j])=\frac{1}{N}\cdot\sum_{i=1}^Nx[i,j]\),
\(std(x[:,j])=\sqrt{\frac{1}{N-1}\cdot\sum^N_{i=1}(x[i,j]-\mu_j)^2}\)。
-
特點
使數據的平均值變為0、標准差變為1,不改變數據的分布類型,數值范圍不一定,消除了數據的量綱差異。
-
假設
標准化假設數據是正態分布,但這個要求並不十分嚴格,如果數據是正態分布則該技術會更有效。
-
何時使用
當我們使用的算法假設數據是正態分布時,可以使用Standardization,比如線性回歸、邏輯回歸、線性判別分析。
因為Standardization使數據平均值為0,也可以在一些假設數據中心為0(zero centric data)的算法中使用,比如主成分分析(PCA)。
歸一化(Normalization)
-
特點
把數據調整到[0,1],並且消除了數據的量綱差異。
也可以把數據調到[-1,1],在使用SVM和Adaboost時就需要這樣。
-
何時使用
當我們不知道數據分布時或者我們知道數據不是正態分布時,這是一個很好的方法。
換種說法就是,當我們使用的算法沒有假設數據的分布類型時,就可以使用Normalization,比如K近鄰算法和人工神經網絡。
Mean Normalization
-
定義
\(\hat x[:,j]=\frac{x[:,j]-mean(x[:,j])}{max(x[:,j])-min(x[:,j])}\)
其中\(mean\)代表平均值,\(max\)代表最大值,\(min\)代表最小值。
-
特點
把數據調到[-1,1],平均值為0
-
何時使用
一些假設數據中心為0(zero centric data)的算法,比如主成分分析(PCA)。
Min-Max Normalization
-
定義
\(\hat x[:,j]=\frac{x[:,j]-min(x[:,j])}{max(x[:,j])-min(x[:,j])}\)
其中\(max\)代表最大值,\(min\)代表最小值。
-
特點
把數據調到[0,1]
-
何時使用
當處理具有嚴格數值范圍要求的數據(比如圖片)時,這非常有用。
Unit Vector Normalization/Scaling to unit length
-
定義
\(\hat x[i,:]=\frac{x[i,:]}{||x[i,:]||}\)
把每個對象的特征向量變成單位長度。
-
特點
把數據調到[0,1]
-
何時使用
當處理具有嚴格數值范圍要求的數據(比如圖片)時,這非常有用。
參考鏈接
下面幾篇文章確實講得很清晰、精准,作為機器學習新手的我都能看懂。
這篇文章的內容也都是從下面這些文章里提取總結出來的,所以如果我上面哪里講得不清楚、不好的話,建議直接查看下面幾篇文章或者直接谷歌搜索相關名詞。
-
這篇文章講得很不錯,建議參考。
-
https://medium.com/greyatom/why-how-and-when-to-scale-your-features-4b30ab09db5e
這篇文章講得很不錯,建議參考。
-
https://machinelearningmastery.com/normalize-standardize-machine-learning-data-weka/
這篇文章講了Weka的使用,但我們並不需要看Weka怎么用,看文章里其它理論部分即可。
-
https://towardsdatascience.com/understand-data-normalization-in-machine-learning-8ff3062101f0
這篇文章更偏向於實踐一些,也很不錯。
作者:@臭咸魚
轉載請注明出處:https://www.cnblogs.com/chouxianyu/
歡迎討論和交流!