scikit-learn數值縮放、歸一化、標準化常用方法

在訓練機器學習模型時,爲了均衡各類數值特徵對於模型的影響程度,加快模型的收斂速度,通常要對數值特徵進行縮放、歸一化、標準化等操作,下面介紹一下scikit-learn工具包中常用的幾種數值特徵處理方法。

1、normalize歸一化

normalize歸一化可以沿着矩陣任意軸進行,如果選擇l2歸一化,axis=0,就是將每個元素除以元素所在列的l2範數。

normalize函數的參數列表如下:

參數 參數描述
X 需要歸一化的矩陣
norm 使用哪種歸一化方式,L1、L2、Max等
axis 沿着哪個軸方向歸一化
copy 是否生成新的拷貝

 L1歸一化表示如下:

L2歸一化表示如下:

示例:

import numpy as np
from sklearn import preprocessing

data = np.random.rand(10, 10) * 100
data
array([[78.16323419,  7.49350354, 49.69650393, 56.81082161,  9.99146614,
         2.80772256, 37.12871596, 86.40788511, 61.56191883, 97.05294143],
       [22.65129438, 40.36108532, 38.5384142 , 11.56585979, 97.79232686,
        26.06302914,  7.28807511,  3.81352654, 95.32217769, 43.5822619 ],
       [45.61073488, 12.20337497, 58.19307024, 23.50206549, 11.08969354,
        41.7826594 , 34.8087407 , 22.51792342, 54.86843145, 38.00780105],
       [63.9203881 , 41.93494232,  2.09771219, 70.81039721, 91.85564594,
        21.01376502,  2.074977  , 72.97881035, 24.9028654 , 32.63379196],
       [26.52935789, 79.57167735, 32.20415608, 97.1739589 , 89.64363271,
         8.97169554, 75.48200095, 62.38959941, 63.90995938, 48.05517911],
       [57.37290063, 13.55509753, 73.85543964,  5.42533775, 96.15555984,
        98.06572975, 70.02672512, 75.30871379, 11.49530931, 15.25904797],
       [13.42384882,  0.31386799, 94.53266703, 99.93228266,  8.68249191,
        11.8979742 , 94.39501059, 70.37929649,  8.81076432, 84.89065261],
       [30.09274618, 49.61306855, 35.55417193, 25.45480588, 57.72702024,
        79.40738935, 95.53680102, 69.30517821, 33.17145358, 15.15072447],
       [12.38611125, 55.24441364, 68.80182229, 39.81283062, 26.19161967,
        28.40487513, 90.34284135, 96.8393213 ,  5.99189635, 36.52551797],
       [32.19270842, 65.18271248, 54.75696407, 14.08094661, 53.99588207,
        57.05199712, 74.85506107, 71.29431704,  5.66216966, 32.41486064]])

沿着axis=0軸進行L2歸一化:

經過如下歸一化之後,每列元素的平方和爲1。

# 經過如下歸一化之後,每列元素的平方和爲1
data_norm_l2 = preprocessing.normalize(data, norm="l2", axis=0)
np.sum(data_norm_l2 ** 2, axis=0)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

沿着axis=1軸進行L1歸一化:

經過如下歸一化之後,每行元素的絕對值之和爲1。

# 經過如下歸一化之後,每行元素的絕對值之和爲1
data_norm_l1 = preprocessing.normalize(data, norm="l1", axis=1)
np.sum(np.abs(data_norm_l1), axis=1)

2、scale縮放

scale函數的參數列表如下:

參數 參數描述
X 需要縮放的矩陣
axis 沿着哪個軸方向縮放
with_mean if True 則縮放後均值爲0
with_std if True 則縮放後方差爲1

 

示例:

經過如下操作之後,每列元素的方差爲1,均值爲0。

# 經過如下操作之後,每列元素的方差爲1,均值爲0
data_scale = preprocessing.scale(data, axis=0, with_std=True)
np.mean(data_scale, axis=0), np.std(data_scale, axis=0), np.mean(data, axis=0), np.std(data, axis=0)
array([-4.44089210e-17,  3.05311332e-16,  1.77635684e-16,  8.32667268e-17,
        -2.22044605e-16,  1.11022302e-16,  1.11022302e-17,  4.44089210e-17,
         2.46330734e-17,  2.77555756e-16]),
 array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]),
 array([51.49281565, 59.4787154 , 47.53953557, 55.68430399, 60.3389103 ,
        62.45368944, 34.00746164, 45.45096693, 40.67619051, 60.90908866]),
 array([31.16506455, 25.44825364, 27.68806885, 25.31935865, 27.39144467,
        29.47623919, 22.07015185, 30.23023828, 24.1993479 , 30.61930749]))

3、min-max縮放

min-max縮放在機器學習應用中常常作用於各個屬性列,所以在scikit-learn中,min-max縮放時針對屬性列進行的,也就是axis=0的軸方向,經過縮放後的特徵數值範圍在[0,1]之間取值。min-max縮放公式如下:

示例:

經過如下轉換之後,每列元素的數值在[0, 1]之間

# 經過如下轉換之後,每列元素的數值在[0, 1]之間
min_max_scaler = preprocessing.MinMaxScaler()
data_min_max = min_max_scaler.fit_transform(data)
np.min(data_min_max, axis=0), np.max(data_min_max, axis=0)
(array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
 array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]))

4、standard標準化

standard標準化在機器學習應用中常常作用於各個屬性列,所以在scikit-learn中,standard標準化時針對屬性列進行的,也就是axis=0的軸方向,經過標準化後的特徵數值均值爲0,方差爲1。standard標準化公式如下:

示例:

經過如下操作之後,每列元素的均值爲0,方差爲1。

# 經過如下操作之後,每列元素的均值爲0,方差爲1
standard_scaler = preprocessing.StandardScaler()
data_stand = standard_scaler.fit_transform(data)
np.mean(data_stand, axis=0), np.std(data_stand, axis=0)
(array([ 5.55111512e-17, -3.10862447e-16, -1.27675648e-16,  1.99840144e-16,
        -1.24900090e-17, -1.88737914e-16,  2.27595720e-16,  4.44089210e-16,
         1.77635684e-16, -7.21644966e-17]),
 array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章