一、標(biāo)準(zhǔn)化(Z-Score),或者去除均值和方差縮放公式為:(X-mean)/std 計算時對每個屬性/每列分別進行。 將數(shù)據(jù)按期屬性(按列進行)減去其均值,并處以其方差。得到的結(jié)果是,對于每個屬性/每列來說所有數(shù)據(jù)都聚集在0附近,方差為1。 實現(xiàn)時,有兩種不同的方式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>> from sklearn import preprocessing
>>> import numpy as np
>>> X = np.array([[ 1 ., - 1 ., 2 .],
... [ 2 ., 0 ., 0 .],
... [ 0 ., 1 ., - 1 .]])
>>> X_scaled = preprocessing.scale(X)
>>> X_scaled
array([[ 0 . ..., - 1.22 ..., 1.33 ...],
[ 1.22 ..., 0 . ..., - 0.26 ...],
[- 1.22 ..., 1.22 ..., - 1.06 ...]])
>>>#處理后數(shù)據(jù)的均值和方差
>>> X_scaled.mean(axis= 0 )
array([ 0 ., 0 ., 0 .])
>>> X_scaled.std(axis= 0 )
array([ 1 ., 1 ., 1 .])
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | >>> scaler = preprocessing.StandardScaler().fit(X)
>>> scaler
StandardScaler(copy = True , with_mean = True , with_std = True )
>>> scaler.mean_
array([ 1. ..., 0. ..., 0.33 ...])
>>> scaler.std_
array([ 0.81 ..., 0.81 ..., 1.24 ...])
>>> scaler.transform(X)
array([[ 0. ..., - 1.22 ..., 1.33 ...],
[ 1.22 ..., 0. ..., - 0.26 ...],
[ - 1.22 ..., 1.22 ..., - 1.06 ...]])
>>> #可以直接使用訓(xùn)練集對測試集數(shù)據(jù)進行轉(zhuǎn)換
>>> scaler.transform([[ - 1. , 1. , 0. ]])
array([[ - 2.44 ..., 1.22 ..., - 0.26 ...]])
|
二、將屬性縮放到一個指定范圍除了上述介紹的方法之外,另一種常用的方法是將屬性縮放到一個指定的最大和最小值(通常是1-0)之間,這可以通過preprocessing.MinMaxScaler類實現(xiàn)。 使用這種方法的目的包括: 1、對于方差非常小的屬性可以增強其穩(wěn)定性。 2、維持稀疏矩陣中為0的條目。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | >>> X_train = np.array([[ 1. , - 1. , 2. ],
... [ 2. , 0. , 0. ],
... [ 0. , 1. , - 1. ]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333 ],
[ 0. , 1. , 0. ]])
>>> #將相同的縮放應(yīng)用到測試集數(shù)據(jù)中
>>> X_test = np.array([[ - 3. , - 1. , 4. ]])
>>> X_test_minmax = min_max_scaler.transform(X_test)
>>> X_test_minmax
array([[ - 1.5 , 0. , 1.66666667 ]])
>>> #縮放因子等屬性
>>> min_max_scaler.scale_
array([ 0.5 , 0.5 , 0.33 ...])
>>> min_max_scaler.min_
array([ 0. , 0.5 , 0.33 ...])
|
當(dāng)然,在構(gòu)造類對象的時候也可以直接指定最大最小值的范圍:feature_range=(min, max),此時應(yīng)用的公式變?yōu)椋?/span>
X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0)) X_scaled=X_std/(max-min)+min
三、正則化(Normalization)正則化的過程是將每個樣本縮放到單位范數(shù)(每個樣本的范數(shù)為1),如果后面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。 Normalization主要思想是對每個樣本計算其p-范數(shù),然后對該樣本中每個元素除以該范數(shù),這樣處理的結(jié)果是使得每個處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。 p-范數(shù)的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p 該方法主要應(yīng)用于文本分類和聚類中。例如,對于兩個TF-IDF向量的l2-norm進行點積,就可以得到這兩個向量的余弦相似性。 1、可以使用preprocessing.normalize()函數(shù)對指定數(shù)據(jù)進行轉(zhuǎn)換: 1 2 3 4 5 6 7 8 9 | >>> X = [[ 1. , - 1. , 2. ],
... [ 2. , 0. , 0. ],
... [ 0. , 1. , - 1. ]]
>>> X_normalized = preprocessing.normalize(X, norm = 'l2' )
>>> X_normalized
array([[ 0.40 ..., - 0.40 ..., 0.81 ...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70 ..., - 0.70 ...]])
|
2、可以使用processing.Normalizer()類實現(xiàn)對訓(xùn)練集和測試集的擬合和轉(zhuǎn)換: 1 2 3 4 5 6 7 8 9 10 11 12 | >>> normalizer = preprocessing.Normalizer().fit(X) # fit does nothing
>>> normalizer
Normalizer(copy = True , norm = 'l2' )
>>>
>>> normalizer.transform(X)
array([[ 0.40 ..., - 0.40 ..., 0.81 ...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70 ..., - 0.70 ...]])
>>> normalizer.transform([[ - 1. , 1. , 0. ]])
array([[ - 0.70 ..., 0.70 ..., 0. ...]])
|
補充: 
|