專業解讀:為什麼要做特徵歸一化和標準化?

2021-03-06 數據挖掘工程師
本文解讀了一項數據預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。寫在前面Feature scaling,常見的提法有「特徵歸一化」、「標準化」,是數據預處理中的重要技術,有時甚至決定了算法能不能work以及work得好不好。談到feature scaling的必要性,最常用的2個例子可能是:

特徵間的單位(尺度)可能不同,比如身高和體重,比如攝氏度和華氏度,比如房屋面積和房間數,一個特徵的變化範圍可能是[1000, 10000],另一個特徵的變化範圍可能是[−0.1,0.2],在進行距離有關的計算時,單位的不同會導致計算結果的不同,尺度大的特徵會起決定性作用,而尺度小的特徵其作用可能會被忽略,為了消除特徵間單位和尺度差異的影響,以對每維特徵同等看待,需要對特徵進行歸一化

原始特徵下,因尺度差異,其損失函數的等高線圖可能是橢圓形,梯度方向垂直於等高線,下降會走zigzag路線,而不是指向local minimum。通過對特徵進行zero-mean and unit-variance變換後,其損失函數的等高線圖更接近圓形,梯度下降的方向震蕩更小,收斂更快,如下圖所示,圖片來自Andrew Ng。

Feature Scaling from Andrew Ng對於feature scaling中最常使用的Standardization,似乎「無腦上」就行了,本文想多探究一些為什麼,常用的feature scaling方法都有哪些?什麼情況下該使用什麼feature scaling方法?有沒有一些指導思想?所有的機器學習算法都需要feature scaling嗎?有沒有例外?損失函數的等高線圖都是橢圓或同心圓嗎?能用橢圓和圓來簡單解釋feature scaling的作用嗎?如果損失函數的等高線圖很複雜,feature scaling還有其他直觀解釋嗎?根據查閱到的資料,本文將嘗試回答上面的問題。但筆者能力有限,空有困惑,能講到哪算哪吧(微笑)。常用feature scaling方法給定數據集,令特徵向量為x,維數為D,樣本數量為R,可構成D×R的矩陣,一列為一個樣本,一行為一維特徵,如下圖所示,圖片來自Hung-yi Lee pdf-Gradient Descent:feature scaling的方法可以分成2類,逐行進行和逐列進行。逐行是對每一維特徵操作,逐列是對每個樣本操作,上圖為逐行操作中特徵標準化的示例。具體地,常用feature scaling方法如下,來自wiki,

Rescaling (min-max normalization、range scaling)

將每一維特徵線性映射到目標範圍[a,b],即將最小值映射為a,最大值映射為b,常用目標範圍為[0,1]和[−1,1],特別地,映射到[0,1]計算方式為:
均值映射為0,同時用最大值最小值的差對特徵進行歸一化,一種更常見的做法是用標準差進行歸一化,如下。

Standardization (Z-score Normalization)

每維特徵0均值1方差(zero-mean and unit-variance)
將每個樣本的特徵向量除以其長度,即對樣本特徵向量的長度進行歸一化,長度的度量常使用的是L2 norm(歐氏距離),有時也會採用L1 norm,不同度量方式的一種對比可以參見論文「CVPR2005-Histograms of Oriented Gradients for Human Detection」。
上述4種feature scaling方式,前3種為逐行操作,最後1種為逐列操作。容易讓人困惑的一點是指代混淆,Standardization指代比較清晰,但是單說Normalization有時會指代min-max normalization,有時會指代Standardization,有時會指代Scaling to unit length。計算方式上對比分析前3種feature scaling的計算方式為減一個統計量再除以一個統計量,最後1種為除以向量自身的長度減一個統計量可以看成選哪個值作為原點,是最小值還是均值,並將整個數據集平移到這個新的原點位置。如果特徵間偏置不同對後續過程有負面影響,則該操作是有益的,可以看成是某種偏置無關操作;如果原始特徵值有特殊意義,比如稀疏性,該操作可能會破壞其稀疏性。除以一個統計量可以看成在坐標軸方向上對特徵進行縮放,用於降低特徵尺度的影響,可以看成是某種尺度無關操作。縮放可以使用最大值最小值間的跨度,也可以使用標準差(到中心點的平均距離),前者對outliers敏感,outliers對後者影響與outliers數量和數據集大小有關,outliers越少數據集越大影響越小。除以長度相當於把長度歸一化,把所有樣本映射到單位球上,可以看成是某種長度無關操作,比如,詞頻特徵要移除文章長度的影響,圖像處理中某些特徵要移除光照強度的影響,以及方便計算餘弦距離或內積相似度等。稀疏數據、outliers相關的更多數據預處理內容可以參見scikit learn-5.3. Preprocessing data。從幾何上觀察上述方法的作用,圖片來自CS231n-Neural Networks Part 2: Setting up the Data and the Loss,zero-mean將數據集平移到原點,unit-variance使每維特徵上的跨度相當,圖中可以明顯看出兩維特徵間存在線性相關性,Standardization操作並沒有消除這種相關性。Standardization可通過PCA方法移除線性相關性(decorrelation),即引入旋轉,找到新的坐標軸方向,在新坐標軸方向上用「標準差」進行縮放,如下圖所示,圖片來自連結,圖中同時描述了unit length的作用——將所有樣本映射到單位球上。Effect of the operations of standardization and length normalization當特徵維數更多時,對比如下,圖片來自youtube,feature scaling comparison總的來說,歸一化/標準化的目的是為了獲得某種「無關性」——偏置無關、尺度無關、長度無關……當歸一化/標準化方法背後的物理意義和幾何含義與當前問題的需要相契合時,其對解決該問題就有正向作用,反之,就會起反作用。所以,「何時選擇何種方法」取決於待解決的問題,即problem-dependent。feature scaling 需要還是不需要下圖來自data school-Comparing supervised learning algorithms,對比了幾個監督學習算法,最右側兩列為是否需要feature scaling。Comparing supervised learning algorithms什麼時候需要feature scaling?

涉及或隱含距離計算的算法,比如K-means、KNN、PCA、SVM等,一般需要feature scaling,因為:

zero-mean一般可以增加樣本間餘弦距離或者內積結果的差異,區分力更強,假設數據集集中分布在第一象限遙遠的右上角,將其平移到原點處,可以想像樣本間餘弦距離的差異被放大了。在模版匹配中,zero-mean可以明顯提高響應結果的區分度。就歐式距離而言,增大某個特徵的尺度,相當於增加了其在距離計算中的權重,如果有明確的先驗知識表明某個特徵很重要,那麼適當增加其權重可能有正向效果,但如果沒有這樣的先驗,或者目的就是想知道哪些特徵更重要,那麼就需要先feature scaling,對各維特徵等而視之。增大尺度的同時也增大了該特徵維度上的方差,PCA算法傾向於關注方差較大的特徵所在的坐標軸方向,其他特徵可能會被忽視,因此,在PCA前做Standardization效果可能更好,如下圖所示,圖片來自scikit learn-Importance of Feature Scaling,PCA and Standardization

損失函數中含有正則項時,一般需要feature scaling:對於線性模型y=wx+b而言,x的任何線性變換(平移、放縮),都可以被w和b「吸收」掉,理論上,不會影響模型的擬合能力。但是,如果損失函數中含有正則項,如λ∣∣w∣∣^2,λ為超參數,其對w的每一個參數施加同樣的懲罰,但對於某一維特徵xi而言,其scale越大,係數wi越小,其在正則項中的比重就會變小,相當於對wi懲罰變小,即損失函數會相對忽視那些scale增大的特徵,這並不合理,所以需要feature scaling,使損失函數平等看待每一維特徵。

梯度下降算法,需要feature scaling。梯度下降的參數更新公式如下,

E(W)為損失函數,收斂速度取決於:參數的初始位置到local minima的距離,以及學習率η的大小。一維情況下,在local minima附近,不同學習率對梯度下降的影響如下圖所示:
Gradient descent for different learning rates多維情況下可以分解成多個上圖,每個維度上分別下降,參數W為向量,但學習率只有1個,即所有參數維度共用同一個學習率(暫不考慮為每個維度都分配單獨學習率的算法)。收斂意味著在每個參數維度上都取得極小值,每個參數維度上的偏導數都為0,但是每個參數維度上的下降速度是不同的,為了每個維度上都能收斂,學習率應取所有維度在當前位置合適步長中最小的那個。下面討論feature scaling對gradient descent的作用,

zero center與參數初始化相配合,縮短初始參數位置與local minimum間的距離,加快收斂。模型的最終參數是未知的,所以一般隨機初始化,比如從0均值的均勻分布或高斯分布中採樣得到,對線性模型而言,其分界面初始位置大致在原點附近,bias經常初始化為0,則分界面直接通過原點。同時,為了收斂,學習率不會很大。而每個數據集的特徵分布是不一樣的,如果其分布集中且距離原點較遠,比如位於第一象限遙遠的右上角,分界面可能需要花費很多步驟才能「爬到」數據集所在的位置。所以,無論什麼數據集,先平移到原點,再配合參數初始化,可以保證分界面一定會穿過數據集。此外,outliers常分布在數據集的外圍,與分界面從外部向內挪動相比,從中心區域開始挪動可能受outliers的影響更小。

對於採用均方誤差損失LMS的線性模型,損失函數恰為二階,如下圖所示

不同方向上的下降速度變化不同(二階導不同,曲率不同),恰由輸入的協方差矩陣決定,通過scaling改變了損失函數的形狀,減小不同方向上的曲率差異。將每個維度上的下降分解來看,給定一個下降步長,如果不夠小,有的維度下降的多,有的下降的少,有的還可能在上升,損失函數的整體表現可能是上升也可能是下降,就會不穩定。scaling後不同方向上的曲率相對更接近,更容易選擇到合適的學習率,使下降過程相對更穩定。

另有從Hessian矩陣特徵值以及condition number角度的理解,詳見Lecun paper-Efficient BackProp中的Convergence of Gradient Descent一節,有清晰的數學描述,同時還介紹了白化的作用——解除特徵間的線性相關性,使每個維度上的梯度下降可獨立看待。

文章開篇的橢圓形和圓形等高線圖,僅在採用均方誤差的線性模型上適用,其他損失函數或更複雜的模型,如深度神經網絡,損失函數的error surface可能很複雜,並不能簡單地用橢圓和圓來刻畫,所以用它來解釋feature scaling對所有損失函數的梯度下降的作用,似乎過於簡化,見Hinton vedio-3.2 The error surface for a linear neuron。

對於損失函數不是均方誤差的情況,只要權重w與輸入特徵x間是相乘關係,損失函數對w的偏導必然含有因子x,w的梯度下降速度就會受到特徵x尺度的影響。理論上為每個參數都設置上自適應的學習率,可以吸收掉x尺度的影響,但在實踐中出於計算量的考慮,往往還是所有參數共用一個學習率,此時x尺度不同可能會導致不同方向上的下降速度懸殊較大,學習率不容易選擇,下降過程也可能不穩定,通過scaling可對不同方向上的下降速度有所控制,使下降過程相對更穩定。

對於傳統的神經網絡,對輸入做feature scaling也很重要,因為採用sigmoid等有飽和區的激活函數,如果輸入分布範圍很廣,參數初始化時沒有適配好,很容易直接陷入飽和區,導致梯度消失,所以,需要對輸入做Standardization或映射到[0,1]、[−1,1],配合精心設計的參數初始化方法,對值域進行控制。但自從有了Batch Normalization,每次線性變換改變特徵分布後,都會重新進行Normalization,似乎可以不太需要對網絡的輸入進行feature scaling了?但習慣上還是會做feature scaling。

什麼時候不需要Feature Scaling?與距離計算無關的概率模型,不需要feature scaling,比如Naive Bayes;與距離計算無關的基於樹的模型,不需要feature scaling,比如決策樹、隨機森林等,樹中節點的選擇只關注當前特徵在哪裡切分對分類更好,即只在意特徵內部的相對大小,而與特徵間的相對大小無關。小結這篇文章寫得十分艱難,一開始以為蠻簡單直接,但隨著探索的深入,冒出的問號越來越多,打破了很多原來的「理所當然」,所以,在寫的過程中不停地做加法,很多地方想解釋得儘量直觀,又不想照搬太多公式,但自己的理解又不夠深刻,導致現在敘述這麼冗長,希望以後在寫文時能更專注更精煉。

參考文獻

3.[Hung-yi Lee pdf-Gradient Descent]()4.quora-Why does mean normalization help in gradient descent?5.scikit learn-Importance of Feature Scaling6.scikit learn-5.3. Preprocessing data7.scikit learn-Compare the effect of different scalers on data with outliers8.data school-Comparing supervised learning algorithms9.Lecun paper-Efficient BackProp10.Hinton vedio-3.2 The error surface for a linear neuron11.CS231n-Neural Networks Part 2: Setting up the Data and the Loss12.ftp-Should I normalize/standardize/rescale the data?13.medium-Understand Data Normalization in Machine Learning14.Normalization and Standardization15.How and why do normalization and feature scaling work?16.Is it a good practice to always scale/normalize data for machine learning?17.When conducting multiple regression, when should you center your predictor variables & when should you standardize them?

相關焦點

  • 解讀:為什麼要做特徵歸一化/標準化?
    本文解讀了一項數據預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。
  • 深入探討:為什麼要做特徵歸一化/標準化?
    文 | shine-lee源 | CSDN本文解讀了一項數據預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。Feature scaling,常見的提法有「特徵歸一化」、「標準化」,是數據預處理中的重要技術,有時甚至決定了算法能不能work以及work得好不好。
  • 一文詳解特徵縮放、標準化、歸一化的定義、區別、特點和作用
    前言我在學李宏毅的機器學習課程,助教給的回歸作業代碼中有數據標準化的操作。我聽過數據標準化,還有歸一化、批量歸一化等等,但不是很懂,不知道他們具體是什麼、有什麼區別。百度上找了挺多文章,講得都不是很系統,比如大多文章都沒講懂標準化和歸一化的區別或者是不同文章講的內容矛盾了。用谷歌一搜,就找到了很多很有價值的相關文章,然後我也寫了這篇文章做個記錄。
  • Python數據預處理:徹底理解標準化和歸一化
    為什麼要標準化/歸一化?提升模型精度:標準化/歸一化後,不同維度之間的特徵在數值上有一定比較性,可以大大提高分類器的準確性。加速模型收斂:標準化/歸一化後,最優解的尋優過程明顯會變得平緩,更容易正確的收斂到最優解。
  • 數據變換-歸一化與標準化
    1,數據歸一化歸一化就是獲取原始數據的最大值和最小值,然後把原始值線性變換到 [0,1] 範圍之內,變換公式為:其中:x 是當前要變換的原始值。min 是當前特徵中的最小值。>MinMaxScaler 類就是用來做歸一化處理的。
  • 【機器學習基礎】Python數據預處理:徹底理解標準化和歸一化
    為什麼要標準化/歸一化?提升模型精度:標準化/歸一化後,不同維度之間的特徵在數值上有一定比較性,可以大大提高分類器的準確性。加速模型收斂:標準化/歸一化後,最優解的尋優過程明顯會變得平緩,更容易正確的收斂到最優解。如下圖所示:
  • 數據處理中的標準化、歸一化究竟是什麼?
    當然,如果你在閱讀文章的時候,發現存在問題歡迎留言批評指正但是我覺得你可能沒有批評指正的機會先來說下概念數據歸一化和標準化都屬於數據特徵無量綱的一種方式。無量綱指的是將不同規格的數據轉換到同一規格,或不同分布的數據轉換到某個特定分布的需求,稱之為數據「無量綱化」。
  • 數據轉換 :標準化vs 歸一化(附代碼&連結)
    :「標準化」和「歸一化」的不同之處,並舉例說明何時使用,以及如何使用它們。本文將解釋數據轉換中常見的特徵縮放方法:「標準化」和「歸一化」的不同之處,並舉例說明何時使用,以及如何使用它們。數據轉換是數據處理中十分基本的步驟之一。當我初學特徵縮放的時候,經常用到「縮放」 「標準化」「歸一化」等術語。但是卻很難找到應該在什麼時候,使用哪一種方法的信息。
  • 表達矩陣的歸一化和標準化,去除極端值,異常值
    我們閱讀量破萬的綜述:RNA-seq這十年(3萬字長文綜述)給粉絲朋友們帶來了很多理解上的挑戰,所以我們開闢專欄慢慢介紹其中的一些概念性的問題,上一期:RNA-seq的counts值,RPM, RPKM, FPKM, TPM 的異同在數據挖掘過程,數據的歸一化和標準化是必須的
  • 【動手學計算機視覺】第十三講:批量歸一化
    當我們使用一些波動幅度較大的數據做預測分析時,我們需要對它進行標準化、歸一化、滑動窗口等方式做預處理,這樣不僅可以提高計算速度,還可以一定程度上提高結果的準確度
  • 簡介機器學習中的特徵工程
    有多種方法可以實現特徵工程。根據數據和應用程式不同來分類。在本文中,我們將了解為什麼使用特徵工程和特徵工程的各種方法。為什麼使用特徵工程?特徵工程出現在機器學習工作流程的最初階段。特性工程是決定結果成敗的最關鍵和決定性的因素。
  • 特徵工程最後一個要點 : 特徵預處理
    主要包括特徵的歸一化和標準化,異常特徵樣本清洗與樣本數據不平衡問題的處理。章節目錄特徵的標準化和歸一化異常特徵樣本清洗處理不平衡數據結語特徵的標準化和歸一化由於標準化和歸一化這兩個詞經常混用,所以本文不再區別標準化和歸一化,而通過具體的標準化和歸一化方法來區別具體的預處理操作。
  • 「千克」和「毫升」:單位不同就不能做朋友了嗎?
    另外,歸一化和標準化的區別是什麼?這是機器學習中最常用的兩種特徵縮放技術,但它們不易理解。什麼時候應該使用哪種技術?本文將解答你關於特徵縮放的疑問,將在Python中實現特性縮放,讓你對它如何適用於不同的機器學習算法有一個實踐上的理解。為什麼要使用特徵縮放?
  • FAIR何愷明等人提出組歸一化:替代批歸一化,不受批量大小限制
    本文提出了組歸一化(Group Normalization,GN)作為批歸一化(BN)的替代。作者發現很多經典的特徵例如 SIFT[38] 和 HOG[9] 是分組的特徵並涉及分組的歸一化。例如,一個 HOG 向量是多個空間單元的輸出,其中每個單元由一個歸一化的方向直方圖表徵。類似地作者提出了 GN 作為層將通道分組並在每個組中將特徵歸一化(見圖 2)。
  • 不同歸一化方法的比較
    批處理歸一化(BN)已經成為許多先進深度學習模型的重要組成部分,特別是在計算機視覺領域。它通過批處理中計算的平均值和方差來規範化層輸入,因此得名。要使BN工作,批大小必須足夠大,通常至少為32。組歸一化(GN)是一種最新的規範化方法,可以避免利用批處理維,因此與批處理大小無關。不同的歸一化方法為了促進GN的表述,我們將首先看一下以前的一些標準化方法。x ← (x - ) / √( + )對於每個係數x輸入特性。
  • 批歸一化和Dropout不能共存?這篇研究說可以
    現代深度神經網絡的高效訓練很難實現,因為你往往要輸入數百萬條數據。因此,開發新的技術來提高 DNN 的訓練效率一直是該領域比較活躍的研究主題。近期,來自騰訊、港中文和南開大學的研究者提出了一種新的訓練技術,將兩種常用的技術——批歸一化(BatchNorm)和 Dropout 結合在一起。
  • 完全解讀BatchNorm2d歸一化算法原理
    其中N為數據個數,C為通道數,H,W分別表示圖形的寬和高。我們用BatchNorm2d歸一化上述的數據結構,值得注意的是歸一化是每個通道的歸一化,以每個通道作為視角來歸一化數據。為防止分母出現零所增加的變量,γ和β是對輸入值進行仿射操作,即線性變換。γ和β的默認值分別為1和0,仿射包含了不進行仿射的結果,使得BatchNormlization的引入至少不降低模型,γ和β為模型的學習參數。
  • 目標檢測的圖像特徵提取之 HOG特徵
    最後把這些直方圖組合起來就可以構成特徵描述器。(3)提高性能:       把這些局部直方圖在圖像的更大的範圍內(我們把它叫區間或block)進行對比度歸一化(contrast-normalized),所採用的方法是:先計算各直方圖在這個區間(block)中的密度,然後根據這個密度對區間中的各個細胞單元做歸一化。通過這個歸一化後,能對光照變化和陰影獲得更好的效果。
  • 機器學習特性縮放的介紹,什麼時候為什麼使用
    為要獲得正確的預測和結果,就需要特徵縮放。如果某一列的值與其他列相比非常高,則具有更高值的列的影響將比其他低值列的影響高得多。對特徵縮放敏感的算法下面給出了一些對特徵縮放非常敏感的算法。這些算法對特徵縮放很敏感,因為它們取決於距離和高斯曲線。
  • 如何進行時間序列的特徵工程?
    在使用這些方法之前,一般需要我們對原始時序做一定的處理,抽取若干特徵;再者,為了更充分了解時間序列,我們也需要挖掘時間序列的特徵以獲得可解釋的信息。那麼,我們如何進行時間序列的特徵工程呢?時間序列的特徵工程大體上分為:基礎特徵、轉換特徵、分類特徵這三大類,涉及統計分析、機器學習、深度學習等多個領域。