sklearn數據預處理:歸一化、標准化、正則化


歸一化:

1、把數變為(0,1)之間的小數
主要是為了數據處理方便提出來的,把數據映射到0~1范圍之內處理,更加便捷快速。
2、把有量綱表達式變為無量綱表達式
歸一化是一種簡化計算的方式,即將有量綱的表達式,經過變換,化為無量綱的表達式,成為純量。

歸一化算法有:

1.線性轉換

   y=(x-MinValue)/(MaxValue-MinValue)

2.對數函數轉換:

     y=log10(x)

3.反余切函數轉換

     y=atan(x)*2/PI

4.線性也與對數函數結合

     式(1)將輸入值換算為[-1,1]區間的值,

     在輸出層用式(2)換算回初始值,其中和分別表示訓練樣本集中負荷的最大值和最小值。

標准化/規范化:

數據的標准化是將數據按比例縮放,使之落入一個小的特定區間。由於信用指標體系的各個指標度量單位是不同的,為了能夠將指標參與評價計算,需要對指標進行規范化處理,通過函數變換將其數值映射到某個數值區間。

標准化算法有:

1.z-score標准化(或零-均值標准化)(常用)

 y=(x-X的平均值)/X的標准差=(x-mean)/std 

  優點:當X的最大值和最小值未知,或孤立點左右了最大-最小規范化時,該方法有用

2.最小-最大規范化(線性變換)

   y=( (x-MinValue) / (MaxValue-MinValue) )(new_MaxValue-new_MinValue)+new_minValue

3.小數定標規范化:通過移動X的小數位置來進行規范化

  y= x/10的j次方  (其中,j使得Max(|y|) <1的最小整數

4.對數Logistic模式:

    新數據=1/(1+e^(-原數據))

5.模糊量化模式:

    新數據=1/2+1/2sin[派3.1415/(極大值-極小值)*(X-(極大值-極小值)/2) ]       X為原數據

用sklearn實現:

 1.z-score:

公式為:(X-mean)/std  計算時對每個屬性/每列分別進行。

將數據按期屬性(按列進行)減去其均值,並處以其方差。得到的結果是,對於每個屬性/每列來說所有數據都聚集在0附近,方差為1。

實現時,有兩種不同的方式:

  • 使用sklearn.preprocessing.scale()函數,可以直接將給定數據進行標准化

import numpy as np
from sklearn.preprocessing import scale
X = np.array([[ 1., -1.,  2.], 
              [ 2.,  0.,  0.],
              [ 0.,  1., -1.]])
X_scaled = scale(X)
print X_scaled
#[[ 0.         -1.22474487  1.33630621]
# [ 1.22474487  0.         -0.26726124]
# [-1.22474487  1.22474487 -1.06904497]]
print X_scaled.mean(axis = 0)
#[ 0.  0.  0.]
print X_scaled.std(axis = 0)
#[ 1.  1.  1.]
  • 使用sklearn.preprocessing.StandardScaler,使用該類的好處在於可以保存訓練集中的參數(均值、方差)直接使用其對象轉換測試集數據。

import numpy as np
from sklearn.preprocessing import StandardScaler
X = np.array([[ 1., -1.,  2.], 
              [ 2.,  0.,  0.],
              [ 0.,  1., -1.]])
scaler = StandardScaler().fit(X)
print scaler
#StandardScaler(copy=True, with_mean=True, with_std=True)
print scaler.mean_
#[ 1.          0.          0.33333333]
print scaler.std_
#[ 0.81649658  0.81649658  1.24721913]
print scaler.transform(X)
#[[ 0.         -1.22474487  1.33630621]
# [ 1.22474487  0.         -0.26726124]
# [-1.22474487  1.22474487 -1.06904497]]

2.最小-最大規范化

將屬性縮放到一個指定的最小和最大值(通常是0-1)之間,這可以通過preprocessing.MinMaxScaler實現。

使用這種方法的目的包括:

1、對於方差非常小的屬性可以增強其穩定性。

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

import numpy as np
from sklearn.preprocessing import MinMaxScaler
X_train = np.array([[ 1., -1.,  2.], 
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
min_max_scaler = MinMaxScaler()
print min_max_scaler
#MinMaxScaler(copy=True, feature_range=(0, 1))
X_train_minmax = min_max_scaler.fit_transform(X_train)
print X_train_minmax
#[[ 0.5         0.          1.        ]
# [ 1.          0.5         0.33333333]
# [ 0.          1.          0.        ]]

#將相同的縮放應用到測試集數據中
X_test = np.array([-3., -1., 4.])
X_test_minmax = min_max_scaler.transform(X_test)
print X_test_minmax
#[-1.5         0.          1.66666667]

#縮放因子等屬性
print min_max_scaler.scale_
#[ 0.5         0.5         0.33333333]
print min_max_scaler.min_
#[ 0.          0.5         0.33333333]

當然,在構造類對象的時候也可以直接指定最小最大值的范圍:feature_range=(min, max),此時應用的公式變為:

X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))

X_scaled=X_std/(max-min)+min

正則化Normalization:

正則化的過程是將每個樣本縮放到單位范數(每個樣本的范數為1),如果后面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。

Normalization主要思想是對每個樣本計算其p-范數,然后對該樣本中每個元素除以該范數,這樣處理的結果是使得每個處理后樣本的p-范數(l1-norm,l2-norm)等於1。

             p-范數的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p

該方法主要應用於文本分類和聚類中。例如,對於兩個TF-IDF向量的l2-norm進行點積,就可以得到這兩個向量的余弦相似性。

1、可以使用preprocessing.normalize()函數對指定數據進行轉換:

import numpy as np
from sklearn.preprocessing import normalize
X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
     [ 0.,  1., -1.]]
X_normalized = normalize(X, norm = 'l2')#L2
print X_normalized
#[[ 0.40824829 -0.40824829  0.81649658]
# [ 1.          0.          0.        ]
# [ 0.          0.70710678 -0.70710678]]

2、可以使用processing.Normalizer()實現對訓練集和測試集的擬合和轉換:

import numpy as np
from sklearn.preprocessing import Normalizer
X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
     [ 0.,  1., -1.]]
normalizer = Normalizer().fit(X)
print normalizer
#Normalizer(copy=True, norm='l2')
print normalizer.transform(X)
#[[ 0.40824829 -0.40824829  0.81649658]
# [ 1.          0.          0.        ]
# [ 0.          0.70710678 -0.70710678]]
print normalizer.transform([-1., 1., 0.])
#[[-0.70710678  0.70710678  0.        ]]

補充:

 


免責聲明!

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



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