1. 程式人生 > >Preprocessing data-sklearn資料預處理

Preprocessing data-sklearn資料預處理

1. Standardization, or mean removal and variance scaling

Standardization即標準化,儘量將資料轉化為均值為零,方差為一的資料。 實際中我們會忽略資料的分佈情況,僅僅是通過改變均值來集中資料,然後將非連續特徵除以他們的標準差。 sklearn中scale函式提供了簡單快速的single array-like資料集操作
from sklearn import preprocessing
import numpy as np
x = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])
x_scaled = preprocessing.scale(x)
print x_scaled
output [[ 0.         -1.22474487  1.33630621]  [ 1.22474487  0.         -0.26726124]  [-1.22474487  1.22474487 -1.06904497]] scale處理之後為零均值和單位方差:
X_scaled.mean(axis=0)array([ 0.,  0.,  0.])
X_scaled.std(axis=0)array([ 1.,  1.,  1.])
計算平均值和標準偏差在一個訓練集,可以以後再申請相同的轉換測試集。
scaler=preprocessing.StandardScaler().fit(X)
scalerStandardScaler(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)array([[ 0.  ..., -1.22...,  1.33...],       [ 1.22...,  0.  ..., -0.26...],       [-1.22...,  1.22..., -1.06...]])
同樣的,將相同的轉化應用到測試集合。
scaler.transform([[-1.,1.,0.]])array([[-2.44...,  1.22..., -0.26...]])
對於StandardScaler你也可以改變它的一些引數,例如
scaler = preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True).fit(X)

1.1 Scaling features to a range

另一種標準化可以使用scal將特徵標準化到指定的最大值和最小值之間,有連個函式:MinMaxScaleror
例如轉化到[0,1]之間
X_train=np.array([[1.,-1.,2.],... [2.,0.,0.],... [0.,1.,-1.]])...
min_max_scaler=preprocessing.MinMaxScaler(copy=True, feature_range=(0, 1))
X_train_minmax=min_max_scaler.fit_transform(X_train)
X_train_minmaxarray([[ 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_minmaxarray([[-1.5       ,  0.        ,  1.66666667]])
如果MinMaxScaler給定了feature_range,其公式為
X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))X_scaled=X_std*(max-min)+min

和scales工作很相似,但是scales是將特徵調整到特定值,而MaxAbsScaler對於本來中心店就是零或者稀疏的資料,是不會改變的。

1.2 Scaling sparse data

定心稀疏資料的稀疏結構會破壞資料,因此很少是一個明智的做法。然而,它可以合理規模稀疏的輸入,特別是特性在不同的尺度上。

1.3 Scaling data with outliers

如果您的資料包含了許多異常值,擴充套件使用資料的均值和方差可能不能很好地工作。在這些情況下,您可以使用robust_scale和RobustScaler作為替代。他們使用更健壯的中心和範圍的估計資料。 是否應該標準化資料: 據使用sklearn.decomposition.PCA or sklearn.decomposition.RandomizedPCA with whiten=True深入的移除特徵中的線性相關性。

2. Normalization

正常化的過程是縮放單個樣本的單位標準。這個過程可能是有用的,如果你打算使用二次形式如點積或任何其他核心量化任何一對樣本的相似性。
X=[[1.,-1.,2.],... [2.,0.,0.],... [0.,1.,-1.]]
X_normalized=preprocessing.normalize(X,norm='l2')
X_normalizedarray([[ 0.40..., -0.40...,  0.81...],       [ 1.  ...,  0.  ...,  0.  ...],       [ 0.  ...,  0.70..., -0.70...]])
它也可以像前面一樣的方式使用:
normalizer=preprocessing.Normalizer().fit(X)# fit does nothing
normalizer.transform(X)
array([[ 0.40..., -0.40...,  0.81...],       [ 1.  ...,  0.  ...,  0.  ...],       [ 0.  ...,  0.70..., -0.70...]])normalizer.transform([[-1.,1.,0.]])array([[-0.70...,  0.70...,  0.  ...]])

Sparse input

normalize and Normalizer接受scipy密集的陣列類和稀疏矩陣.

3. Binarization

特徵二值化閾值的過程即轉化為布林值數值特性。
X=[[1.,-1.,2.],... [2.,0.,0.],... [0.,1.,-1.]]
binarizer=preprocessing.Binarizer().fit(X)# fit does nothing
binarizerBinarizer(copy=True, threshold=0.0)
binarizer.transform(X)array([[ 1.,  0.,  1.],       [ 1.,  0.,  0.],       [ 0.,  1.,  0.]])
調整threshold之後:
binarizer=preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)array([[ 0.,  0.,  1.],       [ 1.,  0.,  0.],       [ 0.,  0.,  0.]])
支援Sparse input

4. Encoding categorical features

經常會有些特徵並不是連續的數值化的特徵,例如["male", "female"],它可以被表示成[1,2],當然,sklearn是不能直接做到這樣的。 但是,它可以做到將這個估計將每個分類特性與m可能值轉換成二進位制特徵,只有一個有效。
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
OneHotEncoder(categorical_features='all', dtype=<... 'float'>,
       handle_unknown='error', n_values='auto', sparse=True)
enc.transform([[0, 1, 3]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])
其實可以通過從字典載入特徵來實現上面的思想:
measurements = [
    {'city': 'Dubai', 'temperature': 33.},
    {'city': 'London', 'temperature': 12.},
    {'city': 'San Fransisco', 'temperature': 18.},
]
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
vec.fit_transform(measurements).toarray()array([[  1.,   0.,   0.,  33.],       [  0.,   1.,   0.,  12.],       [  0.,   0.,   1.,  18.]])
vec.get_feature_names()['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']

5. Imputation of missing values

由於各種原因,會導致真實世界中資料集會丟失部分值,如銀行等。一種解決辦法是去掉這些包含丟失值的行,當然,這樣的話就會丟棄掉許多資料,因此可以採取更好的策略來填充丟失的資料,例如通過他們已知的資料來推測。 提供基本的填充方法,例如使用均值或者中位數填充。當然還有許多其他的方法。
import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))          
                 
[[ 4.          2.        ]
 [ 6.          3.666...]
 [ 7.          6.        ]]


缺失值也可以使用0表示:
import scipy.sparse as sp
X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit(X)
Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)
X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
print(imp.transform(X_test))                      
[[ 4.          2.        ]
 [ 6.          3.666...]
 [ 7.          6.        ]]

6. Generating polynomial features

使用多項式特徵,可以建立高階特徵和相互關聯的特徵:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(6).reshape(3, 2)
X                                                 
array([[0, 1],
       [2, 3],
       [4, 5]])
poly = PolynomialFeatures(2)
poly.fit_transform(X)                             
array([[  1.,   0.,   1.,   0.,   0.,   1.],
       [  1.,   2.,   3.,   4.,   6.,   9.],
       [  1.,   4.,   5.,  16.,  20.,  25.]])
轉換 設定interaction_only=True,時只使用互動作用項
X = np.arange(9).reshape(3, 3)
X                                                 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
poly = PolynomialFeatures(degree=3, interaction_only=True)
poly.fit_transform(X)                             
array([[   1.,    0.,    1.,    2.,    0.,    0.,    2.,    0.],
       [   1.,    3.,    4.,    5.,   12.,   15.,   20.,   60.],
       [   1.,    6.,    7.,    8.,   42.,   48.,   56.,  336.]])
轉換為: 擴充套件維度之後的效果。

7. Custom transformers

FunctionTransformer.可以在傳遞途徑(pipeline)中使用轉換。 以下是使用 log transformation情況。
import numpy as np
from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(np.log1p)
X = np.array([[0, 1], [2, 3]])
transformer.transform(X)
array([[ 0.        ,  0.69314718],
       [ 1.09861229,  1.38629436]])

CSDN部落格原文: 授人以魚不如授人以漁: