1. 程式人生 > >Python 學習筆記之——用 sklearn 對資料進行預處理

Python 學習筆記之——用 sklearn 對資料進行預處理

1. 標準化

標準化是為了讓資料服從一個零均值和單位方差的標準正態分佈。也即針對一個均值為 m e a n mean 標準差為 s

t d std 的向量 X X 中的每個值 x x
,有 x s c a l e d
= x m e a n s t d x_{scaled} = \frac{x - mean}{std}

>>> 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 X 中的每個值 x x ,有 x n o r m a l i z e d = x X x_{normalized} = \frac{x}{||X||}

>>> 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.  ...]])

預設是對每行資料用 L 2 L2 範數進行歸一化,我們也可以選擇 L 1 L1 範數或者針對每列進行歸一化。sklearn.preprocessing.Normalizer()

獲取更多精彩,請關注「seniusen」!