機器學習中之規範化,中心化,標準化,歸一化,正則化,正規化
一、歸一化,標準化和中心化
歸一化 (Normalization)、標準化 (Standardization)和中心化/零均值化 (Zero-centered)
標準化
資料的標準化(normalization)是將資料按比例縮放(scale),使之落入一個小的特定區間。在某些比較和評價的指標處理中經常會用到,去除資料的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行比較和加權。
目前資料標準化方法有多種,歸結起來可以分為直線型方法(如極值法、標準差法)、折線型方法(如三折線法)、曲線型方法(如半正態性分佈)。不同的標準化方法,對系統的評價結果會產生不同的影響,然而不幸的是,在資料標準化方法的選擇上,還沒有通用的法則可以遵循。
其中最典型的就是資料的歸一化處理,即將資料統一對映到[0,1]區間上。也就是歸一化是標準化的特例,標準化的子集。
資料標準化(歸一化)處理是資料探勘的一項基礎工作,不同評價指標往往具有不同的量綱和量綱單位,這樣的情況會影響到資料分析的結果,為了消除指標之間的量綱影響,需要進行資料標準化處理,以解決資料指標之間的可比性。原始資料經過資料標準化處理後,各指標處於同一數量級,適合進行綜合對比評價。
意義:資料中心化和標準化在迴歸分析中是取消由於量綱不同、自身變異或者數值相差較大所引起的誤差。
中心化
中心化(又叫零均值化)
用途:在迴歸問題和一些機器學習演算法中,以及訓練神經網路的過程中,還有PCA等通常需要對原始資料進行中心化(Zero-centered或者Mean-subtraction(subtraction表示減去))處理和標準化(Standardization或Normalization)處理。
原理:
資料中心化:是指變數減去它的均值;
資料標準化:是指變數減去均值,再除以標準差。即資料中心化之後除以標準差。
目的:通過中心化和標準化處理,得到均值為0,標準差為1的服從標準正態分佈的資料。
(1)中心化(零均值化)後的資料均值為零。
(2)z-score 標準化後的資料均值為0,標準差為1(方差也為1)(中心化是標準化z-score 的第一步)。
通過標準化處理,可以使得不同的特徵具有相同的尺度(Scale)。簡言之,當原始資料不同維度上的特徵即變數的尺度(單位)不一致時,需要標準化步驟對資料進行預處理。
其實,在不同的問題中,中心化和標準化有著不同的意義,
比如在訓練神經網路的過程中,通過將資料標準化,能夠加速權重引數的收斂。
對資料進行中心化預處理,這樣做的目的是要增加基向量的正交性。
對資料標準化的目的是消除特徵之間的差異性。便於對一心一意學習權重。
歸一化
1 把數變為(0,1)之間的小數
主要是為了資料處理方便提出來的,把資料對映到0~1範圍之內處理,更加便捷快速。
2 把有量綱表示式變為無量綱表示式
歸一化是一種簡化計算的方式,即將有量綱的表示式,經過變換,化為無量綱的表示式,成為純量。
兩個優點:
1)歸一化後加快了梯度下降求最優解的速度,提升模型的收斂速度。
因此如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。
2)歸一化有可能提高精度。
一些分類器需要計算樣本之間的距離(如歐氏距離),例如KNN。如果一個特徵值域範圍非常大,那麼距離計算就主要取決於這個特徵,從而與實際情況相悖(比如這時實際情況是值域範圍小的特徵更重要)。
歸一化的另一好處是提高精度,這在涉及到一些距離計算的演算法時效果顯著,比如演算法要計算歐氏距離,上圖中x2的取值範圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,所以這就會造成精度的損失。所以歸一化很有必要,他可以讓各個特徵對結果做出的貢獻相同。
在多指標評價體系中,由於各評價指標的性質不同,通常具有不同的量綱和數量級。當各指標間的水平相差很大時,如果直接用原始指標值進行分析,就會突出數值較高的指標在綜合分析中的作用,相對削弱數值水平較低指標的作用。因此,為了保證結果的可靠性,需要對原始指標資料進行標準化處理。
3)深度學習中資料歸一化可以防止模型梯度爆炸。
需要歸一化的模型:
有些模型在各個維度進行不均勻伸縮後,最優解與原來不等價,例如SVM。對於這樣的模型,除非本來各維資料的分佈範圍就比較接近,否則必須進行標準化,以免模型引數被分佈範圍較大或較小的資料dominate。
有些模型在各個維度進行不均勻伸縮後,最優解與原來等價,例如logistic regression(因為θ的大小本來就自學習出不同的feature的重要性吧?)。對於這樣的模型,是否標準化理論上不會改變最優解。但是,由於實際求解往往使用迭代演算法,如果目標函式的形狀太“扁”,迭代演算法可能收斂得很慢甚至不收斂(模型結果不精確)。所以對於具有伸縮不變性的模型,最好也進行資料標準化。
有些模型/優化方法的效果會強烈地依賴於特徵是否歸一化,如LogisticReg,SVM,NeuralNetwork,SGD等。
不需要歸一化的模型:
(0/1取值的特徵通常不需要歸一化,歸一化會破壞它的稀疏性。)
有些模型則不受歸一化影響。模型演算法裡面沒有關於對距離的衡量,沒有關於對變數間標準差的衡量。比如decision tree 決策樹,採用演算法裡面沒有涉及到任何和距離等有關的,所以在做決策樹模型時,通常是不需要將變數做標準化的。
ICA好像不需要歸一化(因為獨立成分如果歸一化了就不獨立了?)。
基於平方損失的最小二乘法OLS不需要歸一化。
Kmeans,KNN一些涉及到距離有關的演算法,或者聚類的話,都是需要先做變數標準化的。
以下是幾種常用的變化方法:
1)Rescaling (min-max scaling): min-max標準化(Min-Max Normalization)/0-1 normalization/線性函式歸一化/離差標準化
也稱為離差標準化,是對原始資料的線性變換,使結果值對映到[0 - 1]或[-1, 1]之間。這種方法有個缺陷就是當有新資料加入時,可能導致max和min的變化,需要重新定義。另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小資料場景。
2)Z-score標準化(zero-mean normalization):Standardization(一般狹義上的標準化指此種方法,spss預設的標準化方法就是z-score標準化。廣義上的標準化包括歸一化)
也叫標準差標準化。這種方法給予原始資料的均值(mean)和標準差(standard deviation)進行資料的標準化。經過處理的資料符合標準正態分佈,即均值為0,標準差為1。該種歸一化方式要求原始資料的分佈可以近似為高斯分佈,否則標準化的效果會變得很糟糕。它們可以通過現有樣本進行估計。在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大資料場景。
優點:當X的最大值和最小值未知,或孤立點左右了最大-最小規範化時,該方法有用。
廣泛應用於:support vector machines, logistic regression, and artificial neural networks。
3)Scaling to unit length
也就是計算特徵向量的歐氏長度。線上性代數中,將一個向量除以向量的長度,也被稱為標準化,不過這裡的標準化是將向量變為長度為1的單位向量。
4)Mean normalization
5)log函式轉換
通過以10為底的log函式轉換的方法同樣可以實現歸一下,具體方法如下:
6)atan函式轉換
用反正切函式也可以實現資料的歸一化。
使用這個方法需要注意的是如果想對映的區間為[0,1],則資料都應該大於等於0,小於0的資料將被對映到[-1,0]區間上,而並非所有資料標準化的結果都對映到[0,1]區間上。
7)Decimal scaling小數定標標準化
這種方法通過移動資料的小數點位置來進行標準化。小數點移動多少位取決於屬性A的取值中的最大絕對值。
將屬性A的原始值x使用decimal scaling標準化到x'的計算方法是:
x'=x/(10^j)
其中,j是滿足條件的最小整數。
例如 假定A的值由-986到917,A的最大絕對值為986,為使用小數定標標準化,我們用每個值除以1000(即,j=3),這樣,-986被規範化為-0.986。
注意,標準化會對原始資料做出改變,因此需要儲存所使用的標準化方法的引數,以便對後續的資料進行統一的標準化。
8)Logistic/Softmax變換
參考:https://blog.csdn.net/pipisorry/article/details/77816624
9)模糊量化模式
參考:https://blog.csdn.net/pipisorry
具體說明中心化和標準化的作用:
- 左圖表示的是原始資料
- 中間的是中心化後的資料,可以看出就是一個平移的過程,平移後中心點是(0,0)。同時中心化後的資料對向量也容易描述,因為是以原點為基準的。
- 右圖將中心化後的資料除以標準差,得到為標準化的資料,可以看出每個維度上的尺度是一致的(紅色線段的長度表示尺度),而沒有處理之前的資料是不同的尺度標準。原始資料經過資料標準化處理後,各指標處於同一數量級,適合進行綜合對比評價。
中心化(以PCA為例)下面兩幅圖是資料做中心化(centering)前後的對比,其實就是一個平移的過程,平移後所有資料的中心是(0,0)。
在做PCA的時候,我們需要找出矩陣的特徵向量,也就是主成分(PC)。比如說找到的第一個特徵向量是a = [1, 2],a在座標平面上就是從原點出發到點 (1,2)的一個向量。
如果沒有對資料做中心化,那算出來的第一主成分的方向可能就不是一個可以“描述”(或者說“概括”)資料的方向了。
黑色線就是第一主成分的方向。只有中心化資料之後,計算得到的方向才能比較好的“概括”原來的資料。
根據侯傑泰的話:所謂 中心化 是指變數減去它的均值(即數學期望值)。對於樣本資料,將一個變數的每個觀測值減去該變數的樣本平均值,變換後的變數就是中心化的。
二、正規化和規範化
和標準化是一個概念。(一般我們不認為歸一化屬於標準化,而是兩個同級別的概念,區別見總結)
三、正則化
from sklearn import preprocessing
train_x = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
# normalize the data attributes
x1 = preprocessing.normalize(train_x)
print(x1)
# standardize the data attributes
x2 = preprocessing.scale(train_x)
print(x2)
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m,1))
normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide
return normDataSet, ranges, minVals
總結
1 歸一化特點
對不同特徵維度的伸縮變換的目的是使各個特徵維度對目標函式的影響權重是一致的,即使得那些扁平分佈的資料伸縮變換成類圓形。這也就改變了原始資料的一個分佈。好處:
1 提高迭代求解的收斂速度
2 提高迭代求解的精度
從採用大單位的身高和體重這兩個特徵來看,如果採用標準化,不改變樣本在這兩個維度上的分佈,則左圖還是會保持二維分佈的一個扁平性;而採用歸一化則會在不同維度上對資料進行不同的伸縮變化(歸一區間,會改變資料的原始距離,分佈,資訊),使得其呈類圓形。雖然這樣樣本會失去原始的資訊,但這防止了歸一化前直接對原始資料進行梯度下降類似的優化演算法時最終解被數值大的特徵所主導。歸一化之後,各個特徵對目標函式的影響權重是一致的。這樣的好處是在提高迭代求解的精度。
2 標準化特點
對不同特徵維度的伸縮變換的目的是使得不同度量之間的特徵具有可比性。同時不改變原始資料的分佈。好處:
1 使得不同度量之間的特徵具有可比性,對目標函式的影響體現在幾何分佈上,而不是數值上
2 不改變原始資料的分佈
從上面兩個座標圖可以看出,樣本在資料值上的分佈差距是不一樣的,但是其幾何距離是一致的。而標準化就是一種對樣本資料在不同維度上進行一個伸縮變化(而不改變資料的幾何距離),也就是不改變原始資料的資訊(分佈)。這樣的好處就是在進行特徵提取時,忽略掉不同特徵之間的一個度量,而保留樣本在各個維度上的資訊(分佈)。
1、在分類、聚類演算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,第二種方法(Z-score standardization)表現更好。
2、在不涉及距離度量、協方差計算、資料不符合正太分佈的時候,可以使用第一種方法或其他歸一化方法。比如影象處理中,將RGB影象轉換為灰度影象後將其值限定在[0 255]的範圍。
如果把所有維度的變數一視同仁,在最後計算距離中發揮相同的作用應該選擇標準化,如果想保留原始資料中由標準差所反映的潛在權重關係應該選擇歸一化。另外,標準化更適合現代嘈雜大資料場景。
在機器學習演算法的目標函式(例如SVM的RBF核心或線性模型的l1和l2正則化),許多學習演算法中目標函式的基礎都是假設所有的特徵都是零均值並且具有同一階數上的方差。如果某個特徵的方差比其他特徵大幾個數量級,那麼它就會在學習演算法中佔據主導位置,導致學習器並不能像我們說期望的那樣,從其他特徵中學習。進行標準化。
3 區別
一般不認為歸一化屬於標準化的特例,我們簡單理解就是兩個同級別的概念。
在機器學習中,標準化是更常用的手段,歸一化的應用場景是有限的。總結原因有兩點:
1、標準化更好保持了樣本間距。當樣本中有異常點時,歸一化有可能將正常的樣本“擠”到一起去。比如三個樣本,某個特徵的值為1,2,10000,假設10000這個值是異常值,用歸一化的方法後,正常的1,2就會被“擠”到一起去。如果不幸的是1和2的分類標籤還是相反的,那麼,當我們用梯度下降來做分類模型訓練時,模型會需要更長的時間收斂,因為將樣本分開需要更大的努力!而標準化在這方面就做得很好,至少它不會將樣本“擠到一起”。
2、標準化更符合統計學假設對一個數值特徵來說,很大可能它是服從正態分佈的。標準化其實是基於這個隱含假設,只不過是略施小技,將這個正態分佈調整為均值為0,方差為1的標準正態分佈而已。
(1)如果對輸出結果範圍有要求,用歸一化
(2)如果資料較為穩定(影象或是視訊的資料值處於固定區間),不存在極端的最大最小值,用歸一化
(3)如果資料存在異常值和較多噪音,用標準化,可以間接通過中心化避免異常值和極端值的影響
4 問題
邏輯迴歸必須要進行標準化嗎?
無論你回答必須或者不必須,你都是錯的!
真正的答案是,這取決於我們的邏輯迴歸是不是用正則。
如果你不用正則,那麼,標準化並不是必須的,如果你用正則,那麼標準化是必須的。為什麼呢?因為不用正則時,我們的損失函式只是僅僅在度量預測與真實的差距,加上正則後,我們的損失函式除了要度量上面的差距外,還要度量引數值是否足夠小。而引數值的大小程度或者說大小的級別是與特徵的數值範圍相關的。舉例來說,我們用體重預測身高,體重用kg衡量時,訓練出的模型是: 身高 = 體重*x x就是我們訓練出來的引數。當我們的體重用噸來衡量時,x的值就會擴大為原來的1000倍。在上面兩種情況下,都用L1正則的話,顯然對模型的訓練影響是不同的。
假如不同的特徵的數值範圍不一樣,有的是0到0.1,有的是100到10000,那麼,每個特徵對應的引數大小級別也會不一樣,在L1正則時,我們是簡單將引數的絕對值相加,因為它們的大小級別不一樣,就會導致L1最後只會對那些級別比較大的引數有作用,那些小的引數都被忽略了。
如果不用正則,那麼標準化對邏輯迴歸有什麼好處嗎?
答案是有好處,進行標準化後,我們得出的引數值的大小可以反應出不同特徵對樣本label的貢獻度,方便我們進行特徵篩選。如果不做標準化,是不能這樣來篩選特徵的。
做標準化有什麼注意事項嗎?
最大的注意事項就是先拆分出test集,不要在整個資料集上做標準化,因為那樣會將test集的資訊引入到訓練集中,這是一個非常容易犯的錯誤!(我之前就犯了這個錯誤)
程式碼實現
https://blog.csdn.net/pipisorry/article/details/52247679
https://blog.csdn.net/pipisorry/article/details/52247379
以上概念還是比較模糊,如有錯誤請及時提醒。