1. 程式人生 > 其它 >資料預處理 | 機器學習之特徵工程

資料預處理 | 機器學習之特徵工程

作者:蘇小保(jacksu) 華為工程師 擅長分散式系統、大資料、機器學習。github地址:https://github.com/jacksu

通過特徵提取,我們能得到未經處理的特徵,這時的特徵可能有以下問題:

不屬於同一量綱:即特徵的規格不一樣,不能夠放在一起比較。無量綱化可以解決這一問題。

資訊冗餘:對於某些定量特徵,其包含的有效資訊為區間劃分,例如學習成績,假若只關心“及格”或不“及格”,那麼需要將定量的考分,轉換成“1”和“0”表示及格和未及格。二值化可以解決這一問題。

定性特徵不能直接使用:某些機器學習演算法和模型只能接受定量特徵的輸入,那麼需要將定性特徵轉換為定量特徵。最簡單的方式是為每一種定性值指定一個定量值,但是這種方式過於靈活,增加了調參的工作。通常使用啞編碼的方式將定性特徵轉換為定量特徵**(https://stats.idre.ucla.edu/):假設有N種定性值,則將這一個特徵擴充套件為N種特徵,當原始特徵值為第i種定性值時,第i個擴充套件特徵賦值為1,其他擴充套件特徵賦值為0。啞編碼的方式相比直接指定的方式,不用增加調參的工作,對於線性模型來說,使用啞編碼後的特徵可達到非線性的效果。

存在缺失值:因為各種各樣的原因,真實世界中的許多資料集都包含缺失資料,這類資料經常被編碼成空格、NaNs,或其他佔位符。

資訊利用率低:不同的機器學習演算法和模型對資料中資訊的利用是不同的,之前提到線上性模型中,使用對定性特徵啞編碼可以達到非線性的效果。類似地,對定量變數多項式化,或者進行其他的轉換,都能達到非線性的效果。

無量鋼化

1

標準化

資料的標準化是將資料按比例縮放,使之落入一個小的特定區間。在某些比較和評價的指標處理中經常會用到,去除資料的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行比較和加權。

公式為:(X-mean)/std 計算時對每個屬性/每列分別進行。

將資料按屬性(按列進行)減去其均值,併除以其方差。得到結果是,對於每個屬性(每列)來說所有資料都聚集在0附近,方差為1。

from sklearn.datasets import load_irisimport numpy as np  X = np.array([[ 1., -1.,  2.],               [ 2.,  0.,  0.],               [ 0.,  1., -1.]])from sklearn import preprocessing X_scaled = preprocessing.scale(X) print(X_scaled) print(X_scaled.mean(axis=0)) print(X_scaled.std(axis=0))
out
[[ 0.         -1.22474487  1.33630621]  [ 1.22474487  0.         -0.26726124]  [-1.22474487  1.22474487 -1.06904497]] [ 0.  0.  0.] [ 1.  1.  1.]

sklearn 還提供了StandardScaler類,使用該類的好處在於可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料。

scaler = preprocessing.StandardScaler().fit(X) print(scaler) print(scaler.mean_)                                      print(scaler.scale_)                                      print(scaler.transform(X)) scaler.transform([[-1.,  1., 0.]])
out
StandardScaler(copy=True, with_mean=True, with_std=True) [ 1.          0.          0.33333333] [ 0.81649658  0.81649658  1.24721913] [[ 0.         -1.22474487  1.33630621]  [ 1.22474487  0.         -0.26726124]  [-1.22474487  1.22474487 -1.06904497]] Out[9]: array([[-2.44948974,  1.22474487, -0.26726124]]) 

區間縮放

另一種常用的方法是將屬性縮放到一個指定的最大和最小值(通常是1-0)之間,這可以通過preprocessing.MinMaxScaler類實現。

使用這種方法的目的包括:

1、對於方差非常小的屬性可以增強其穩定性。 2、維持稀疏矩陣中為0的條目。

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) print(X_train_minmax) 
out
[[ 0.5         0.          1.        ]  [ 1.          0.5         0.33333333]  [ 0.          1.          0.        ]]

歸一化

歸一化是依照特徵矩陣的行處理資料,其目的在於樣本向量在點乘運算或其他核函式計算相似性時,擁有統一的標準,也就是說都轉化為“單位向量”。規則為l2的歸一化公式如下:

該方法主要應用於文字分類和聚類中。例如,對於兩個TF-IDF向量的l2-norm進行點積,就可以得到這兩個向量的餘弦相似性。

X_normalized = preprocessing.normalize(X_train, norm='l2') print(X_normalized) normalizer = preprocessing.Normalizer().fit(X_train) normalizer.transform(X_train)
out
[[ 0.40824829 -0.40824829  0.81649658]  [ 1.          0.          0.        ]  [ 0.          0.70710678 -0.70710678]] Out[16]: array([[ 0.40824829, -0.40824829,  0.81649658],        [ 1.        ,  0.        ,  0.        ],        [ 0.        ,  0.70710678, -0.70710678]])

後面接著介紹資料預處理

參考

1、關於使用sklearn進行資料預處理 —— 歸一化/標準化/正則化(http://www.cnblogs.com/chaosimple/p/4153167.html)

2、統計資料歸一化與標準化(http://blog.csdn.net/mpbchina/article/details/7573519)

3、標準化和歸一化什麼區別?(https://www.zhihu.com/question/20467170)

4、特徵工程到底是什麼?(https://www.zhihu.com/question/29316149)

5、sklearn preprocess(http://sklearn.lzjqsdd.com/modules/preprocessing.html)