lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2
4.2 平均精確率減少 Mean decrease accuracy
另一種常用的特征選擇方法就是直接度量每個(gè)特征對(duì)模型精確率的影響。主要思路是打亂每個(gè)特征的特征值順序,并且度量順序變動(dòng)對(duì)模型的精確率的影響。很明顯,對(duì)于不重要的變量來(lái)說(shuō),打亂順序?qū)δP偷木_率影響不會(huì)太大,但是對(duì)于重要的變量來(lái)說(shuō),打亂順序就會(huì)降低模型的精確率。
這個(gè)方法sklearn中沒有直接提供,但是很容易實(shí)現(xiàn),下面繼續(xù)在波士頓房?jī)r(jià)數(shù)據(jù)集上進(jìn)行實(shí)現(xiàn)。
fromsklearn.cross_validationimportShuffleSplit
fromsklearn.metricsimportr2_score
fromcollectionsimportdefaultdict
X?=?boston["data"]
Y?=?boston["target"]
rf?=?RandomForestRegressor()
scores?=?defaultdict(list)
#crossvalidate?the?scores?on?a?number?of?different?random?splits?of?the?data
fortrain_idx,?test_idxinShuffleSplit(len(X),100,?.3):
X_train,?X_test?=?X[train_idx],?X[test_idx]
Y_train,?Y_test?=?Y[train_idx],?Y[test_idx]
r?=?rf.fit(X_train,?Y_train)
acc?=?r2_score(Y_test,?rf.predict(X_test))
foriinrange(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[names[i]].append((acc-shuff_acc)/acc)
print("Features?sorted?by?their?score:")
print(sorted([(round(np.mean(score),4),?feat)for
feat,?score?inscores.items()],?reverse=True))
Features sorted by their score: [(0.7276, ‘LSTAT’), (0.5675, ‘RM’),
(0.0867, ‘DIS’), (0.0407, ‘NOX’), (0.0351, ‘CRIM’), (0.0233,
‘PTRATIO’), (0.0168, ‘TAX’), (0.0122, ‘AGE’), (0.005, ‘B’),
(0.0048, ‘INDUS’), (0.0043, ‘RAD’), (0.0004, ‘ZN’), (0.0001,
‘CHAS’)]
在這個(gè)例子當(dāng)中,LSTAT和RM這兩個(gè)特征對(duì)模型的性能有著很大的影響,打亂這兩個(gè)特征的特征值使得模型的性能下降了73%和57%。注意,盡管這些我們是在所有特征上進(jìn)行了訓(xùn)練得到了模型,然后才得到了每個(gè)特征的重要性測(cè)試,這并不意味著我們?nèi)拥裟硞€(gè)或者某些重要特征后模型的性能就一定會(huì)下降很多,因?yàn)榧幢隳硞€(gè)特征刪掉之后,其關(guān)聯(lián)特征一樣可以發(fā)揮作用,讓模型性能基本上不變。
5 兩種頂層特征選擇算法
之所以叫做頂層,是因?yàn)樗麄兌际墙⒃诨谀P偷奶卣鬟x擇方法基礎(chǔ)之上的,例如回歸和SVM,在不同的子集上建立模型,然后匯總最終確定特征得分。
5.1 穩(wěn)定性選擇 Stability selection
穩(wěn)定性選擇是一種基于二次抽樣和選擇算法相結(jié)合較新的方法,選擇算法可以是回歸、SVM或其他類似的方法。它的主要思想是在不同的數(shù)據(jù)子集和特征子集上運(yùn)行特征選擇算法,不斷的重復(fù),最終匯總特征選擇結(jié)果,比如可以統(tǒng)計(jì)某個(gè)特征被認(rèn)為是重要特征的頻率(被選為重要特征的次數(shù)除以它所在的子集被測(cè)試的次數(shù))。理想情況下,重要特征的得分會(huì)接近100%。稍微弱一點(diǎn)的特征得分會(huì)是非0的數(shù),而最無(wú)用的特征得分將會(huì)接近于0。
sklearn在隨機(jī)lasso和隨機(jī)邏輯回歸中有對(duì)穩(wěn)定性選擇的實(shí)現(xiàn)。
fromsklearn.linear_modelimportRandomizedLasso
fromsklearn.datasetsimportload_boston
boston?=?load_boston()
#using?the?Boston?housing?data.
#Data?gets?scaled?automatically?by?sklearn's?implementation
X?=?boston["data"]
Y?=?boston["target"]
names?=?boston["feature_names"]
rlasso?=?RandomizedLasso(alpha=0.025)
rlasso.fit(X,?Y)
print("Features?sorted?by?their?score:")
print(sorted(zip(map(lambdax:?round(x,4),?rlasso.scores_),
names),?reverse=True))
Features sorted by their score: [(1.0, ‘RM’), (1.0, ‘PTRATIO’),
(1.0, ‘LSTAT’), (0.62, ‘CHAS’), (0.595, ‘B’), (0.39, ‘TAX’),
(0.385, ‘CRIM’), (0.25, ‘DIS’), (0.22, ‘NOX’), (0.125, ‘INDUS’),
(0.045, ‘ZN’), (0.02, ‘RAD’), (0.015, ‘AGE’)]
在上邊這個(gè)例子當(dāng)中,最高的3個(gè)特征得分是1.0,這表示他們總會(huì)被選作有用的特征(當(dāng)然,得分會(huì)收到正則化參數(shù)alpha的影響,但是sklearn的隨機(jī)lasso能夠自動(dòng)選擇最優(yōu)的alpha)。接下來(lái)的幾個(gè)特征得分就開始下降,但是下降的不是特別急劇,這跟純lasso的方法和隨機(jī)森林的結(jié)果不一樣。能夠看出穩(wěn)定性選擇對(duì)于克服過(guò)擬合和對(duì)數(shù)據(jù)理解來(lái)說(shuō)都是有幫助的:總的來(lái)說(shuō),好的特征不會(huì)因?yàn)橛邢嗨频奶卣?、關(guān)聯(lián)特征而得分為0,這跟Lasso是不同的。對(duì)于特征選擇任務(wù),在許多數(shù)據(jù)集和環(huán)境下,穩(wěn)定性選擇往往是性能最好的方法之一。
5.2 遞歸特征消除 Recursive feature elimination (RFE)
遞歸特征消除的主要思想是反復(fù)的構(gòu)建模型(如SVM或者回歸模型)然后選出最好的(或者最差的)的特征(可以根據(jù)系數(shù)來(lái)選),把選出來(lái)的特征放到一遍,然后在剩余的特征上重復(fù)這個(gè)過(guò)程,直到所有特征都遍歷了。這個(gè)過(guò)程中特征被消除的次序就是特征的排序。因此,這是一種尋找最優(yōu)特征子集的貪心算法。
RFE的穩(wěn)定性很大程度上取決于在迭代的時(shí)候底層用哪種模型。例如,假如RFE采用的普通的回歸,沒有經(jīng)過(guò)正則化的回歸是不穩(wěn)定的,那么RFE就是不穩(wěn)定的;假如采用的是Ridge,而用Ridge正則化的回歸是穩(wěn)定的,那么RFE就是穩(wěn)定的。
Sklearn提供了RFE包,可以用于特征消除,還提供了RFECV,可以通過(guò)交叉驗(yàn)證來(lái)對(duì)的特征進(jìn)行排序。
fromsklearn.feature_selectionimportRFE
fromsklearn.linear_modelimportLinearRegression
boston?=?load_boston()
X?=?boston["data"]
Y?=?boston["target"]
names?=?boston["feature_names"]
#use?linear?regression?as?the?model
lr?=?LinearRegression()
#rank?all?features,?i.e?continue?the?elimination?until?the?last?one
rfe?=?RFE(lr,?n_features_to_select=1)
rfe.fit(X,Y)
print("Features?sorted?by?their?rank:")
print(sorted(zip(map(lambdax:?round(x,4),?rfe.ranking_),?names)))
Features sorted by their rank: [(1.0, ‘NOX’), (2.0, ‘RM’), (3.0,
‘CHAS’), (4.0, ‘PTRATIO’), (5.0, ‘DIS’), (6.0, ‘LSTAT’), (7.0,
‘RAD’), (8.0, ‘CRIM’), (9.0, ‘INDUS’), (10.0, ‘ZN’), (11.0, ‘TAX’),
(12.0, ‘B’), (13.0, ‘AGE’)]
6 一個(gè)完整的例子
下面將本文所有提到的方法進(jìn)行實(shí)驗(yàn)對(duì)比,數(shù)據(jù)集采用Friedman #1 回歸數(shù)據(jù)(這篇論文中的數(shù)據(jù))。數(shù)據(jù)是用這個(gè)公式產(chǎn)生的:
X1到X5是由單變量分布生成的,e是標(biāo)準(zhǔn)正態(tài)變量N(0,1)。另外,原始的數(shù)據(jù)集中含有5個(gè)噪音變量
X5,…,X10,跟響應(yīng)變量是獨(dú)立的。我們?cè)黾恿?個(gè)額外的變量X11,…X14,分別是X1,…,X4的關(guān)聯(lián)變量,通過(guò)f(x)=x+N(0,0.01)生成,這將產(chǎn)生大于0.999的關(guān)聯(lián)系數(shù)。這樣生成的數(shù)據(jù)能夠體現(xiàn)出不同的特征排序方法應(yīng)對(duì)關(guān)聯(lián)特征時(shí)的表現(xiàn)。
接下來(lái)將會(huì)在上述數(shù)據(jù)上運(yùn)行所有的特征選擇方法,并且將每種方法給出的得分進(jìn)行歸一化,讓取值都落在0-1之間。對(duì)于RFE來(lái)說(shuō),由于它給出的是順序而不是得分,我們將最好的5個(gè)的得分定為1,其他的特征的得分均勻的分布在0-1之間。
fromsklearn.datasetsimportload_boston
fromsklearn.linear_modelimport(LinearRegression,?Ridge,
Lasso,?RandomizedLasso)
fromsklearn.feature_selectionimportRFE,?f_regression
fromsklearn.preprocessingimportMinMaxScaler
fromsklearn.ensembleimportRandomForestRegressor
importnumpy?as?np
fromminepyimportMINE
np.random.seed(0)
size?=?750
X?=?np.random.uniform(0,1,?(size,14))
#"Friedamn?#1”?regression?problem
Y?=?(10*?np.sin(np.pi*X[:,0]*X[:,1])?+20*(X[:,2]?-?.5)**2+
10*X[:,3]?+5*X[:,4]?+?np.random.normal(0,1))
#Add?3?additional?correlated?variables?(correlated?with?X1-X3)
X[:,10:]?=?X[:,:4]?+?np.random.normal(0,?.025,?(size,4))
names?=?["x%s"%?iforiinrange(1,15)]
ranks?=?{}
defrank_to_dict(ranks,?names,?order=1):
minmax?=?MinMaxScaler()
ranks?=?minmax.fit_transform(order*np.array([ranks]).T).T[0]
ranks?=?map(lambdax:?round(x,2),?ranks)
returndict(zip(names,?ranks?))
lr?=?LinearRegression(normalize=True)
lr.fit(X,?Y)
ranks["Linear?reg"]?=?rank_to_dict(np.abs(lr.coef_),?names)
ridge?=?Ridge(alpha=7)
ridge.fit(X,?Y)
ranks["Ridge"]?=?rank_to_dict(np.abs(ridge.coef_),?names)
lasso?=?Lasso(alpha=.05)
lasso.fit(X,?Y)
ranks["Lasso"]?=?rank_to_dict(np.abs(lasso.coef_),?names)
rlasso?=?RandomizedLasso(alpha=0.04)
rlasso.fit(X,?Y)
ranks["Stability"]?=?rank_to_dict(np.abs(rlasso.scores_),?names)
#stop?the?search?when?5?features?are?left?(they?will?get?equal?scores)
rfe?=?RFE(lr,?n_features_to_select=5)
rfe.fit(X,Y)
ranks["RFE"]?=?rank_to_dict(map(float,?rfe.ranking_),?names,?order=-1)
rf?=?RandomForestRegressor()
rf.fit(X,Y)
ranks["RF"]?=?rank_to_dict(rf.feature_importances_,?names)
f,?pval?=?f_regression(X,?Y,?center=True)
ranks["Corr."]?=?rank_to_dict(f,?names)
mine?=?MINE()
mic_scores?=?[]
foriinrange(X.shape[1]):
mine.compute_score(X[:,i],?Y)
m?=?mine.mic()
mic_scores.append(m)
ranks["MIC"]?=?rank_to_dict(mic_scores,?names)
r?=?{}
fornameinnames:
r[name]?=?round(np.mean([ranks[method][name]
formethodinranks.keys()]),2)
methods?=?sorted(ranks.keys())
ranks["Mean"]?=?r
methods.append("Mean")
print("\t%s"%"\t".join(methods))
fornameinnames:
print("%s\t%s"%?(name,"\t".join(map(str,
[ranks[method][name]?formethodinmethods]))))
從以上結(jié)果中可以找到一些有趣的發(fā)現(xiàn):
特征之間存在線性關(guān)聯(lián)關(guān)系,每個(gè)特征都是獨(dú)立評(píng)價(jià)的,因此X1,…X4的得分和X11,…X14的得分非常接近,而噪音特征X5,…,X10正如預(yù)期的那樣和響應(yīng)變量之間幾乎沒有關(guān)系。由于變量X3是二次的,因此X3和響應(yīng)變量之間看不出有關(guān)系(除了MIC之外,其他方法都找不到關(guān)系)。這種方法能夠衡量出特征和響應(yīng)變量之間的線性關(guān)系,但若想選出優(yōu)質(zhì)特征來(lái)提升模型的泛化能力,這種方法就不是特別給力了,因?yàn)樗械膬?yōu)質(zhì)特征都不可避免的會(huì)被挑出來(lái)兩次。
Lasso能夠挑出一些優(yōu)質(zhì)特征,同時(shí)讓其他特征的系數(shù)趨于0。當(dāng)如需要減少特征數(shù)的時(shí)候它很有用,但是對(duì)于數(shù)據(jù)理解來(lái)說(shuō)不是很好用。(例如在結(jié)果表中,X11,X12,X13的得分都是0,好像他們跟輸出變量之間沒有很強(qiáng)的聯(lián)系,但實(shí)際上不是這樣的)
MIC對(duì)特征一視同仁,這一點(diǎn)上和關(guān)聯(lián)系數(shù)有點(diǎn)像,另外,它能夠找出X3和響應(yīng)變量之間的非線性關(guān)系。
隨機(jī)森林基于不純度的排序結(jié)果非常鮮明,在得分最高的幾個(gè)特征之后的特征,得分急劇的下降。從表中可以看到,得分第三的特征比第一的小4倍。而其他的特征選擇算法就沒有下降的這么劇烈。
Ridge將回歸系數(shù)均勻的分?jǐn)偟礁鱾€(gè)關(guān)聯(lián)變量上,從表中可以看出,X11,…,X14和X1,…,X4的得分非常接近。
穩(wěn)定性選擇常常是一種既能夠有助于理解數(shù)據(jù)又能夠挑出優(yōu)質(zhì)特征的這種選擇,在結(jié)果表中就能很好的看出。像Lasso一樣,它能找到那些性能比較好的特征(X1,X2,X4,X5),同時(shí),與這些特征關(guān)聯(lián)度很強(qiáng)的變量也得到了較高的得分。
總結(jié)
對(duì)于理解數(shù)據(jù)、數(shù)據(jù)的結(jié)構(gòu)、特點(diǎn)來(lái)說(shuō),單變量特征選擇是個(gè)非常好的選擇。盡管可以用它對(duì)特征進(jìn)行排序來(lái)優(yōu)化模型,但由于它不能發(fā)現(xiàn)冗余(例如假如一個(gè)特征子集,其中的特征之間具有很強(qiáng)的關(guān)聯(lián),那么從中選擇最優(yōu)的特征時(shí)就很難考慮到冗余的問(wèn)題)。
正則化的線性模型對(duì)于特征理解和特征選擇來(lái)說(shuō)是非常強(qiáng)大的工具。L1正則化能夠生成稀疏的模型,對(duì)于選擇特征子集來(lái)說(shuō)非常有用;相比起L1正則化,L2正則化的表現(xiàn)更加穩(wěn)定,由于有用的特征往往對(duì)應(yīng)系數(shù)非零,因此L2正則化對(duì)于數(shù)據(jù)的理解來(lái)說(shuō)很合適。由于響應(yīng)變量和特征之間往往是非線性關(guān)系,可以采用basis
expansion的方式將特征轉(zhuǎn)換到一個(gè)更加合適的空間當(dāng)中,在此基礎(chǔ)上再考慮運(yùn)用簡(jiǎn)單的線性模型。
隨機(jī)森林是一種非常流行的特征選擇方法,它易于使用,一般不需要feature
engineering、調(diào)參等繁瑣的步驟,并且很多工具包都提供了平均不純度下降方法。它的兩個(gè)主要問(wèn)題,1是重要的特征有可能得分很低(關(guān)聯(lián)特征問(wèn)題),2是這種方法對(duì)特征變量類別多的特征越有利(偏向問(wèn)題)。盡管如此,這種方法仍然非常值得在你的應(yīng)用中試一試。
特征選擇在很多機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘場(chǎng)景中都是非常有用的。在使用的時(shí)候要弄清楚自己的目標(biāo)是什么,然后找到哪種方法適用于自己的任務(wù)。當(dāng)選擇最優(yōu)特征以提升模型性能的時(shí)候,可以采用交叉驗(yàn)證的方法來(lái)驗(yàn)證某種方法是否比其他方法要好。當(dāng)用特征選擇的方法來(lái)理解數(shù)據(jù)的時(shí)候要留心,特征選擇模型的穩(wěn)定性非常重要,穩(wěn)定性差的模型很容易就會(huì)導(dǎo)致錯(cuò)誤的結(jié)論。對(duì)數(shù)據(jù)進(jìn)行二次采樣然后在子集上運(yùn)行特征選擇算法能夠有所幫助,如果在各個(gè)子集上的結(jié)果是一致的,那就可以說(shuō)在這個(gè)數(shù)據(jù)集上得出來(lái)的結(jié)論是可信的,可以用這種特征選擇模型的結(jié)果來(lái)理解數(shù)據(jù)。
Tips
什么是卡方檢驗(yàn)?用方差來(lái)衡量某個(gè)觀測(cè)頻率和理論頻率之間差異性的方法
什么是皮爾森卡方檢驗(yàn)?這是一種最常用的卡方檢驗(yàn)方法,它有兩個(gè)用途:1是計(jì)算某個(gè)變量對(duì)某種分布的擬合程度,2是根據(jù)兩個(gè)觀測(cè)變量的Contingency
table來(lái)計(jì)算這兩個(gè)變量是否是獨(dú)立的。主要有三個(gè)步驟:第一步用方差和的方式來(lái)計(jì)算觀測(cè)頻率和理論頻率之間卡方值;第二步算出卡方檢驗(yàn)的自由度(行數(shù)-1乘以列數(shù)-1);第三步比較卡方值和對(duì)應(yīng)自由度的卡方分布,判斷顯著性。
什么是p-value?簡(jiǎn)單地說(shuō),p-value就是為了驗(yàn)證假設(shè)和實(shí)際之間一致性的統(tǒng)計(jì)學(xué)意義的值,即假設(shè)檢驗(yàn)。有些地方叫右尾概率,根據(jù)卡方值和自由度可以算出一個(gè)固定的p-value,
什么是響應(yīng)變量(response
value)?簡(jiǎn)單地說(shuō),模型的輸入叫做explanatroy variables,模型的輸出叫做response
variables,其實(shí)就是要驗(yàn)證該特征對(duì)結(jié)果造成了什么樣的影響
什么是零假設(shè)(null
hypothesis)?在相關(guān)性檢驗(yàn)中,一般會(huì)取“兩者之間無(wú)關(guān)聯(lián)”作為零假設(shè),而在獨(dú)立性檢驗(yàn)中,一般會(huì)取“兩者之間是獨(dú)立”作為零假設(shè)。與零假設(shè)相對(duì)的是備擇假設(shè)(對(duì)立假設(shè)),即希望證明是正確的另一種可能。
That’s it
References
http://blog.datadive.net/selecting-good-features-part-i-univariate-selection/
http://blog.datadive.net/selecting-good-features-part-ii-linear-models-and-regularization/
http://scikit-learn.org/stable/modules/feature_selection.html#univariate-feature-selection
http://www.quora.com/What-are-some-feature-selection-methods
http://www.quora.com/What-are-some-feature-selection-algorithms
http://www.quora.com/What-are-some-feature-selection-methods-for-SVMs
http://www.quora.com/What-is-the-difference-between-principal-component-analysis-PCA-and-feature-selection-in-machine-learning-Is-PCA-a-means-of-feature-selection
總結(jié)
以上是生活随笔為你收集整理的lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java对象引用出错_“Java有值传递
- 下一篇: 使用python获取焦点窗口的进程名称