機器學習--特徵選擇

1、特徵選擇

特徵選擇是重要的數據預處理過程,特種選擇有兩個重要的原因:

  • 1 如果屬性過多,會造成維數災難,也就是隨着屬性變多,總體的特徵數量呈指數級增長
  • 2 去除不相關的特徵可以降低機器學習的難度。

2、子集搜索與評價

子集搜索

子集搜索方法包含:向前、向後、雙向搜索。
採用貪心的思想,“向前”選取特徵,特徵集初沒有參數,每一輪選取一個加入後模型最佳的特徵,也可以“向後”選取特徵,一開始選取所有的特徵,每次減少一個。也可以採用雙向的策略,一邊增大一邊減小,將兩者集合起來。

子集評價

子集評價方法包含:信息增益,交叉熵,相關性,餘弦相似度等評級準則。

3、特徵選擇方法

3.1、過濾式

過濾式是指在模型訓練之前對特徵進行篩選,其中Relief是一種著名的過濾式選擇的方法,它第j個特徵的評價指標是:

δj=idiff(xji,xji,nh)2+diff(xji,xii,nm)2

其中diff(xji,xji,nh) 是每個樣本點離屬於這個類型的樣本點同類中最近的一個點,diff(xji,xji,nm) 是每個樣本點離不屬於這個類型的樣本點同類中最近的一個點,可以看到如果δj 的值越大,說明它離同類比較近,離異類比較遠,說明這個特徵的分類效果越好。

sklearn上的方法:

3.1.1、利用方差
利用方差過濾,設定一個閾值,小於這個閾值的方差去掉。

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)

第一個特徵基本全部是0,只有一個是1,區分度很低,會過濾掉。

3.1.2、單變量選擇
單變量特徵選擇能夠對每一個特徵進行測試,衡量該特徵和響應變量之間的關係,根據得分扔掉不好的特徵。對於迴歸和分類問題可以採用卡方檢驗等方式對特徵進行測試。

這種方法比較簡單,易於運行,易於理解,通常對於理解數據有較好的效果(但對特徵優化、提高泛化能力來說不一定有效);這種方法有許多改進的版本、變種。

卡方值選擇特徵

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
# chi2是卡方檢驗,k=2意味着保留兩個特徵
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)

3.1.3另外的方法:

  • information gain(信息增益),決策樹的算法
  • correlation coefficient scores(相關係數)

3.2、包裹式

與過濾不同,過濾的方法不考慮訓練時的情況,而包裹是用訓練後的模型作爲評價標準,量身定做出最優的特徵子集,比過濾法要好,但同時也會加大很多的計算複雜度。利用交叉驗證的方法對特徵進行選擇,經典的方法是LVW,在SKlearn上這類型的方法是:recursive feature elimination algorithm(遞歸特徵消除算法)

選取一個基學習器,設定要保留參數個數

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFE
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
selector = RFE(estimator, 5, step=1)
selector = selector.fit(X, y)
selector.support_ 
#array([ True,  True,  True,  True,  True, False, False, False, False, False], dtype=bool)
selector.ranking_
# array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])

3.3、嵌入式

包裹式選擇和過濾式選擇,模型訓練和特徵選擇有明顯的分開,而嵌入式選擇是將選擇融入到訓練之中,最簡單的是帶L1正則項目的迴歸算法,在L1正則化中,能得到比較稀疏的解(一部分特徵的係數爲0),達到特徵選擇的目的。

3.3.1 L1 正則化

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)
# SelectFromModel(estimator, threshold=None, prefit=False, norm_order=1)
# prefit = True即是用訓練好的模型進行特徵選擇
# 可以設定一個閾值threshold,不設定爲默認值,L1正則化的默認值是1e-5。
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X_new.shape
#(150, 3)

3.3.2 樹模型爲基礎

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、降維學習

還可以採用一些降維學習的方法降低特徵的維度,如PCA、LDA。

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