预测分析:R语言实现2.6 特征选择
2.6 特征選擇
我們的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略有增加。
總結
以上是生活随笔為你收集整理的预测分析:R语言实现2.6 特征选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《动手玩转Arduino》——2.4 展
- 下一篇: 《编写高质量代码:改善c程序代码的125