Python資料處理從零開始----第三章(pandas)③資料標準化

船頭尺發表於2021-09-09

標準化,也稱去均值和方差按比例縮放

資料集的 標準化 對scikit-learn中實現的大多數機器學習演算法來說是 常見的要求 。如果個別特徵或多或少看起來不是很像標準正態分佈(具有零均值和單位方差),那麼它們的表現力可能會較差。在實際情況中,我們經常忽略特徵的分佈形狀,直接經過去均值來對某個特徵進行中心化,再透過除以非常量特徵(non-constant features)的標準差進行縮放。

例如,在機器學習演算法的目標函式(例如SVM的RBF核心或線性模型的l1和l2正則化),許多學習演算法中目標函式的基礎都是假設所有的特徵都是零均值並且具有同一階數上的方差。如果某個特徵的方差比其他特徵大幾個數量級,那麼它就會在學習演算法中佔據主導位置,導致學習器並不能像我們說期望的那樣,從其他特徵中學習。

函式 [scale]"sklearn.preprocessing.scale"為陣列形狀的資料集的標準化提供了一個快捷實現:

from sklearn import preprocessingimport numpy as np
X_train = np.array([[ 1., -1.,  2.],
                     [ 2.,  0.,  0.],
                     [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X_train)

X_scaled
Out[28]: 
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

經過縮放後的資料具有零均值以及標準方差:

X_scaled.mean(axis=0)
Out[29]: array([0., 0., 0.])

X_scaled.std(axis=0)
Out[30]: array([1., 1., 1.])

預處理 模組還提供了一個實用類 ,它實現了轉化器的API來計算訓練集上的平均值和標準偏差,以便以後能夠在測試集上重新應用相同的變換。因此,這個類適用於 的早期步驟:

from sklearn.preprocessing import StandardScaler
scaler = preprocessing.StandardScaler().fit(X_train)
scaler
Out[31]: StandardScaler(copy=True, with_mean=True, with_std=True)

scaler.mean_
Out[32]: array([1.        , 0.        , 0.33333333])

scaler.scale_
Out[33]: array([0.81649658, 0.81649658, 1.24721913])

scaler.transform(X_train)
Out[34]: 
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

縮放類物件可以在新的資料上實現和訓練集相同縮放操作:

 X_test = [[-1., 1., 0.]]
scaler.transform(X_test)                
array([[-2.44...,  1.22..., -0.26...]])

你也可以透過在建構函式 :class:StandardScaler 中傳入引數 with_mean=False` 或者``with_std=False 來取消中心化或縮放操作

將特徵縮放至特定範圍內

一種標準化是將特徵縮放到給定的最小值和最大值之間,通常在零和一之間,或者也可以將每個特徵的最大絕對值轉換至單位大小。可以分別使用 [MinMaxScaler] 和 [MaxAbsScaler] 實現。使用這種縮放的目的包括實現特徵極小方差的魯棒性以及在稀疏矩陣中保留零元素。以下是一個將簡單的資料矩陣縮放到[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]])

可以檢查縮放器(scaler)屬性,來觀察在訓練集中學習到的轉換操作的基本性質:

min_max_scaler.scale_                             array([ 0.5       ,  0.5       ,  0.33...])

>>> min_max_scaler.min_                               array([ 0.        ,  0.5       ,  0.33...])

如果給 提供一個明確的 feature_range=(min, max) ,完整的公式是:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

類 的工作原理非常相似,但是它只透過除以每個特徵的最大值將訓練資料特徵縮放至 [-1, 1] 範圍內,這就意味著,訓練資料應該是已經零中心化或者是稀疏資料。 例子::用先前例子的資料實現最大絕對值縮放操作。

以下是使用上例中資料運用這個縮放器的例子:

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                # doctest +NORMALIZE_WHITESPACE^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.])

在 [scale]模組中進一步提供了方便的功能。當你不想建立物件時,可以使用如 [minmax_scale]以及 [maxabs_scale].



作者:夜神moon
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3016/viewspace-2818428/,如需轉載,請註明出處,否則將追究法律責任。

相關文章