Python 學習筆記之——用 sklearn 對資料進行預處理
阿新 • • 發佈:2018-11-27
1. 標準化
標準化是為了讓資料服從一個零均值和單位方差的標準正態分佈。也即針對一個均值為 標準差為 的向量 中的每個值 ,有 。
>>> from sklearn import preprocessing
>>> import numpy as np
>>> X_train = np.array([[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]])
>>> X_scaled = preprocessing.scale(X_train)
>>> X_scaled
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
>>> X_scaled.mean(axis=0)
array([0., 0., 0.])
>>> X_scaled.std(axis=0)
array([1., 1., 1.])
預設針對每列來進行標準化,也即針對每個特徵進行標準化。可以通過設定 axis=1 來對每行進行標準化,也即對每個樣本進行標準化。sklearn.preprocessing.scale()
此外,我們還可以用訓練資料的均值和方差來對測試資料進行相同的標準化處理。sklearn.preprocessing.StandardScaler()
>>> scaler = preprocessing.StandardScaler().fit(X_train)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
>>> scaler.mean_
array([1. ..., 0. ..., 0.33...])
>>> scaler.scale_
array([0.81..., 0.81..., 1.24...])
>>> scaler.transform(X_train)
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
>>> X_test = [[-1., 1., 0.]] # 用同樣的均值和方差來對測試資料進行標準化
>>> scaler.transform(X_test)
array([[-2.44..., 1.22..., -0.26...]])
2. 將資料縮放到一定範圍
有時候,我們需要資料處在給定的最大值和最小值範圍之間,常常是 0 到 1 之間,這樣資料的最大絕對值就被限制在了單位大小以內。
>>> 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. ]])
>>> 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]])
當 MinMaxScaler() 傳入一個引數 feature_range=(min, max),我們可以將資料縮放到我們想要的範圍內。sklearn.preprocessing.MinMaxScaler()
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
此外,我們還可以將資料限制在 [-1, 1] 之間,通過除以每個特徵的最大絕對值。sklearn.preprocessing.MaxAbsScaler()
>>> X_train = np.array([[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]])
...
>>> max_abs_scaler = preprocessing.MaxAbsScaler()
>>> X_train_maxabs = max_abs_scaler.fit_transform(X_train)
>>> X_train_maxabs
array([[ 0.5, -1. , 1. ],
[ 1. , 0. , 0. ],
[ 0. , 1. , -0.5]])
>>> X_test = np.array([[ -3., -1., 4.]])
>>> X_test_maxabs = max_abs_scaler.transform(X_test)
>>> X_test_maxabs
array([[-1.5, -1. , 2. ]])
>>> max_abs_scaler.scale_
array([2., 1., 2.])
3. 歸一化
歸一化的目的是讓每個樣本具有單位範數。也即針對向量 中的每個值 ,有 。
>>> 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...]])
>>> 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. ...]])
預設是對每行資料用 範數進行歸一化,我們也可以選擇 範數或者針對每列進行歸一化。sklearn.preprocessing.Normalizer()
獲取更多精彩,請關注「seniusen」!