【處理流程03】特徵選擇

參考文獻:
1.sklearn文檔
2.博客

目錄
1 特徵工程是什麼?
2 數據預處理
  2.1 無量綱化
    2.1.1 標準化
    2.1.2 區間縮放法
    2.1.3 標準化與歸一化的區別
  2.2 對定量特徵二值化
  2.3 對定性特徵啞編碼
  2.4 缺失值計算
  2.5 數據變換
  2.6 回顧
3 特徵選擇
  3.1 Filter
    3.1.1 方差選擇法
    3.1.2 相關係數法
    3.1.3 卡方檢驗
    3.1.4 互信息法
  3.2 Wrapper
    3.2.1 遞歸特徵消除法
  3.3 Embedded
    3.3.1 基於懲罰項的特徵選擇法
    3.3.2 基於樹模型的特徵選擇法
  3.4 回顧

4 降維
  4.1 主成分分析法(PCA)
  4.2 線性判別分析法(LDA)
  4.3 回顧

%*************************************************************************************************************************************%

3.特徵選擇

在這裏插入圖片描述
當數據預處理完成後,我們需要選擇有意義的特徵輸入機器學習的算法和模型進行訓練。通常來說,從兩個方面考慮來選擇特徵:
【1】特徵是否發散:如果一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。
【2】特徵與目標的相關性:這點比較顯見,與目標相關性高的特徵,應當優選選擇。除方差法外,本文介紹的其他方法均從相關性考慮。

根據特徵選擇的形式又可以將特徵選擇方法分爲3種:
【1】Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵。

【2】Wrapper:包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特徵,或者排除若干特徵。

【3】Embedded:嵌入法,先使用某些機器學習的算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於Filter方法,但是是通過訓練來確定特徵的優劣。

3.1Filter
3.1.1方差選擇法
VarianceThreshold 是特徵選擇的一個簡單基本方法,它會移除所有那些方差不滿足一些閾值的特徵。默認情況下,它將會移除所有的零方差特徵,即那些在所有的樣本上的取值均不變的特徵。

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))    閾值
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])
正如預期一樣, VarianceThreshold 移除了第一列,它的值爲 0 的概率爲 p = 5/6 > .8

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

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
選擇K個最好的特徵,返回選擇特徵後的數據
第一個參數爲計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項爲第i個特徵的評分和P值。在此定義爲計算相關係數
參數k爲選擇的特徵個數
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

3.1.3卡方檢驗
經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。假設自變量有N種取值,因變量有M種取值,考慮自變量等於i且因變量等於j的樣本頻數的觀察值與期望的差距,構建統計量:
在這裏插入圖片描述

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

選擇K個最好的特徵,返回選擇特徵後的數據
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

3.1.4互信息法

from sklearn.feature_selection import SelectKBest
from minepy import MINE

由於MINE的設計不是函數式的,定義mic方法將其爲函數式的,返回一個二元組,二元組的第2項設置成固定的P值0.5
def mic(x, y):
     m = MINE()
     m.compute_score(x, y)
     return (m.mic(), 0.5)

 選擇K個最好的特徵,返回特徵選擇後的數據
 SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

3.2 Wrapper
3.2.1 遞歸特徵消除法
遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

遞歸特徵消除法,返回特徵選擇後的數據
參數estimator爲基模型
參數n_features_to_select爲選擇的特徵個數
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

3.3 Embedded
3.3.1 基於懲罰項的特徵選擇法
使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。使用feature_selection庫的SelectFromModel類結合帶L1懲罰項的邏輯迴歸模型,來選擇特徵的代碼如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression

帶L1懲罰項的邏輯迴歸作爲基模型的特徵選擇
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)

L1懲罰項降維的原理在於保留多個對目標值具有同等相關性的特徵中的一個,所以沒選到的特徵不代表不重要。故,可結合L2懲罰項來優化。具體操作爲:若一個特徵在L1中的權值爲1,選擇在L2中權值差別不大且在L1中權值爲0的特徵構成同類集合,將這一集合中的特徵平分L1中的權值,故需要構建一個新的邏輯迴歸模型:
使用feature_selection庫的SelectFromModel類結合帶L1以及L2懲罰項的邏輯迴歸模型,來選擇特徵的代碼如下:

from sklearn.feature_selection import SelectFromModel
 
帶L1和L2懲罰項的邏輯迴歸作爲基模型的特徵選擇
參數threshold爲權值係數之差的閾值
SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)

3.3.2 基於樹模型的特徵選擇法
基於樹的 estimators (查閱 sklearn.tree 模塊和樹的森林在 sklearn.ensemble 模塊)可以用來計算特徵的重要性,然後可以消除不相關的特徵(當與 sklearn.feature_selection.SelectFromModel 等元轉換器一同使用時):

>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier()
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape               
(150, 2)

4.降維

在這裏插入圖片描述
當特徵選擇完成後,可以直接訓練模型了,但是可能由於特徵矩陣過大,導致計算量大,訓練時間長的問題,因此降低特徵矩陣維度也是必不可少的。常見的降維方法除了以上提到的基於L1懲罰項的模型以外,另外還有主成分分析法(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(iris.data)4.2 線性判別分析法(LDA)

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

from sklearn.lda import LDA

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