機器學習 特徵選擇(過濾法 封裝法 嵌入法)

特徵選擇

在機器學習工程中,特徵工程纔是最重要,特徵決定着算法的上限,特徵工程中最爲重要和最爲基礎的兩種技術,就是特徵選擇和特徵降維。特徵選擇和特徵降維的目的很簡單,就是選擇出或變換出更優的特徵,從而更利於我們學習算法的學習

這特徵選擇的目的和特徵降維的目的類似,但是特徵選擇和特徵降維具有本質的區別,特徵降維的主要特點是通過一個數學變換進行降維,而特徵選擇就是從衆多特徵中剔除不重要的特徵,從而保留重要的特徵。雖然簡單粗暴,但是極其容易實現,並易於使用,所以在工程中特徵選擇的使用頻率要高於特徵降維。下面給大家說一下特徵選擇。

通常來說,我們需要從兩點來考慮:

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

根據不同的形式,我們可以將特徵選擇分爲三種:

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

過濾法(Filter)

  • 方差選擇法:計算各個特徵方差,選擇方差大於閾值的特徵。當特徵值都是離散型變量的時候這種方法才能用,如果是連續型變量,就需要將連續變量離散化之後才能用。可以把它作爲特徵選擇的預處理,先去掉那些取值變化小的特徵,然後再從接下來提到的的特徵選擇方法中選擇合適的進行進一步的特徵選擇。可以從from sklearn.feature_selection import VarianceThreshold 使用這個方法。

  • 相關係數法:計算各個特徵的Pearson相關係數 (對於迴歸問題(y連續)),前陣子寫的文章介紹這些係數和python代碼實現。 https://blog.csdn.net/weixin_43172660/article/details/83960665

  • 卡方(Chi2)檢驗:就是統計樣本的實際觀測值與理論推斷值之間的偏離程度,實際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小**(對於分類問題(y離散)),卡方值越大,越不符合;卡方值越小,偏差越小,越趨於符合。可以從from sklearn.feature_selection import chi2**使用這個方法。下面介紹一個例子,從4個特徵裏面篩選出兩個最重要的特徵。

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
#移除得分前 k 名以外的所有特徵(取top k)
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
X_new.shape
(150, 2)
  • 互信息法:計算各個特徵的信息增益

以上就是一些常用的過濾法,對於過濾法,優點: 快速, 只需要基礎統計知識。缺點:特徵之間的組合效應難以挖掘。

封裝法(Wrapper)

  • 遞歸消除特徵法:遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,移除平方值最小的那個序號i對應的特徵,再基於新的特徵集進行下一輪訓練。以此類推,直到剩下的特徵數滿足我們的要求爲止。下面是一篇具體實現的文章:https://blog.csdn.net/fontthrone/article/details/79004874

優點: 直接面向算法優化, 不需要太多知識。缺點: 龐大的搜索空間, 需要定義啓發式策略。

嵌入法(Embedded)

  • 使用帶懲罰項的基模型進行特徵選擇:比如LR加入正則。通過L1正則項來選擇特徵:L1正則方法具有稀疏解的特性,因此天然具備特徵選擇的特性,但是要注意,L1沒有選到的特徵不代表不重要,原因是兩個具有高相關性的特徵可能只保留了一個,如果要確定哪個特徵重要應再通過L2正則方法交叉檢驗。
from sklearn.svm import LinearSVC
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)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X_new.shape
(150, 3)
  • 樹模型的特徵選擇(隨機森林、決策樹):訓練能夠對特徵打分的預選模型:RandomForest和Logistic Regression等都能對模型的特徵打分,通過打分獲得相關性後再訓練最終模型。
 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)

優點:效果最好速度最快,模式單調,快速並且效果明顯。缺點:但是如何參數設置, 需要深厚的背景知識。

總結

各個方法有各個的特點,具體選用哪個方法,需要我們多進行嘗試!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章