特徵工程介紹

特徵工程基礎知識

1.特徵工程是什麼

顧名思義,其本質是一項工程活動,目的是最大限度地從原始數據中提取特徵以供算法和模型使用。特徵處理是特徵工程的核心部分,sklearn庫提供了較爲完整的特徵處理方法,包括數據預處理,特徵選擇,降維等。

2.數據預處理

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

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

我們使用sklearn中的preproccessing庫來進行數據預處理,可以覆蓋以上問題的解決方案

2.1 無量綱化

無量綱化使不同規格的數據轉換到同一規格。常見的無量綱化方法有標準化和區間縮放法。標準化的前提是特徵值服從正態分佈,標準化後,其轉換成標準正態分佈。區間縮放法利用了邊界值信息,將特徵的取值區間縮放到某個特點的範圍。

2.1.1 標準化

標準化需要計算特徵的均值和標準差,公式表達爲:

使用preproccessing庫的StandardScaler類對數據進行標準化的代碼如下:

from sklearn.preprocessing import StandardScaler
 
#將數據data標準化,返回值爲標準化後的數據
StandardScaler().fit_transform(data)

2.1.2 區間縮放法

區間縮放法的思路有多種,常見的一種爲利用兩個最值進行縮放,公式表達爲:

使用preproccessing庫的MinMaxScaler類對數據進行區間縮放的代碼如下:


from sklearn.preprocessing import MinMaxScaler

#區間縮放,返回值爲縮放到[0, 1]區間的數據
MinMaxScaler().fit_transform(data)

2.1.3 歸一化

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

使用preproccessing庫的Normalizer類對數據進行歸一化的代碼如下:


from sklearn.preprocessing import Normalizer

#歸一化,返回值爲歸一化後的數據
Normalizer().fit_transform(data)

2.2 特徵二值化

定量特徵二值化的核心在於設定一個閾值,大於閾值的賦值爲1,小於等於閾值的賦值爲0,公式表達如下:

使用preproccessing庫的Binarizer類對數據進行二值化的代碼如下:

from sklearn.preprocessing import Binarizer
    
#二值化,閾值設置爲3,返回值爲二值化後的數據
Binarizer(threshold=3).fit_transform(data)

2.3 獨熱編碼

One-Hot編碼,又稱爲一位有效編碼,主要是採用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候只有一位有效。

使用preproccessing庫的OneHotEncoder類對數據進行獨熱編碼。

舉例:
在這裏插入圖片描述
如上表總共6個樣本,每個樣本有3個特徵。特徵“性別”,有2個可能的分類:male,female。那麼就可以用2位編碼來表示:10,01,每次只有1個位激活。特徵“所屬區域”,有3個可能的分類:即Europe,US,Asia。那麼就用3位編碼來表示:100,010,001,每次只有1個位激活。特徵“使用瀏覽器”,有4個可能的分類:即Firefox,Chrome,Safari,IE。那麼就用4位編碼來表示:1000,0100,0010,0001,每次只有1個位激活。

當有樣本的值爲[‘male’,’Asia’,’Safari’]時,通過獨熱編碼後就成爲:[1,0,0,0,1,0,0,1,0]。

代碼:

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
#將上述樣本值先寫成數據表的形式,然後轉化,6行3列
enc.fit([[0, 0, 0], [1, 1, 1], [0, 2, 2], [1, 0, 3], [1, 1, 0], [1, 2, 1]])
print enc.transform([[0, 2, 2]]).toarray()
# 輸出:[ 1.  0.  0.  0.  1.  0.  0.  1.  0.]

2.4 缺失值計算

由於各種各樣的原因,很多真實世界的數據集包括缺失值,這些缺失值通常編碼爲空白,NaN或其它佔位符。在scikit-learn裏使用不完整數據集的一個基本策略是,丟棄那些包括缺失值的行或列。然而,這樣做可能損失了有價值的數據。一個更好的策略是填補這些缺失值,即,根據已知的數據推斷它們的值。
使用preproccessing庫的Imputer類對缺失值進行填充,Imputer類提供了填補缺失值的基本策略。可以使用缺失值所在的行或列的均值、中位數、頻數最大的值

代碼如下:

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
Y=[[np.nan, 2], [6, np.nan], [7, 6]]
>>> imp.transform(Y)
array([[ 4.        ,  2.        ],
       [ 6.        ,  3.66666667],
       [ 7.        ,  6.        ]])

3.特徵選擇

當數據預處理完成後,我們需要選擇有意義的特徵輸入機器學習的算法和模型進行訓練。通常來說,從兩個方面考慮來選擇特徵:

  • 特徵是否發散:如果一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。
  • 特徵與目標的相關性:這點比較顯見,與目標相關性高的特徵,應當優選選擇。除方差法外,本文介紹的其他方法均從相關性考慮。

根據特徵選擇的形式又可以將特徵選擇方法分爲3種:

  • Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵。
  • Wrapper:包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特徵,或者排除若干特徵。
  • Embedded:集成法,先使用某些機器學習的算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於Filter方法,但是是通過訓練來確定特徵的優劣。

我們使用sklearn中的feature_selection庫來進行特徵選擇。

3.1 Filter(過濾法)

3.1.1 方差選擇法

使用方差選擇法,先要計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。使用feature_selection庫的VarianceThreshold類來選擇特徵的代碼如下:

from sklearn.feature_selection import VarianceThreshold
    
#方差選擇法,返回值爲特徵選擇後的數據
#參數threshold爲方差的閾值
VarianceThreshold(threshold=3).fit_transform(data)

3.1.2 相關係數法

使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的P值。用feature_selection庫的SelectKBest類結合相關係數來選擇特徵。

from sklearn.feature_selection import SelectKBest

過濾法還有卡方檢驗,互信息法等。

3.2 Wrapper(包裝法)

3.2.1 遞歸特徵消除法

遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。使用feature_selection庫的RFE類來選擇特徵的代碼如下:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
    
#遞歸特徵消除法,返回特徵選擇後的數據
#參數estimator爲基模型
#參數n_features_to_select爲選擇的特徵個數
#target爲數據的目標標籤向量
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(data, target)

3.3 Embedded(集成法)

3.3.1 基於樹模型的特徵選擇法

樹模型中GBDT也可用來作爲基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型,來選擇特徵的代碼如下:

 from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
    
 #GBDT作爲基模型的特徵選擇
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

4 降維

當特徵選擇完成後,可以直接訓練模型了,但是可能由於特徵矩陣過大,導致計算量大,訓練時間長的問題,因此降低特徵矩陣維度也是必不可少的。常見的有主成分分析法(PCA)線性判別分析(LDA),線性判別分析本身也是一個分類模型。PCA和LDA有很多的相似點,其本質是要將原始的樣本映射到維度更低的樣本空間中,但是PCA和LDA的映射目標不一樣:PCA是爲了讓映射後的樣本具有最大的發散性;而LDA是爲了讓映射後的樣本有最好的分類性能。所以說PCA是一種無監督的降維方法,而LDA是一種有監督的降維方法。

4.1 主成分分析法(PCA)

使用decomposition庫的PCA類選擇特徵的代碼如下:from

sklearn.decomposition import PCA
    
#主成分分析法,返回降維後的數據
#參數n_components爲主成分數目
PCA(n_components=2).fit_transform(data)

4.2 線性判別分析法(LDA)

使用lda庫的LDA類選擇特徵的代碼如下:

from sklearn.lda import LDA
    
#線性判別分析法,返回降維後的數據
#參數n_components爲降維後的維數
 LDA(n_components=2).fit_transform(data, target)
 參考:https://www.zhihu.com/question/29316149
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章