1. 程式人生 > >數據處理與轉換

數據處理與轉換

class 直接 led mea highlight 矩陣 1.0 style and

目錄 一.歸一化   1.1 最小最大值標準化(MinMaxScaler)   1.2絕對值最大標準化( MaxAbsScaler) 二.標準化   2.1 零均值單位方差(scale   2.2 訓練數據的均值方差(StandardScaler) 三.正則化(Normalization)   3.1 L1、L2正則化 四.其他方法   4.1 特征二值化   4.2 自定義轉換

一.歸一化

  1.1 最小最大值標準化(MinMaxScaler)

將屬性縮放到一個指定的最大和最小值(通常是0-1)之間,常用的最小最大規範化方法(x-min(x))/(max(x)-min(x)),這可以通過preprocessing.MinMaxScaler類實現。 使用這種方法的目的包括:
1、對於方差非常小的屬性可以增強其穩定性。 2、維持稀疏矩陣中為0的條目,即保留數據中的0元素
import numpy as np
from sklearn import preprocessing 

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 
[out]array([[0.5       , 0.        , 1.        ],
       [
1. , 0.5 , 0.33333333], [0. , 1. , 0. ]]) #縮放因子等屬性 min_max_scaler.scale_ [out]array([0.5 , 0.5 , 0.33333333]) min_max_scaler.min_ [out]array([0. , 0.5 , 0.33333333])

  1.2絕對值最大標準化( MaxAbsScaler)

與上述標準化方法相似,但是它通過除以最大值將訓練集縮放至[-1,1]。應用於數據以0為中心或者是含有非常非常多0的稀疏數據。

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 
[out]array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])

二.標準化

數據的標準化是將數據按比例縮放,使之落入一個小的特定區間,標準化後的數據可正可負,但是一般絕對值不會太大。一般是 z-score規範化方法:(x-mean(x))/std(x)

實現時,有兩種不同的方式:

  2.1 零均值單位方差(scale

使用sklearn.preprocessing.scale()函數,可以直接將給定數據進行標準化。

X = np.array([[1., -1., 2.], 
              [2., 0., 0.], 
              [0., 1., -1.]])  

X_scaled = preprocessing.scale(X) 
X_scaled
[out]array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

#scaled之後的數據零均值,單位方差
X_scaled.mean(axis=0)
[out]array([0., 0., 0.])

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

  

  2.2 訓練數據的均值方差(StandardScaler)

使用sklearn.preprocessing.StandardScaler類,使用該類的好處在於可以保存訓練集中的參數(均值、方差)直接使用其對象轉換測試集數據。

scaler = preprocessing.StandardScaler().fit(X)
scaler
[out]StandardScaler(copy=True, with_mean=True, with_std=True)

#均值
scaler.mean_  
[out]array([1.        , 0.        , 0.33333333])

#方差
scaler.var_ 
[out]array([0.66666667, 0.66666667, 1.55555556])

#數據轉換
scaler.transform(X)  
[out]array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

註:1.若設置with_mean=False 或者 with_std=False,則不做centering 或者scaling處理。

  2.scale和StandardScaler可以用於回歸模型中的目標值處理。

三.正則化

  3.1 L1、L2正則化(Normalization)

正則化的過程是將每個樣本縮放到單位範數(每個樣本的範數為1),如果後面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。

Normalization主要思想是對每個樣本計算其p-範數,然後對該樣本中每個元素除以該範數,這樣處理的結果是使得每個處理後樣本的p-範數(L1-norm,L2-norm)等於1。

p-範數的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p

該方法主要應用於文本分類和聚類中。

可以使用preprocessing.normalize()函數對指定數據進行轉換:

X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
    [ 0.,  1., -1.]]
X_normalized = preprocessing.normalize(X, norm=l2)
 
X_normalized  
[out]array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])

可以使用processing.Normalizer()類實現對訓練集和測試集的擬合和轉換:

normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
normalizer
[out]Normalizer(copy=True, norm=l2)
 
normalizer.transform(X)                            
[out]array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])
 
normalizer.transform([[-1.,  1., 0.]])             
[out]array([[-0.70...,  0.70...,  0.  ...]])

四.其他方法

  4.1 特征二值化

特征二值化是把數值特征轉化成布爾值的過程。這個方法對符合多變量伯努利分布的輸入數據進行預測概率參數很有效。詳細可以見這個例子sklearn.neural_network.BernoulliRBM.

#data
X = [[ 1., -1.,  2.],
         [ 2.,  0.,  0.],
         [ 0.,  1., -1.]]

#binary
binarizer = preprocessing.Binarizer().fit(X)  # fit does nothing
binarizer
[out]Binarizer(copy=True, threshold=0.0)

#transform
binarizer.transform(X)
[out]array([[ 1.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.]])     

# 調整閾值
binarizer = preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
[out]array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  0.]])

 

  4.2 自定義轉換

如果以上的方法覺得都不夠,譬如你想用對數據取對數,可以自己用 FunctionTransformer自定義一個轉化器,並且可以在Pipeline中使用
from sklearn.preprocessing import FunctionTransformer

transformer = FunctionTransformer(np.log1p)#括號內的就是自定義函數
X = np.array([[0, 1], [2, 3]])
transformer.transform(X)
[out]array([[0.        , 0.69314718],
       [1.09861229, 1.38629436]])
參考: https://www.cnblogs.com/charlotte77/p/5622325.html https://www.cnblogs.com/zhanglianbo/p/5690974.html

數據處理與轉換