<b>2.6 特征選擇</b>
我們的cpu模型隻有6個特征。通常,我們遇到實際環境的資料集會具有來自多種不同觀測資料的非常大量的特征。另外,我們會在不太确定哪些特征在影響輸出變量方面比較重要的情況下,不得不采用大量的特征。除此之外,我們還有會遇到可能要分很多水準的分類變量,對它們我們隻能建立大量的新訓示變量,正如在第1章裡所看到的那樣。當面對的場景涉及大量特征時,我們經常會發現輸出隻依賴于它們的一個子集。給定k個輸入特征,可以形成2k個不同的子集,是以即使對于中等數量的特征,子集的空間也會大到無法通過逐個子集的拟合來進行完整的探索。
要了解為什麼可能的特征子集會有2k個,一種簡單的方式是這樣的:我們可以給每個子集配置設定一個獨立的識别碼,這個識别碼是k位的二進制數字構成的字元串,如果我們選擇在該子集中包含第i個特征(特征可以任意排序),那麼第i個位上的數字就是1。例如,如果我們有三個特征,字元串101就對應了隻包括第一個和第三個特征的子集。在這種方式下,我們建構了所有可能的二進制字元串,它從由k個0構成的字元串一直排到由k個1構成的字元串,是以我們就得到了從0到2k-1的所有整數,也就是總計2k個子集。
特征選擇(feature selection)指在模型中選擇一個特征子集以構成一個帶有更少特征的新模型的過程。它會去除我們認為和輸出變量無關的特征,因而産生一個更易于訓練和解釋的更簡單模型。有很多方法被設計用來進行這項任務,它們一般不會用窮舉的方式去搜遍可能的子集空間,而是在該空間進行引導式搜尋(guided search)。
這類方法之一是前向選擇(forward selection),它是通過一系列步驟進行特征選擇的逐漸回歸(stepwise regression)的一個範例。對于前向選擇,它的思路是從一個沒有選擇特征的空模型起步,接着進行k次(針對每個特征進行一次)簡單線性回歸并從中選取最好的一個。這裡比較的是有相同特征數量的模型,是以可以使用r2統計量來指導我們的選擇,雖然我們也可以使用aic之類的衡量名額。一旦選擇了要加入的第一個特征,我們就可以從餘下的k-1個特征中選取要加入的另一個特征。是以,現在我們可以針對每個可能的特征配對進行k-1次多元回歸,配對中的其中一個特征是在第一步選擇的那個特征。我們可以繼續按這種方式增加特征,直到我們評價了包含所有特征的模型并結束這個過程。注意,在每一個步驟裡,我們都為所有後續的步驟作出了把哪個特征包含進來的艱難選擇。例如,在多于一個特征的模型當中,沒有包含我們在第一步選擇的那個特征的那些模型就永遠不需要考慮了。是以,我們并不是窮舉式地搜尋我們的空間。實際上,如果考慮到我們還評估了空模型,我們就可以計算進行了線性回歸的模型總數為:
這個計算結果的數量級是在k2的量級上,即使對于比較小的k值而言,也已經明顯比2k小多了。在前向選擇過程的最後階段,我們必須從對應每個步驟結束時得到的子集所構成的k+1個模型中進行選擇。由于過程的這個最終部分要比較帶有不同數量特征的模型,我們通常會使用諸如aic的準則或調整後的r2來作出模型的最終選擇。對于cpu資料集,可以通過運作下列指令來示範這個過程:
step()函數實作了前向選擇的過程。我們首先給它提供了通過在訓練資料上拟合無特征的線性模型而得到的空模型。對于scope參數,我們指定的是要求算法從空模型開始一直逐漸處理到包含所有6個特征的完整模型。在r語言裡發出這條指令會産生一個輸出,它會顯示疊代每一步指定了哪個特征子集。為了節省空間,我們在下表呈現這個結果以及每個模型的aic值。注意,aic值越小,模型就越好。
步驟 子集裡含有的特征 aic值
0 { } 1839.13
1 {mmax} 1583.38
2 {mmax, cach} 1547.21
3 {mmax, cach, mmin} 1522.06
4 {mmax, cach, mmin, chmax} 1484.14
5 {mmax, cach, mmin, chmax, myct} 1478.36
step()函數對前向選擇采用了一種替代性的規格,它會在任何一個剩餘的特征加入目前特征子集都無法改善總體評分的情況下終止。對于資料集而言,隻有一個特征會從最終模型中排除,因為把它加入進來并沒有提高總體評分。既有趣又令人放心的是,這個被排除的特征就是chmin,它也是唯一具有相對較高p值的變量,說明在有其他特征存在的情況下我們無法确信輸出變量和這個特征是相關的。
有人可能會想知道是否可以從相反方向進行變量選擇,也就是從一個完整的模型開始,根據去除哪個特征會給模型評分帶來最大的改善來逐個去除特征。這樣實際上是可以的,這樣的過程被稱為後向選擇(backward selection)或後向淘汰(backward elimination)。在r語言裡的做法是利用step()函數,指定direction參數為backward并從完整模型開始。可以用二手車資料集來示範這個過程,并把結果儲存到一個新的二手車模型裡:
在二手車資料集上得到的最終線性回歸模型的公式如下:
正如我們所見,最終的模型丢棄了cruise、sound和chevy特征。觀察我們之前的模型摘要,我們可以看到,這三個特征都具有較高的p值。前面的兩種方法是一種貪心算法(greedy algorithm)的示例。這也就是說,一旦作出了是否包含某個變量的選擇,它就是最終決定,之後也不能撤銷了。為了對它進行彌補,就有了第三種變量選擇的方法,它稱為混合選擇(mixed selection)或雙向淘汰(bidirectional elimination),它一開始會表現為前向選擇方法,采用的是增加變量的前向步驟,但是在能夠改善aic的情況下也可以包含後向的步驟。不出所料,step()函數在direction參數被指定為both時就是這樣做的。
既然有了兩個新模型,我們就可以觀察它們在測試集上的表現:
對于cpu模型,我們在測試資料集上的表現比初始模型略有改善。合适的下一步的工作可以是探索這個縮減後的特征集是否和去除離群值配合起來效果更好,這個問題留給讀者作為練習。相比之下,對于二手車模型,作為去除所有這些特征的結果,我們看到測試mse略有增加。