1、特徵選擇
特徵選擇是重要的數據預處理過程,特種選擇有兩個重要的原因:
- 1 如果屬性過多,會造成維數災難,也就是隨着屬性變多,總體的特徵數量呈指數級增長
- 2 去除不相關的特徵可以降低機器學習的難度。
2、子集搜索與評價
子集搜索
子集搜索方法包含:向前、向後、雙向搜索。
採用貪心的思想,“向前”選取特徵,特徵集初沒有參數,每一輪選取一個加入後模型最佳的特徵,也可以“向後”選取特徵,一開始選取所有的特徵,每次減少一個。也可以採用雙向的策略,一邊增大一邊減小,將兩者集合起來。
子集評價
子集評價方法包含:信息增益,交叉熵,相關性,餘弦相似度等評級準則。
3、特徵選擇方法
3.1、過濾式
過濾式是指在模型訓練之前對特徵進行篩選,其中Relief是一種著名的過濾式選擇的方法,它第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。