數據預處理之數據無量綱化(標准化/歸一化)


源: https://blog.csdn.net/OnTheWayGoGoing/article/details/79871559

   在進行特征選擇之前,一般會先進行數據無量綱化處理,這樣,表征不同屬性(單位不同)的各特征之間才有可比性,如1cm 與 0.1kg 你怎么比?無量綱處理方法很多,使用不同的方法,對最終的機器學習模型會產生不同的影響。本文將對常用的無量綱化技術進行總結,試圖指出他們的適用場景,並給出在Python中的相應調用方式。正文中每列代表一個 屬性/特征,每行表示一個/條 樣本。

   1. min-max歸一化

   該方法是對原始數據進行線性變換,將其映射到[0,1]之間,該方法也被稱為離差標准化(但是請注意,網上更多人喜歡把z-score稱為標准化方法,把min-max稱為歸一化方法,然后在此基礎上,強行給標准化(z-score)與歸一化(min-max)划條界線,以顯示二者之間的相異性。對!二者之間確實有很大的不同,這個我們后面會有介紹,但是這兩個方法說到底還都是用來去除量綱的,都是無量綱化技術中的一員而已,所以,請不要糾結標准化與歸一化這兩個概念了)。

                          

   上式中,min是樣本的最小值,max是樣本的最大值。由於最大值與最小值可能是動態變化的,同時也非常容易受噪聲(異常點、離群點)影響,因此一般適合小數據的場景。此外,該方法還有兩點好處:

   1) 如果某屬性/特征的方差很小,如身高:np.array([[1.70],[1.71],[1.72],[1.70],[1.73]]),實際5條數據在身高這個特征上是有差異的,但是卻很微弱,這樣不利於模型的學習,進行min-max歸一化后為:array([[ 0. ], [ 0.33333333], [ 0.66666667], [ 0. ], [ 1. ]]),相當於放大了差異;

   2) 維持稀疏矩陣中為0的條目。

   使用方法如下:

from sklearn.preprocessing import StandardScaler
x = np.array([[1,2,3],[4,5,6],[1,2,1]])
x1 = StandardScaler().fit_transform(x)

   不難發現,x1每列的值都在[0,1]之間,也就是說,該模塊是按列計算的。並且MinMaxScaler在構造類對象的時候也可以直接指定最大最小值的范圍:scaler = MinMaxScaler(feature_range=(min, max)).

   2. z-score標准化

   z-score標准化(zero-mena normalization,0-均值標准化)方法的公式如下所示:

                            

   上式中,x是原始數據,u是樣本均值,σ是樣本標准差。回顧下正態分布的基本性質,若xN(u,σ^2),則有

 

                          其中,N(0,1)表示標准正態分布

   於是,可以看出,z-score標准化方法試圖將原始數據集標准化成均值為0,方差為1且接近於標准正態分布的數據集。然而,一旦原始數據的分布 不 接近於一般正態分布,則標准化的效果會不好。該方法比較適合數據量大的場景(即樣本足夠多,現在都流行大數據,因此可以比較放心地用)。此外,相對於min-max歸一化方法,該方法不僅能夠去除量綱,還能夠把所有維度的變量一視同仁(因為每個維度都服從均值為0、方差1的正態分布),在最后計算距離時各個維度數據發揮了相同的作用,避免了不同量綱的選取對距離計算產生的巨大影響。所以,涉及到計算點與點之間的距離,如利用距離度量來計算相似度、PCA、LDA,聚類分析等,並且數據量大(近似正態分布),可考慮該方法。相反地,如果想保留原始數據中由標准差所反映的潛在權重關系應該選擇min-max歸一化,基於數學角度的解釋可參閱這兩篇博文[1,2],鏈接在最下方reference內。

from sklearn.preprocessing import StandardScaler
x = np.array([[1,2,3],[4,5,6],[1,2,1]])
x1 = StandardScaler().fit_transform(x)

        可以發現,x1的每一列加起來都是0,方差是1左右。注意該方法同樣按列(即每個屬性/特征)進行計算。並且StandardScaler類還有一個好處,就是可以直接調用其對象的.mean_與.std_方法查看原始數據的均值與標准差。

X = np.array([[ 1., -1., 2.], ... [ 2., 0., 0.], ... [ 0., 1., -1.]])
scaler = StandardScaler().fit(X)
scaler.mean_  
array([ 1. ..., 0. ..., 0.33...])

 

           在一些地方,有人把這種方法翻譯為正則化,但是機器學習中的正則化更多是與模型相關(比如邏輯回歸在損失函數后增加L2正則項),所以這種翻譯我不喜歡;也有人稱之為歸一化,但是吧,有時這種方法並沒體現“歸一”特性,如處理后的數據該是負號的還是負號;直譯表示標准化吧,我怕你們又把這種方法與z-score標准化聯系起來,因此,就不翻譯了吧。

   其實這個方法是根據范數來進行 Normalization的,何為范數?聽着感覺高大上,其實非常常見。Lp-范數的計算公式如下所示:

                 

   可見,L2范數即為歐式距離,則規則為L2的Normalization公式如下所示,易知,其將每行(條)數據轉為相應的“單位向量”。

                             

   Normalization的過程是將每個樣本縮放到單位范數(結合單位向量進行理解,p=2時為單位向量,其他為單位范數),如果后面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用[3]。

from sklearn import preprocessing
normalizer = preprocessing.Normalizer().fit(X)
normalizer.transform(X)

reference 

[1]. 《再談機器學習中的歸一化方法(Normalization Method)》

[2].  《歸一化與標准化》

[3]. 《關於使用sklearn進行數據預處理 —— 歸一化/標准化/正則化》

 

在經濟管理學中, 無量綱化方法是綜合評價步驟中的一個環節。
根據指標實際值和無量綱化結果數值的關系特征可以分為三大類:
一、直線型無量綱化方法:又包括閾值法、指數法、標准化方法、 比重法
二、折線型無量綱化方法:凸折線型法、凹折線型法、三折線型法
三、曲線型無量綱化方法
目前常見的無量綱化處理方法主要有極值化、標准化、 均值化以及標准差化方法,而最常使用的是標准化方法。但標准化方法處理后的各指標均值都為0,標准差都為1,它只反映了各指標之間的相互影響,在無量綱化的同時也抹殺了各指標之間變異程度上的差異,因此,標准化方法並不適用於多指標的綜合評價中。而經過均值化方法處理的各指標數據構成的 協方差矩陣既可以反映原始數據中各指標變異程度上的差異,也包含各指標相互影響程度差異的信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM