標準化,也稱去均值和方差按比例縮放
數據集的 標準化 對scikit-learn中實現的大多數機器學習算法來說是 常見的要求 。如果個別特徵或多或少看起來不是很像標準正態分佈(具有零均值和單位方差),那麼它們的表現力可能會較差。在實際情況中,我們經常忽略特徵的分佈形狀,直接經過去均值來對某個特徵進行中心化,再通過除以非常量特徵(non-constant features)的標準差進行縮放。
例如,在機器學習算法的目標函數(例如SVM的RBF內核或線性模型的l1和l2正則化),許多學習算法中目標函數的基礎都是假設所有的特徵都是零均值並且具有同一階數上的方差。如果某個特徵的方差比其他特徵大幾個數量級,那麼它就會在學習算法中佔據主導位置,導致學習器並不能像我們說期望的那樣,從其他特徵中學習。
函數 [scale
]"sklearn.preprocessing.scale"爲數組形狀的數據集的標準化提供了一個快捷實現:
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
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.])
預處理
模塊還提供了一個實用類 StandardScaler
,它實現了轉化器的API來計算訓練集上的平均值和標準偏差,以便以後能夠在測試集上重新應用相同的變換。因此,這個類適用於 sklearn.pipeline.Pipeline
的早期步驟:
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...])
如果給 MinMaxScaler
提供一個明確的 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
類 MaxAbsScaler
的工作原理非常相似,但是它只通過除以每個特徵的最大值將訓練數據特徵縮放至 [-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
].