數據預處理 _ sklearn.preprocessing中的scale和standardscaler

Sklearn的 Preprocessing模塊提供了常見的將原始特徵向量轉換爲更適合下行估計器表示的函數和類. 一般而言,學習算法受益於數據集的標準化,如果數據集當中存在異常值,一些robust scaler和 transformer會更加適用. 在同一個數據集上不同的 scaler, transformer 和normalizer 的表現可以在以下網頁上查看:

http://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py

標準化

數據集的標準化是許多機器學習建模的普遍要求,如果特徵看起來一點都不像符合標準正態分佈的話,訓練得到的模型可能就會很糟心. 實際操作中我們經常會忽略數據分佈的形狀,僅僅對數據進行減去均值再除以標準差的集中化轉換. 

例如,學習算法的目標函數(比如支持向量機的RBF 內核或者線性模型中的 l1和 l2的正則項)用到的許多元素均假設所有特徵都集中在0附近並具有相同量級的方差. 如果某個特徵的方差數量級遠大於其他特徵,那麼這個特徵很可能主導目標函數並且使模型無法按照我們期待的那樣去正確的學習其他特徵,從而使其他特徵失效. 

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                                          
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])

 經過scale 處理的數據將具有0均值和單位方差:

>>> X_scaled.mean(axis=0)
array([ 0.,  0.,  0.])

>>> X_scaled.std(axis=0)
array([ 1.,  1.,  1.])

sklearn.preprocessing.scale可以沿着特定的座標軸對數據集進行標準化,在均值附近集中化數據並縮放至單位方差. 

參數包括:sklearn.preprocessing.scale(X, axis = 0, with_mean=True, with_std=True, copy=True)

X:需要進行集中化和縮放的數據,類似於數組,稀疏矩陣

axis:整數(默認是 0 )用來計算均值和標準差的軸. 當 axis=0 時,對各個特徵進行標準化;當 axis=1 時,會對每個樣本進行標準化

with_mean:boolean,布爾型,默認是 True,即在縮放之前對數據進行集中化

with_std:boolean,布爾型,默認是 True,即縮放數據至單位方差( 或單位標準差)

copy:boolean,布爾型,默認是 True,可選填. 設置爲 False 的時候即在原數據行上進行標準化,並禁止複製( 如果輸入是 numpy 數組或是 scipy.sparse CSC 矩陣並且 axis = 1)

 

Preprocessing 模塊還提供實用程序類 StandardScaler 執行轉換器 API 來計算訓練集的均值和標準差,然後應用同樣的轉換方法對測試集進行轉換. 移除特徵的均值並進行縮放,根據樣本集上的每一個特徵的各項統計值來進行集中化和縮放. 這個類也由此可以適用於 sklearn.pipeline.Pipeline 的早期步驟:

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

得到的 scaler 就可以用同樣的方法去轉換新的數據集了:

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

通過傳遞 with_mean=False 或者 with_std=False 可以禁止 StandardScaler 構造函數進行居中或縮放. 

參數包括:class.sklearn.preprocessing.StandardScaler(copy = True, with_mean = True, with_std = True )

copy:boolean,布爾型,可選填,默認爲 True,設置爲 False 時則會在原數據上進行縮放並且禁止副本. 然而這並不保證一直在原數據上操作,例外情況比如數據不是 numpy 的數組或者scipy.sparse CSR 矩陣,依然會返回一個副本 

with_mean:boolean,布爾型,默認爲 True,即在縮放前集中化數據

with_std:boolean,布爾型,默認爲 True,即縮放數據至單位方差( 或單位標準差)

Attributes 包括:scale_ 每個特徵的相對標度,mean_訓練集中每個特徵的均值,var_訓練集中每個特徵的方差

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章