3. 特徵選擇實現
3.3 線性模型與正則化
3.4 隨機森林選擇
3.5 頂層特徵選擇
4. 總結
優點:執行速度快,是一種非常流行的特徵選擇方法。
缺點:無法提供反饋,特徵選擇的標準/規範的制定是在特徵搜尋演算法中完成,學習演算法無法向特徵搜尋演算法傳遞對特徵的需求。另外,可能處理某個特徵時由於任意原因表示該特徵不重要,但是該特徵與其他特徵結合起來則可能變得很重要。
不太好用
from sklearn.feature_selection import variancethreshold
variancethreshold(threshold=
0.1)
最大資訊係數
from sklearn.model_selection import cross_val_score, shufflesplit
from sklearn.datasets import load_boston
from sklearn.ensemble import randomforestregressor
#load boston housing dataset as an example
boston = load_boston(
)x = boston[
"data"
]y = boston[
"target"
]names = boston[
"feature_names"
]# 樹的個數 n_estimators = 20
rf = randomforestregressor(n_estimators=
20, max_depth=4)
scores =
# 使用每個特徵單獨訓練模型,並獲取每個模型的評分來作為特徵選擇的依據。
# cross_val_score(estimator,x,y,打分方式,cv 幾折)
# shufflesplit(n_splits 劃分次數 test_size 比例)
for i in
range
(x.shape[1]
):score = cross_val_score(rf, x[
:, i:i+1]
, y, scoring=
"r2"
, cv=shufflesplit(n_splits=
3,test_size=
0.3))(
round
(np.mean(score),3
),names[i]))
print
(sorted
(scores, reverse=
true))
輸出:[
(0.659
,'lstat'),
(0.544
,'rm'),
(0.473
,'indus'),
(0.407
,'nox'),
(0.319
,'ptratio'),
(0.258
,'tax'),
(0.221
,'crim'),
(0.19
,'rad'),
(0.145
,'zn'),
(0.136
,'dis'),
(0.101
,'age'),
(0.084
,'b'),
(-0.002
,'chas'
)]
from sklearn.model_selection import shufflesplit
from sklearn.metrics import r2_score
from sklearn.ensemble import randomforestregressor
from collections import defaultdict
from sklearn.datasets import load_boston
boston = load_boston(
)x = boston.data
y = boston.target
featurenames = boston.feature_names
'''r2_score r2=1-(真實值和**值的平方差)/(真實值和均值的平方差)
# '''rf = randomforestregressor(
)scores = defaultdict(
list
)for train_idx,test_idx in shufflesplit(
len(x)
,n_splits=
3,test_size=
0.3)
.split(x)
: x_train,x_test = x[train_idx]
,x[test_idx]
y_train,y_test = y[train_idx]
,y[test_idx]
rf.fit(x_train,y_train)
acc = r2_score(y_test,rf.predict(x_test)
)for i in
range
(x.shape[1]
):x_t = x_test.copy(
) np.random.shuffle(x_t[
:,i]
) shuff_acc = r2_score(y_test,rf.predict(x_t)
) scores[featurenames[i]
](acc-shuff_acc)
/acc)
print
("feature sorted by scores"
)print
(sorted([
(round
(np.mean(score),4
),feat)
for feat,score in scores.items()]
,reverse=
true))
'''feature sorted by scores
[(0.6932, 'lstat'), (0.543, 'rm'), (0.0797, 'dis'), (0.0362, 'crim'),
(0.0353, 'nox'), (0.0197, 'ptratio'), (0.0134, 'tax'), (0.0085, 'age'),
(0.0047, 'b'), (0.0041, 'indus'), (0.0024, 'rad'), (0.0002, 'chas'),
(0.0001, 'zn')]
'''
from sklearn.datasets import load_boston
from sklearn.feature_selection import rfe
from sklearn.linear_model import linearregression
boston = load_boston(
)x = boston.data
y = boston.target
featurenames = boston.feature_names
lr = linearregression(
)rfe = rfe(lr, n_features_to_select=3)
rfe.fit(x,y)
print
("features sorted by their rank:"
)print
(sorted
(zip
(map
(lambda x:
round
(x,4
), rfe.ranking_)
,featurenames)))
'''features sorted by their rank:
[(1, 'chas'), (1, 'nox'), (1, 'rm'), (2, 'ptratio'), (3, 'dis'),
(4, 'lstat'), (5, 'rad'), (6, 'crim'), (7, 'indus'), (8, 'zn'),
(9, 'tax'), (10, 'b'), (11, 'age')]
'''
資料預處理後,先排除取值變化很小的特徵。如果機器資源充足,並且希望盡量保留所有資訊,可以把閾值設定得比較高,或者只過濾離散型特徵只有乙個取值的特徵。
如果資料量過大,計算資源不足(記憶體不足以使用所有資料進行訓練、計算速度過慢),可以使用單特徵選擇法排除部分特徵。這些被排除的特徵並不一定完全被排除不再使用,在後續的特徵構造時也可以作為原始特徵使用。
如果此時特徵量依然非常大,或者是如果特徵比較稀疏時,可以使用pca主成分分析和lda線性判別等方法進行特徵降維。
經過樣本取樣和特徵預篩選後,訓練樣本可以用於訓練模型。但是可能由於特徵數量比較大而導致訓練速度慢,或者想進一步篩選有效特徵或排除無效特徵(或噪音),我們可以使用正則化線性模型選擇法、隨機森林選擇法或者頂層特徵選擇法進一步進行特徵篩選。
特徵工程 之 特徵篩選
從現有的m個特徵中選出n個特徵 n m 降低特徵維度減少計算量的同時,使模型效果達到最優。在實際業務中,用於模型中的特徵維度往往很高,幾萬維。如一些ctr預估問題中,特徵維度高達上億維,維度過高會增大模型計算複雜度。但實際情況是,並不是每個特徵對模型的 都是有效果的,所以需要去除一些不必要的特徵,從...
機器學習 特徵工程 特徵篩選
1 冗餘 部分特徵相關度太高,消耗計算效能,影響決策樹分支的選擇。2 雜訊 部分特徵是對 結果有負影響 3 降維 減少特徵數量 降維,使模型泛化能力更強,減少過擬合 4 特徵選擇與降維的關係 特徵選擇只篩選掉原本特徵裡和結果 關係不大的,後者做特徵的計算組合構成新特徵。svd pca降維也能解決一定...
特徵篩選的原理與實現
特徵工程又包含了feature selection 特徵選擇 feature extraction 特徵提取 和feature construction 特徵構造 等子問題,本章內容主要討論特徵選擇相關的方法及實現。在實際專案中,我們可能會有大量的特徵可使用,有的特徵攜帶的資訊豐富,有的特徵攜帶的資...