從現有的m個特徵中選出n個特徵(n<=m),降低特徵維度減少計算量的同時,使模型效果達到最優。
在實際業務中,用於模型中的特徵維度往往很高,幾萬維。如一些ctr預估問題中,特徵維度高達上億維,維度過高會增大模型計算複雜度。但實際情況是,並不是每個特徵對模型的**都是有效果的,所以需要去除一些不必要的特徵,從而降低模型計算的複雜度。
如果方差很小,說明該特徵的取值很穩定,可以近似理解成該特徵的每個值都接近。這樣的特徵對模型幾乎是沒有效果,不具備區分度的。比如年齡這個特徵,都是20歲左右大小的。反之,方差越大,則特徵對模型的區分度越好。
指移除方差低於指定閾值的特徵,即特徵值變動幅度小於某個範圍的特徵。這一部分特徵的區分度較差,可以移除。這裡的閾值需要根據具體的業務場景進行設定。
from sklearn.feature_selection import variancethreshold
x =[[0
,2,1
],[1
,1,0
],[2
,3,0
],[3
,6,1
],[4
,2,0
],[5
,1,1
]]print
(x)print
("---------------"
)sel = variancethreshold(threshold=1)
sel.fit_transform(x)
print
(sel.fit_transform(x)
)
基於單一變數和目標y之間的關係,通過計算某個能夠度量特徵重要性的指標,選出重要性topk的特徵。
該特徵選擇方式實現如下:
selectkbest(score_func=, k=10)
其中score_func是用來指定特徵重要性的計算公式,k是特徵保留維度。
下面是一些score_func函式及其解釋:
分類:chi2,f_classif,mutual_info_classif
回歸:f_regression,mutual_info_regression
缺點:忽略了特徵組合的情況。有的時候,單一特徵的表現可能不是很好,但是與其他特徵組合以後,效果就很不錯,這樣就會造成特徵被誤刪,所以這種特徵選擇方式不常用。
遞迴式消除特徵(rfe)是指,將全部特徵都丟到給定的模型裡面,模型會輸出每個特徵的重要性,然後刪除那些不太重要的特徵;把剩下的特徵再次丟到模型裡面,又會輸出各個特徵的重要性,再次刪除;如此迴圈,直至最後剩下目標維度的特徵值。
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"
)##5個特徵被選中,每次迭代去除1個特徵。
selector = rfe(estimator,
5, step=1)
selector = selector.fit(x, y)
print
(selector.support_)
##所選特徵的掩碼
##特徵排名,使得rank_ [i]對應於第i個特徵的排名位置。
##所選擇的(重要性最高的)特徵被分配為等級1,被刪除的特徵顯示其原始的位置。
selector.ranking_
缺點:
該方法每次都需要把特徵重新丟入模型進行計算,計算量較為複雜;
該方法需要模型輸出特徵重要性,所以需要選用可以輸出特徵重要性的模型,比如lr的coef_。
selectfrommodel可以用來處理任何帶有coef_或者feature_importances_ 屬性的訓練之後的模型。
如果相關的coef_ 或者 feature_importances 屬性值低於預先設定的閾值,這些特徵將會被認為不重要並且移除掉。除了指定數值上的閾值之外,還可以通過給定字串引數來使用內建的啟發式方法找到乙個合適的閾值。可以使用的啟發式方法有 mean 、 median 以及使用浮點數乘以這些(例如,0.1*mean )
selectfrommodel和遞迴式消除特徵不同的是,該方法不需要重複訓練模型,只需要訓練一次即可;二是該方法是指定權重的閾值,不是指定特徵的維度。
rfeselectfrommodel
訓練方式
重複訓練
一次訓練
方法超參
需保留特徵維度
重要度閾值
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
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
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
clf = extratreesclassifier(
)clf = clf.fit(x, y)
clf.feature_importances_
model = selectfrommodel(clf, prefit=
true
)x_new = model.transform(x)
x_new.shape
機器學習 特徵工程 特徵篩選
1 冗餘 部分特徵相關度太高,消耗計算效能,影響決策樹分支的選擇。2 雜訊 部分特徵是對 結果有負影響 3 降維 減少特徵數量 降維,使模型泛化能力更強,減少過擬合 4 特徵選擇與降維的關係 特徵選擇只篩選掉原本特徵裡和結果 關係不大的,後者做特徵的計算組合構成新特徵。svd pca降維也能解決一定...
特徵工程之特徵選擇
在前一篇文章中我介紹了一些資料預處理的方法,原始資料在經過預處理之後可以被演算法處理了,但是實際中可能有一些特徵是沒有必要的,比如在中國採集的一些資料,那麼國籍就都是中國,其實也就沒有意義了,反映在統計量上就是方差過小,也就是樣本在這個特徵上變化很小。還有一種情況是特徵和最後的結果相關性很小,也就是...
特徵工程之特徵選擇
特徵選擇其實就是減少屬性個數,為什麼要這麼做呢?直接使用原始資料來訓練模型的話,雖然說在訓練模型上的準確率會非常高,但是在測試樣本上的準確率將會大打折扣,也就是會產生過擬合的現象。所以說需要選擇出最適合的屬性進行訓練。特徵選擇的原因 2 雜訊 部分特徵對 結果又影響 進行特徵選擇的時候有兩種情況 一...