在訓練機器學習模型時,爲了均衡各類數值特徵對於模型的影響程度,加快模型的收斂速度,通常要對數值特徵進行縮放、歸一化、標準化等操作,下面介紹一下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.]))