天天看點

使用sklearn preprocessing進行資料預處理

在機器學習中,我們盡量的把資料轉成均值為0,方差為1滿足高斯分布的資料,這樣的好處使得資料比較均衡,算法不會因為某一個奇異的資料值而更偏向某一個資料。但是實際的情況中,我們通常不會太多的考慮資料的分布情況,而是通過均值集中資料,然後除以他們的标準差。

一.标準化,減均值,按照方差等比縮放

    資料的标準化:當個體的特征明顯不服從正态分布時,标準化表現的結果比較差。實際操作中,經常忽略資料的分布,通過減去資料的均值,通過标準差,實作資料的中心化。

1.使用sklearn中scale函數把資料按照行或列縮放到均值為0,方差為1,下面的代碼是從sklearn中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...]])

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

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

其中scale的函數原型如下:詳細參考sklearn使用手冊

klearn.preprocessing.

scale

(X, axis=0, with_mean=True, with_std=True, copy=True)

Parameters:

     X:待處理的資料

     axis = 0(按照列處理)/1(按照行處理),預設=0

     with_mean = True,在處理之前把資料去均值 

     with_std = True,在處理之前把資料除标準差

     copy = True,處理之後的資料,複制一份

2.使用sklearn中StandardScaler計算訓練資料集的平均值和标準差,以友善測試資料集進行同樣的變換,以下代碼來自sklearn

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

 注意:scaler = preprocessing.StandardScaler().fit(X_train),隻能按照列來減均值,除标準差

二:講資料集特征縮放到指定的範圍:

     1.MinMaxScaler進行縮放資料,通常我們指定區間為(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 = preprocessing.MinMaxScaler(feature_range=(1,2))

繼續閱讀