機器學習之特征工程-數據預處理

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

  • 不屬于同一量綱:即特征的規格不一樣,不能夠放在一起比較。無量綱化可以解決這一問題。
  • 信息冗余:對于某些定量特征,其包含的有效信息為區間劃分,例如學習成績,假若只關心“及格”或不“及格”,那么需要將定量的考分,轉換成“1”和“0”表示及格和未及格。二值化可以解決這一問題。
  • 定性特征不能直接使用:某些機器學習算法和模型只能接受定量特征的輸入,那么需要將定性特征轉換為定量特征。最簡單的方式是為每一種定性值指定一個定量值,但是這種方式過于靈活,增加了調參的工作。通常使用啞編碼的方式將定性特征轉換為定量特征**:假設有N種定性值,則將這一個特征擴展為N種特征,當原始特征值為第i種定性值時,第i個擴展特征賦值為1,其他擴展特征賦值為0。啞編碼的方式相比直接指定的方式,不用增加調參的工作,對于線性模型來說,使用啞編碼后的特征可達到非線性的效果。
  • 存在缺失值:因為各種各樣的原因,真實世界中的許多數據集都包含缺失數據,這類數據經常被編碼成空格、NaNs,或其他占位符。
  • 信息利用率低:不同的機器學習算法和模型對數據中信息的利用是不同的,之前提到在線性模型中,使用對定性特征啞編碼可以達到非線性的效果。類似地,對定量變量多項式化,或者進行其他的轉換,都能達到非線性的效果。

無量綱化

標準化

數據的標準化是將數據按比例縮放,使之落入一個小的特定區間。在某些比較和評價的指標處理中經常會用到,去除數據的單位限制,將其轉化為無量綱的純數值,便于不同單位或量級的指標能夠進行比較和加權。
公式為:(X-mean)/std 計算時對每個屬性/每列分別進行。
將數據按屬性(按列進行)減去其均值,并除以其方差。得到結果是,對于每個屬性(每列)來說所有數據都聚集在0附近,方差為1。

from sklearn.datasets import load_iris
import 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的條目。

image.png
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的歸一化公式如下:


image.png

該方法主要應用于文本分類和聚類中。例如,對于兩個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]])

后面接著介紹數據預處理

參考

關于使用sklearn進行數據預處理 —— 歸一化/標準化/正則化
統計數據歸一化與標準化
標準化和歸一化什么區別?
特征工程到底是什么?
sklearn preprocess

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 擴展閱讀: 數據預處理 特征二值化 對于某些定量特征,其包含的有效信息為區間劃分,例如學習成績,假若只關心“及格”...
    jacksu在簡書閱讀 2,184評論 0 3
  • 0 關于本文 ? 主要內容和結構框架由@jasonfreak--使用sklearn做單機特征工程提供,其中夾雜...
    mrlevo520閱讀 21,485評論 4 61
  • 作者:jasonfreak,原文地址:使用sklearn做單機特征工程 目錄 特征工程是什么? 數據預處理2.1 ...
    JSong1122閱讀 1,120評論 0 8
  • 文章主要參考于大神城東(部分認為有問題的地方進行了修改) 1. 特征工程是什么? 數據和特征決定了機器學習的上限,...
    jockerMe閱讀 1,732評論 0 11
  • 昨天在微博上看到推薦簡書的APP,覺得挺對我的胃口的,于是這才下載下來,今天第一次使用。原諒我的不與時俱進,原諒我...
    櫻蓂雪閱讀 832評論 0 0