目錄
第二章(pandas)
Python資料處理從零開始----第二章(pandas)③資料标準化(1)
第四章(可視化)
===============================================
标準化,也稱去均值和方差按比例縮放
資料集的 标準化 對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].