機器學習中的特徵篩選:Boruta

Yueh-Lin Tsai
Mar 15, 2021

--

原始論文

Python Implementation

在監督式學習的領域中,除了得到一個準確的模型之外,更多實際上的問題是「如何能夠知道資料中的那些變項/特徵對預測是重要的」或是「如何能過濾掉那些沒有幫助的特徵」?最常見的莫過於是根據機器學習演算法對於特徵的使用程度或是依賴程度作估計(e.g. sklearn套件中各類模型的feature_importances屬性),另外也可以使用forward/backward elimination的方式移除特徵去觀察對評估指標的影響作為特徵的重要程度。在這邊將會介紹另外一種名為Boruta的特徵篩選方法,與上述作法得到每個特徵的重要程度數值不同,使用Boruta後,每個特徵將會被歸類成幾類(重要、無法確定、不重要),而不重要的特徵即代表可被刪除。這個方法在2010年就被提出(並在R語言上被實踐),雖然距離此方法被提出已經經過一段時間,身邊也比較少人有聽說,然而這個概念個人認為蠻有趣也對實務有些幫助,因此在這邊介紹給大家了解。

從置換檢定開始說起

從Boruta論文中可以明顯感受到作者是從生物統計的觀點作切入,在統計學上其中一個最重要的觀念就是假設檢定了,也就是「根據手中取得的資料,判斷在某個特定假設成立的狀況下觀察到這樣資料的可能性有多高」。例如先前AI生成高解析度人臉照片的技術幾乎能夠以假亂真,為了檢驗「AI產生的照片跟真的一樣」這個說法是不是成立的,我們可以利用假設檢定的概念,收集一些AI生成的假人臉與真實的人臉照片,並且讓一些人來判斷每一張照片是真的還是假的,假設AI產生的照片與實際照片真的非常類似,那大家猜對的正確率應該會在50%左右,但若是大家猜對的正確率"顯著"高於50%,那就代表AI產生的照片與實際照片非常類似的可能性非常小,我們就可以判斷說唉唷現在AI產生的人臉還不足以騙過我們。

但正確率51%算不算高於50%?50.5%呢?甚至50.000001%算不算高於50%?這個判斷標準會隨著我們手中觀察到的資料數量而有不同,但直覺而言可以想像如果我們手上只有少少的資料(例如我只找了10個人判斷),那計算出來的正確率需要高於50%比較多(e.g. 70%)我們才比較有信心說人真的不會被騙,但如果我們手上收集了很多的資料(例如我請了200個人幫我做判斷),那正確率也許高於50%一些些(e.g. 57%)我就有相同的信心程度了。(若有興趣了解更完整的假設檢定概念仍然歡迎大家去參考相關的書籍或資源)

而假設檢定中一個很常使用的無母數方法是置換檢定(Permutation test),也就是以不斷隨機打亂數值的方式去得到在虛無假設成立的狀況下資料的分布狀況(抽樣分布),進而判斷手上的真實資料狀況發生的可能性是否過低,如果過低就代表虛無假設應該是不成立的。同樣舉個例子,現在我們手上有10個男生與10個女生共20筆身高資料。

圖一:收集到的身高資料(男女各10筆) Icons made by Freepik from www.flaticon.com

如果我們想利用置換的方式檢驗「男生與女生的身高平均數是否相同」,我們可以先將這20個身高隨機打亂分給10位男生與10位女生,再計算在此狀況下男生與女生身高平均的差異(這次可能身高差異為-2.8公分)。

圖二:隨機置換身高並計算男女平均身高的差異

重複進行超級多次這樣的動作,得到的許多數字就代表「假設男生與女生身高平均數相同的狀況下,因為抽樣造成的誤差可能的分布範圍」。

圖三:依照重複隨機打亂資料後計算男女平均差異的結果決定判斷標準

如果手上真實的10男10女身高平均相減距離隨機打亂後抽樣的分布範圍很遠的話,那我們就會判斷這樣的資料很難從男生與女生身高相同的情境下觀察的到,進而得到「男生與女生身高平均數不相同」的結論。

回到機器學習的領域,最一開始我們提到目前很常使用特徵重要程度作為客觀指標做特徵挑選,然而即使是完全與y無關的雜訊也可能在特徵重要程度上有些微的數值(根據模型而有所不同),因此如何找到一個合適的切分點區分無用與可能有用的特徵就是一件需要注意的事情。而Boruta方法結合了置換檢定與特徵重要程度的概念,可以針對各個特徵重要程度檢定是否顯著大於隨機產生的特徵。

以隨機森林(Random Forest)作為基底

事實上Boruta大致上的概念到此已經結束了,亦即「打亂特徵數值(以產生與預測變項完全無關的特徵)後訓練模型,並且記錄打亂過後的特徵對於模型的重要程度,多次進行以上步驟後得到隨機特徵重要程度的分布,再依此判斷真實特徵是隨機特徵的可能性」,無論是使用何種機器學習模型都可以用這樣的方式做判斷。然而作者在提出此演算法時特別提出了以隨機森林作為計算特徵重要程度的基底模型,隨機森林透過平行建立多棵決策樹、並且在訓練每棵決策樹時以取後放回的方式抽樣資料令每一棵決策樹有一定程度的變異,提高了模型對抗資料中雜訊的能力,這樣平行建立決策樹的方法恰巧與置換檢定中需要重複多次的性質不謀而合。

另外在模擬無關特徵的效果時,Boruta並非直接將原本特徵作置換處理,而是複製一份特徵後再將其打亂(因此若原本資料有p個特徵,在每次建模時則會有2*p個特徵,其中p個為原始特徵、另外p個為打亂過後的特徵)。

圖四:Boruto演算法步驟示意,在模型訓練前將會複製一份原始特徵,進行打亂後再併回資料中

在訓練完模型並且得到每個特徵(包含打亂後的p個特徵)的特徵重要性後,Boruta會針對每個特徵進行假設檢定:

虛無假設(H0):特徵重要程度與隨機特徵重要程度的最大值無顯著差異

對立假設(H1):特徵重要程度顯著大於或小於隨機特徵重要程度的最大值

實際上在執行時,會執行多次的迭代,並且累加計算每個特徵的重要程度大於隨機特徵重要程度的次數,再依二項式分布進行檢定(在虛無假設下,第N次迭代時,期望次數E(N) = 0.5*N,S = (0.25*N)^0.5)。每次檢定中顯著高於/低於隨機特徵重要程度的特徵將被歸類為重要/不重要,並且從特徵中剔除,再進行下一次的迭代,直到迭代次數高於最高迭代次數或是所有特徵皆被刪除後停止。最後未被歸類的特徵則會被分為無法判定的類別。

總結

在常見的特徵挑選方法中,多數是針對特徵得到重要程度數值後再進行人工判斷,然而Boruta演算法結合了統計檢定的方式使得我們有一個客觀的基準能夠判斷哪些特徵是重要/不重要的,與Boruta相似的是Permutation Importance,同樣利用置換的方式得到改為隨機變項後模型的效果並與原始效果進行相減,然而此方式仍然需要人為設定閾值作為挑選特徵的基準。

雖機器學習與統計關係非常密切,但在個人經驗上進行機器學習時實際使用到推論統計的場合其實並沒有非常多,當初看到Boruta這個特徵挑選的方法時確實是眼睛為之一亮,透過直觀的方式評估特徵是否可能與目標變項無關,因此在此也分享給大家認識。

Boruta演算法實踐

在Python中也支援Boruta演算法,可以使用pip或conda進行安裝,除了原始Boruta演算法的部分外,boruta_py也相容於sklearn,並且不僅限於隨機森林,可使用不同的機器學習模型進行特徵重要程度的判斷。另外在檢定時也可設定顯著高於n-percentile的隨機特徵重要程度,而不需要被限制在最大值上。若熟悉skearn套件的話在boruta_py的使用上應無太大問題。

--

--