1. 程式人生 > >一文詳解特徵縮放、標準化、歸一化的定義、區別、特點和作用

一文詳解特徵縮放、標準化、歸一化的定義、區別、特點和作用

# 前言 我在學李巨集毅的機器學習課程,助教給的迴歸作業程式碼中有資料標準化的操作。 我聽過資料標準化,還有歸一化、批量歸一化等等,但不是很懂,不知道他們具體是什麼、有什麼區別。 百度上找了挺多文章,講得都不是很系統,比如大多文章都沒講懂標準化和歸一化的區別或者是不同文章講的內容矛盾了。 用谷歌一搜,就找到了很多很有價值的相關文章,然後我也寫了這篇文章做個記錄。 相對來講,中文社群要比英文社群差些,部分原因是名詞濫用或中英翻譯問題,比如標準化和歸一化、常量指標和指標常量。emmm # 概要 本文主要講解了以下內容 1. 特徵縮放是什麼/特徵縮放的定義 2. 歸一化是什麼/歸一化的定義 3. 標準化是什麼/標準化的定義 4. 歸一化和標準化的區別 5. 為什麼要進行特徵縮放/特徵縮放有什麼作用 6. 有哪些常見的特徵縮放方法 7. 什麼時候適合進行特徵縮放/特徵縮放方法的應用 # 名詞定義 這幾個詞是有區別的,特別是標準化和歸一化,不要濫用(在本文中也請區分這幾個詞)。 | 中文 | 英文 | | :------: | :------------------------------------: | | 特徵縮放 | Feature Scaling | | 標準化 | Standardization(Z-Score Normalization) | | 歸一化 | Normalization | 可以認為Feature Scaling包括Standardization和Normalization,其中Standardization可以叫做Z-Score Normalization。 # 為什麼需要進行特徵縮放 使用單一指標對某事物進行評價並不合理,因此需要多指標綜合評價方法。多指標綜合評價方法,就是把描述某事物不同方面的多個指標綜合起來得到一個綜合指標,並通過它評價、比較該事物。 由於性質不同,不同評價指標通常具有不同的量綱和數量級。當各指標相差很大時,如果直接使用原始指標值計算綜合指標,就會突出數值較大的指標在分析中的作用、削弱數值較小的指標在分析中的作用。 為消除各評價指標間量綱和數量級的差異、保證結果的可靠性,就需要對各指標的原始資料進行特徵縮放(也有資料標準化、資料歸一化的說法,但不準確,所以不推薦這麼叫)。 由於量綱和數量級不同,所以需要特徵縮放。特徵縮放可以顯著提升部分機器學習演算法的效能,但它對部分演算法沒有幫助。 ## 基於梯度下降的演算法(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] - 何時使用 當處理具有嚴格數值範圍要求的資料(比如圖片)時,這非常有用。 # 參考連結 下面幾篇文章確實講得很清晰、精準,作為機器學習新手的我都能看懂。 這篇文章的內容也都是從下面這些文章裡提取總結出來的,所以如果我上面哪裡講得不清楚、不好的話,建議直接檢視下面幾篇文章或者直接谷歌搜尋相關名詞。 1. https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E6%A0%87%E5%87%86%E5%8C%96 2. https://www.analyticsvidhya.com/blog/2020/04/feature-scaling-machine-learning-normalization-standardization/ 這篇文章講得很不錯,建議參考。 3. https://medium.com/greyatom/why-how-and-when-to-scale-your-features-4b30ab09db5e 這篇文章講得很不錯,建議參考。 4. https://machinelearningmastery.com/normalize-standardize-machine-learning-data-weka/ 這篇文章講了Weka的使用,但我們並不需要看Weka怎麼用,看文章裡其它理論部分即可。 5. https://towardsdatascience.com/understand-data-normalization-in-machine-learning-8ff3062101f0 這篇文章更偏向於實踐一些,也很不錯。 6. https://en.wikipedia.org/wiki/Feature_scaling --- 作者:[@臭鹹魚](https://github.com/chouxianyu) 轉載請註明出處: 歡迎討論和交