天天看點

特征選擇與特征了解 1 去掉取值變化小的特征 Removing features with low variance 2 單變量特征選擇 Univariate feature selection 3 線性模型和正則化 4 随機森林 5 兩種頂層特征選擇算法 6 一個完整的例子 總結 Tips

原文出處已經不知了,侵删!轉自csdn部落格:http://blog.csdn.net/ivysister/article/details/51482917 

寫的非常好,很實用!!!

特征選擇(排序)對于資料科學家、機器學習從業者來說非常重要。好的特征選擇能夠提升模型的性能,更能幫助我們了解資料的特點、底層結構,這對進一步改善模型、算法都有着重要作用。

特征選擇主要有兩個功能:

減少特征數量、降維,使模型泛化能力更強,減少過拟合

增強對特征和特征值之間的了解

拿到資料集,一個特征選擇方法,往往很難同時完成這兩個目的。通常情況下,我們經常不管三七二十一,選擇一種自己最熟悉或者最友善的特征選擇方法(往往目的是降維,而忽略了對特征和資料了解的目的)。

在許多機器學習相關的書裡,很難找到關于特征選擇的内容,因為特征選擇要解決的問題往往被視為機器學習的一種副作用,一般不會單獨拿出來讨論。

這應該是最簡單的特征選擇方法了:假設某特征的特征值隻有0和1,并且在所有輸入樣本中,95%的執行個體的該特征取值都是1,那就可以認為這個特征作用不大。如果100%都是1,那這個特征就沒意義了。當特征值都是離散型變量的時候這種方法才能用,如果是連續型變量,就需要将連續變量離散化之後才能用,而且實際當中,一般不太會有95%以上都取某個值的特征存在,是以這種方法雖然簡單但是不太好用。可以把它作為特征選擇的預處理,先去掉那些取值變化小的特征,然後再從接下來提到的的特征選擇方法中選擇合适的進行進一步的特征選擇。

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

這種方法比較簡單,易于運作,易于了解,通常對于了解資料有較好的效果(但對特征優化、提高泛化能力來說不一定有效);這種方法有許多改進的版本、變種。

皮爾森相關系數是一種最簡單的,能幫助了解特征和響應變量之間關系的方法,該方法衡量的是變量之間的線性相關性,結果的取值區間為[-1,1],-1表示完全的負相關(這個變量下降,那個就會上升),+1表示完全的正相關,0表示沒有線性相關。

Lower noise (0.71824836862138386, 7.3240173129992273e-49)

Higher noise (0.057964292079338148, 0.31700993885324746)

這個例子中,我們比較了變量在加入噪音之前和之後的差異。當噪音比較小的時候,相關性很強,p-value很低。

Pearson相關系數的一個明顯缺陷是,作為特征排序機制,他隻對線性關系敏感。如果關系是非線性的,即便兩個變量具有一一對應的關系,Pearson相關性也可能會接近0。

-0.00230804707612

<a href="http://dataunion.org/wp-content/uploads/2015/04/4dbuAXe.png" target="_blank"></a>

以上就是經典的互資訊公式了。想把互資訊直接用于特征選擇其實不是太友善:1、它不屬于度量方式,也沒有辦法歸一化,在不同資料及上的結果無法做比較;2、對于連續變量的計算不是很友善(X和Y都是集合,x,y都是離散的取值),通常變量需要先離散化,而互資訊的結果對離散化的方式很敏感。

反過頭來看y=x^2這個例子,MIC算出來的互資訊值為1(最大的取值)。

1.0

距離相關系數是為了克服Pearson相關系數的弱點而生的。在x和x^2這個例子中,即便Pearson相關系數是0,我們也不能斷定這兩個變量是獨立的(有可能是非線性相關);但如果距離相關系數是0,那麼我們就可以說這兩個變量是獨立的。

盡管有MIC和距離相關系數在了,但當變量之間的關系接近線性相關的時候,Pearson相關系數仍然是不可替代的。第一、Pearson相關系數計算速度快,這在處理大規模資料的時候很重要。第二、Pearson相關系數的取值區間是[-1,1],而MIC和距離相關系數都是[0,1]。這個特點使得Pearson相關系數能夠表征更豐富的關系,符号表示關系的正負,絕對值能夠表示強度。當然,Pearson相關性有效的前提是兩個變量的變化關系是單調的。

這種方法的思路是直接使用你要用的機器學習算法,針對每個單獨的特征和響應變量建立預測模型。其實Pearson相關系數等價于線性回歸裡的标準化回歸系數。假如某個特征和響應變量之間的關系是非線性的,可以用基于樹的方法(決策樹、随機森林)、或者擴充的線性模型等。基于樹的方法比較易于使用,因為他們對非線性關系的模組化比較好,并且不需要太多的調試。但要注意過拟合問題,是以樹的深度最好不要太大,再就是運用交叉驗證。

[(0.636, ‘LSTAT’), (0.59, ‘RM’), (0.472, ‘NOX’), (0.369, ‘INDUS’), (0.311, ‘PTRATIO’), (0.24, ‘TAX’), (0.24, ‘CRIM’), (0.185, ‘RAD’), (0.16, ‘ZN’), (0.087, ‘B’), (0.062, ‘DIS’), (0.036, ‘CHAS’), (0.027, ‘AGE’)]

單變量特征選擇方法獨立的衡量每個特征與響應變量之間的關系,另一種主流的特征選擇方法是基于機器學習模型的方法。有些機器學習方法本身就具有對特征進行打分的機制,或者很容易将其運用到特征選擇任務中,例如回歸模型,SVM,決策樹,随機森林等等。說句題外話,這種方法好像在一些地方叫做wrapper類型,大概意思是說,特征排序模型和機器學習模型是耦盒在一起的,對應的非wrapper類型的特征選擇方法叫做filter類型。

下面将介紹如何用回歸模型的系數來選擇特征。越是重要的特征在模型中對應的系數就會越大,而跟輸出變量越是無關的特征對應的系數就會越接近于0。在噪音不多的資料上,或者是資料量遠遠大于特征數的資料上,如果特征之間相對來說是比較獨立的,那麼即便是運用最簡單的線性回歸模型也一樣能取得非常好的效果。

Linear model: 0.984 * X0 + 1.995 * X1 + -0.041 * X2

在這個例子當中,盡管資料中存在一些噪音,但這種特征選擇模型仍然能夠很好的展現出資料的底層結構。當然這也是因為例子中的這個問題非常适合用線性模型來解:特征和響應變量之間全都是線性關系,并且特征之間均是獨立的。

在很多實際的資料當中,往往存在多個互相關聯的特征,這時候模型就會變得不穩定,資料中細微的變化就可能導緻模型的巨大變化(模型的變化本質上是系數,或者叫參數,可以了解成W),這會讓模型的預測變得困難,這種現象也稱為多重共線性。例如,假設我們有個資料集,它的真實模型應該是Y=X1+X2,當我們觀察的時候,發現Y’=X1+X2+e,e是噪音。如果X1和X2之間存線上性關系,例如X1約等于X2,這個時候由于噪音e的存在,我們學到的模型可能就不是Y=X1+X2了,有可能是Y=2X1,或者Y=-X1+3X2。

下邊這個例子當中,在同一個資料上加入了一些噪音,用随機森林算法進行特征選擇。

Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2

系數之和接近3,基本上和上上個例子的結果一緻,應該說學到的模型對于預測來說還是不錯的。但是,如果從系數的字面意思上去解釋特征的重要性的話,X3對于輸出變量來說具有很強的正面影響,而X1具有負面影響,而實際上所有特征與輸出變量之間的影響是均等的。

同樣的方法和套路可以用到類似的線性模型上,比如邏輯回歸。

正則化就是把額外的限制或者懲罰項加到已有模型(損失函數)上,以防止過拟合并提高泛化能力。損失函數由原來的E(X,Y)變為E(X,Y)+alpha||w||,w是模型系數組成的向量(有些地方也叫參數parameter,coefficients),||·||一般是L1或者L2範數,alpha是一個可調的參數,控制着正則化的強度。當用線上性模型上時,L1正則化和L2正則化也稱為Lasso和Ridge。

L1正則化将系數w的l1範數作為懲罰項加到損失函數上,由于正則項非零,這就迫使那些弱的特征所對應的系數變成0。是以L1正則化往往會使學到的模型很稀疏(系數w經常為0),這個特性使得L1正則化成為一種很好的特征選擇方法。

Scikit-learn為線性回歸提供了Lasso,為分類提供了L1邏輯回歸。

下面的例子在波士頓房價資料上運作了Lasso,其中參數alpha是通過grid search進行優化的。

Lasso model: -3.707 * LSTAT + 2.992 * RM + -1.757 * PTRATIO + -1.081 * DIS + -0.7 * NOX + 0.631 * B + 0.54 * CHAS + -0.236 * CRIM + 0.081 * ZN + -0.0 * INDUS + -0.0 * AGE + 0.0 * RAD + -0.0 * TAX

可以看到,很多特征的系數都是0。如果繼續增加alpha的值,得到的模型就會越來越稀疏,即越來越多的特征系數會變成0。

然而,L1正則化像非正則化線性模型一樣也是不穩定的,如果特征集合中具有相關聯的特征,當資料發生細微變化時也有可能導緻很大的模型差異。

L2正則化将系數向量的L2範數添加到了損失函數中。由于L2懲罰項中系數是二次方的,這使得L2和L1有着諸多差異,最明顯的一點就是,L2正則化會讓系數的取值變得平均。對于關聯特征,這意味着他們能夠獲得更相近的對應系數。還是以Y=X1+X2為例,假設X1和X2具有很強的關聯,如果用L1正則化,不論學到的模型是Y=X1+X2還是Y=2X1,懲罰都是一樣的,都是2alpha。但是對于L2來說,第一個模型的懲罰項是2alpha,但第二個模型的是4*alpha。可以看出,系數之和為常數時,各系數相等時懲罰是最小的,是以才有了L2會讓各個系數趨于相同的特點。

可以看出,L2正則化對于特征選擇來說一種穩定的模型,不像L1正則化那樣,系數會因為細微的資料變化而波動。是以L2正則化和L1正則化提供的價值是不同的,L2正則化對于特征了解來說更加有用:表示能力強的特征對應的系數是非零。

回過頭來看看3個互相關聯的特征的例子,分别以10個不同的種子随機初始化運作10次,來觀察L1和L2正則化的穩定性。

Random seed 0 Linear model: 0.728 * X0 + 2.309 * X1 + -0.082 * X2 Ridge model: 0.938 * X0 + 1.059 * X1 + 0.877 * X2

Random seed 1 Linear model: 1.152 * X0 + 2.366 * X1 + -0.599 * X2 Ridge model: 0.984 * X0 + 1.068 * X1 + 0.759 * X2

Random seed 2 Linear model: 0.697 * X0 + 0.322 * X1 + 2.086 * X2 Ridge model: 0.972 * X0 + 0.943 * X1 + 1.085 * X2

Random seed 3 Linear model: 0.287 * X0 + 1.254 * X1 + 1.491 * X2 Ridge model: 0.919 * X0 + 1.005 * X1 + 1.033 * X2

Random seed 4 Linear model: 0.187 * X0 + 0.772 * X1 + 2.189 * X2 Ridge model: 0.964 * X0 + 0.982 * X1 + 1.098 * X2

Random seed 5 Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2 Ridge model: 0.758 * X0 + 1.011 * X1 + 1.139 * X2

Random seed 6 Linear model: 1.199 * X0 + -0.031 * X1 + 1.915 * X2 Ridge model: 1.016 * X0 + 0.89 * X1 + 1.091 * X2

Random seed 7 Linear model: 1.474 * X0 + 1.762 * X1 + -0.151 * X2 Ridge model: 1.018 * X0 + 1.039 * X1 + 0.901 * X2

Random seed 8 Linear model: 0.084 * X0 + 1.88 * X1 + 1.107 * X2 Ridge model: 0.907 * X0 + 1.071 * X1 + 1.008 * X2

Random seed 9 Linear model: 0.714 * X0 + 0.776 * X1 + 1.364 * X2 Ridge model: 0.896 * X0 + 0.903 * X1 + 0.98 * X2

可以看出,不同的資料上線性回歸得到的模型(系數)相差甚遠,但對于L2正則化模型來說,結果中的系數非常的穩定,差别較小,都比較接近于1,能夠反映出資料的内在結構。

随機森林具有準确率高、魯棒性好、易于使用等優點,這使得它成為了目前最流行的機器學習算法之一。随機森林提供了兩種特征選擇的方法:mean decrease impurity和mean decrease accuracy。

下邊的例子是sklearn中基于随機森林的特征重要度度量方法:

Features sorted by their score: [(0.5298, ‘LSTAT’), (0.4116, ‘RM’), (0.0252, ‘DIS’), (0.0172, ‘CRIM’), (0.0065, ‘NOX’), (0.0035, ‘PTRATIO’), (0.0021, ‘TAX’), (0.0017, ‘AGE’), (0.0012, ‘B’), (0.0008, ‘INDUS’), (0.0004, ‘RAD’), (0.0001, ‘CHAS’), (0.0, ‘ZN’)]

Scores for X0, X1, X2: [0.278, 0.66, 0.062]

當計算特征重要性時,可以看到X1的重要度比X2的重要度要高出10倍,但實際上他們真正的重要度是一樣的。盡管資料量已經很大且沒有噪音,且用了20棵樹來做随機選擇,但這個問題還是會存在。

需要注意的一點是,關聯特征的打分存在不穩定的現象,這不僅僅是随機森林特有的,大多數基于模型的特征選擇方法都存在這個問題。

另一種常用的特征選擇方法就是直接度量每個特征對模型精确率的影響。主要思路是打亂每個特征的特征值順序,并且度量順序變動對模型的精确率的影響。很明顯,對于不重要的變量來說,打亂順序對模型的精确率影響不會太大,但是對于重要的變量來說,打亂順序就會降低模型的精确率。

這個方法sklearn中沒有直接提供,但是很容易實作,下面繼續在波士頓房價資料集上進行實作。

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’)]

在這個例子當中,LSTAT和RM這兩個特征對模型的性能有着很大的影響,打亂這兩個特征的特征值使得模型的性能下降了73%和57%。注意,盡管這些我們是在所有特征上進行了訓練得到了模型,然後才得到了每個特征的重要性測試,這并不意味着我們扔掉某個或者某些重要特征後模型的性能就一定會下降很多,因為即便某個特征删掉之後,其關聯特征一樣可以發揮作用,讓模型性能基本上不變。

之是以叫做頂層,是因為他們都是建立在基于模型的特征選擇方法基礎之上的,例如回歸和SVM,在不同的子集上建立模型,然後彙總最終确定特征得分。

穩定性選擇是一種基于二次抽樣和選擇算法相結合較新的方法,選擇算法可以是回歸、SVM或其他類似的方法。它的主要思想是在不同的資料子集和特征子集上運作特征選擇算法,不斷的重複,最終彙總特征選擇結果,比如可以統計某個特征被認為是重要特征的頻率(被選為重要特征的次數除以它所在的子集被測試的次數)。理想情況下,重要特征的得分會接近100%。稍微弱一點的特征得分會是非0的數,而最無用的特征得分将會接近于0。

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’)]

在上邊這個例子當中,最高的3個特征得分是1.0,這表示他們總會被選作有用的特征(當然,得分會收到正則化參數alpha的影響,但是sklearn的随機lasso能夠自動選擇最優的alpha)。接下來的幾個特征得分就開始下降,但是下降的不是特别急劇,這跟純lasso的方法和随機森林的結果不一樣。能夠看出穩定性選擇對于克服過拟合和對資料了解來說都是有幫助的:總的來說,好的特征不會因為有相似的特征、關聯特征而得分為0,這跟Lasso是不同的。對于特征選擇任務,在許多資料集和環境下,穩定性選擇往往是性能最好的方法之一。

遞歸特征消除的主要思想是反複的構模組化型(如SVM或者回歸模型)然後選出最好的(或者最差的)的特征(可以根據系數來選),把選出來的特征放到一遍,然後在剩餘的特征上重複這個過程,直到所有特征都周遊了。這個過程中特征被消除的次序就是特征的排序。是以,這是一種尋找最優特征子集的貪心算法。

RFE的穩定性很大程度上取決于在疊代的時候底層用哪種模型。例如,假如RFE采用的普通的回歸,沒有經過正則化的回歸是不穩定的,那麼RFE就是不穩定的;假如采用的是Ridge,而用Ridge正則化的回歸是穩定的,那麼RFE就是穩定的。

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’)]

<a href="http://dataunion.org/wp-content/uploads/2015/04/ERGNG8c.png" target="_blank"></a>

接下來将會在上述資料上運作所有的特征選擇方法,并且将每種方法給出的得分進行歸一化,讓取值都落在0-1之間。對于RFE來說,由于它給出的是順序而不是得分,我們将最好的5個的得分定為1,其他的特征的得分均勻的分布在0-1之間。

<a href="http://dataunion.org/wp-content/uploads/2015/04/5ybQKSP.png" target="_blank"></a>

從以上結果中可以找到一些有趣的發現:

特征之間存線上性關聯關系,每個特征都是獨立評價的,是以X1,…X4的得分和X11,…X14的得分非常接近,而噪音特征X5,…,X10正如預期的那樣和響應變量之間幾乎沒有關系。由于變量X3是二次的,是以X3和響應變量之間看不出有關系(除了MIC之外,其他方法都找不到關系)。這種方法能夠衡量出特征和響應變量之間的線性關系,但若想選出優質特征來提升模型的泛化能力,這種方法就不是特别給力了,因為所有的優質特征都不可避免的會被挑出來兩次。

Lasso能夠挑出一些優質特征,同時讓其他特征的系數趨于0。當如需要減少特征數的時候它很有用,但是對于資料了解來說不是很好用。(例如在結果表中,X11,X12,X13的得分都是0,好像他們跟輸出變量之間沒有很強的聯系,但實際上不是這樣的)

MIC對特征一視同仁,這一點上和關聯系數有點像,另外,它能夠找出X3和響應變量之間的非線性關系。

随機森林基于不純度的排序結果非常鮮明,在得分最高的幾個特征之後的特征,得分急劇的下降。從表中可以看到,得分第三的特征比第一的小4倍。而其他的特征選擇算法就沒有下降的這麼劇烈。

Ridge将回歸系數均勻的分攤到各個關聯變量上,從表中可以看出,X11,…,X14和X1,…,X4的得分非常接近。

穩定性選擇常常是一種既能夠有助于了解資料又能夠挑出優質特征的這種選擇,在結果表中就能很好的看出。像Lasso一樣,它能找到那些性能比較好的特征(X1,X2,X4,X5),同時,與這些特征關聯度很強的變量也得到了較高的得分。

對于了解資料、資料的結構、特點來說,單變量特征選擇是個非常好的選擇。盡管可以用它對特征進行排序來優化模型,但由于它不能發現備援(例如假如一個特征子集,其中的特征之間具有很強的關聯,那麼從中選擇最優的特征時就很難考慮到備援的問題)。

正則化的線性模型對于特征了解和特征選擇來說是非常強大的工具。L1正則化能夠生成稀疏的模型,對于選擇特征子集來說非常有用;相比起L1正則化,L2正則化的表現更加穩定,由于有用的特征往往對應系數非零,是以L2正則化對于資料的了解來說很合适。由于響應變量和特征之間往往是非線性關系,可以采用basis expansion的方式将特征轉換到一個更加合适的空間當中,在此基礎上再考慮運用簡單的線性模型。

随機森林是一種非常流行的特征選擇方法,它易于使用,一般不需要feature engineering、調參等繁瑣的步驟,并且很多工具包都提供了平均不純度下降方法。它的兩個主要問題,1是重要的特征有可能得分很低(關聯特征問題),2是這種方法對特征變量類别多的特征越有利(偏向問題)。盡管如此,這種方法仍然非常值得在你的應用中試一試。

特征選擇在很多機器學習和資料挖掘場景中都是非常有用的。在使用的時候要弄清楚自己的目标是什麼,然後找到哪種方法适用于自己的任務。當選擇最優特征以提升模型性能的時候,可以采用交叉驗證的方法來驗證某種方法是否比其他方法要好。當用特征選擇的方法來了解資料的時候要留心,特征選擇模型的穩定性非常重要,穩定性差的模型很容易就會導緻錯誤的結論。對資料進行二次采樣然後在子集上運作特征選擇算法能夠有所幫助,如果在各個子集上的結果是一緻的,那就可以說在這個資料集上得出來的結論是可信的,可以用這種特征選擇模型的結果來了解資料。