機器學習第18篇 - Boruta特征變量篩選(2)
前面(機器學習第17篇 - 特征變量篩選(1))評估顯示Boruta在生物數(shù)據(jù)中具有較高的特征變量選擇準確度,下面就具體看下如何應用Boruta進行特征變量選擇。
Boruta算法概述
Boruta得名于斯拉夫神話中的樹神,可以識別所有對分類或回歸有顯著貢獻的變量。其核心思想是統(tǒng)計比較數(shù)據(jù)中真實存在的特征變量與隨機加入的變量(也稱為影子變量)的重要性。
初次建模時,把原始變量拷貝一份作為影子變量。
原始變量的值隨機化后作為對應影子變量的值 (隨機化就是打亂原始變量值的順序)。
使用隨機森林建模并計算每個變量的重要性得分。
對于每一個真實特征變量,統(tǒng)計檢驗其與所有影子變量的重要性最大值的差別。
重要性顯著高于影子變量的真實特征變量定義為重要。
重要性顯著低于影子變量的真實特征變量定義為不重要。
所有不重要的變量和影子變量移除。
基于新變量構(gòu)成的數(shù)據(jù)集再次重復剛才的建模和選擇過程,直到所有變量都被分類為重要或不重要,或達到預先設置的迭代次數(shù)。

其優(yōu)點是:
同時適用于分類問題和回歸問題
考慮多個變量的關系信息
改善了常用于變量選擇的隨機森林變量重要性計算方式
會輸出所有與模型性能相關的變量而不是只返回一個最小變量集合
可以處理變量的互作
可以規(guī)避隨機森林自身計算變量重要性的隨機波動性問題和不能計算顯著性的問題
Boruta算法實戰(zhàn)
# install.packages("Boruta")library(Boruta)set.seed(1)
boruta <- Boruta(x=train_data, y=train_data_group, pValue=0.01, mcAdj=T,
maxRuns=300)
boruta## Boruta performed 299 iterations in 1.452285 mins.
## 54 attributes confirmed important: AC002073_cds1_at, D13633_at,
## D31887_at, D55716_at, D78134_at and 49 more;
## 6980 attributes confirmed unimportant: A28102, AB000114_at,
## AB000115_at, AB000220_at, AB000381_s_at and 6975 more;
## 36 tentative attributes left: D31886_at, D43950_at, D79997_at,
## HG2279.HT2375_at, HG417.HT417_s_at and 31 more;速度還是可以的(尤其是跟后面要介紹的 RFE 的速度比起來)
boruta$timeTaken## Time difference of 1.452285 mins查看下變量重要性鑒定結(jié)果(實際上面的輸出中也已經(jīng)有體現(xiàn)了),54個重要的變量,36個可能重要的變量 (tentative variable, 重要性得分與最好的影子變量得分無統(tǒng)計差異),6,980個不重要的變量。
table(boruta$finalDecision)##
## Tentative Confirmed Rejected
## 36 54 6980boruta$finalDecision[boruta$finalDecision=="Confirmed"]## AC002073_cds1_at D13633_at D31887_at D55716_at
## Confirmed Confirmed Confirmed Confirmed
## D78134_at D82348_at D87119_at HG2874.HT3018_at
## Confirmed Confirmed Confirmed Confirmed
## HG4074.HT4344_at HG4258.HT4528_at J02645_at J03909_at
## Confirmed Confirmed Confirmed Confirmed
## K02268_at L17131_rna1_at L27071_at L42324_at
## Confirmed Confirmed Confirmed Confirmed
## M10901_at M57710_at M60830_at M63138_at
## Confirmed Confirmed Confirmed Confirmed
## M63835_at U14518_at U23143_at U28386_at
## Confirmed Confirmed Confirmed Confirmed
## U37352_at U38896_at U56102_at U59309_at
## Confirmed Confirmed Confirmed Confirmed
## U63743_at U68030_at X01060_at X02152_at
## Confirmed Confirmed Confirmed Confirmed
## X14850_at X16983_at X17620_at X56494_at
## Confirmed Confirmed Confirmed Confirmed
## X62078_at X67155_at X67951_at X69433_at
## Confirmed Confirmed Confirmed Confirmed
## Z11793_at Z21966_at Z35227_at Z96810_at
## Confirmed Confirmed Confirmed Confirmed
## U16307_at HG3928.HT4198_at V00594_s_at X03689_s_at
## Confirmed Confirmed Confirmed Confirmed
## M14328_s_at X91911_s_at X12530_s_at X81836_s_at
## Confirmed Confirmed Confirmed Confirmed
## HG1980.HT2023_at M94880_f_at
## Confirmed Confirmed
## Levels: Tentative Confirmed Rejected繪制Boruta算法運行過程中各個變量的重要性得分的變化 (綠色是重要的變量,紅色是不重要的變量,藍色是影子變量,黃色是Tentative變量)。
這個圖也可以用來查看是否有必要增加迭代的次數(shù)以便再次確認Tentative變量中是否有一部分為有意義的特征變量。從下圖來看,黃色變量部分隨著迭代還是有部分可能高于最高值,可以繼續(xù)嘗試增加迭代次數(shù)。
Boruta::plotImpHistory(boruta)
繪制鑒定出的變量的重要性。變量少了可以用默認繪圖,變量多時繪制的圖看不清,需要自己整理數(shù)據(jù)繪圖。
# ?plot.Boruta# plot(boruta)定義一個函數(shù)提取每個變量對應的重要性值。
library(dplyr)
boruta.imp <- function(x){
imp <- reshape2::melt(x$ImpHistory, na.rm=T)[,-1]
colnames(imp) <- c("Variable","Importance")
imp <- imp[is.finite(imp$Importance),]
variableGrp <- data.frame(Variable=names(x$finalDecision),
finalDecision=x$finalDecision)
showGrp <- data.frame(Variable=c("shadowMax", "shadowMean", "shadowMin"),
finalDecision=c("shadowMax", "shadowMean", "shadowMin"))
variableGrp <- rbind(variableGrp, showGrp)
boruta.variable.imp <- merge(imp, variableGrp, all.x=T)
sortedVariable <- boruta.variable.imp %>% group_by(Variable) %>%
summarise(median=median(Importance)) %>% arrange(median)
sortedVariable <- as.vector(sortedVariable$Variable)
boruta.variable.imp$Variable <- factor(boruta.variable.imp$Variable, levels=sortedVariable)
invisible(boruta.variable.imp)
}boruta.variable.imp <- boruta.imp(boruta)
head(boruta.variable.imp)## Variable Importance finalDecision
## 1 A28102 0 Rejected
## 2 A28102 0 Rejected
## 3 A28102 0 Rejected
## 4 A28102 0 Rejected
## 5 A28102 0 Rejected
## 6 A28102 0 Rejected只繪制Confirmed變量。
library(YSX)
sp_boxplot(boruta.variable.imp, melted=T, xvariable = "Variable", yvariable = "Importance",
legend_variable = "finalDecision", legend_variable_order = c("shadowMax", "shadowMean", "shadowMin", "Confirmed"),
xtics_angle = 90)
提取重要的變量 (可能重要的變量可提取可不提取)
boruta.finalVars <- data.frame(Item=getSelectedAttributes(boruta, withTentative = F), Type="Boruta")也可以使用TentativeRoughFix函數(shù)進一步計算。這一步的計算比較粗糙,根據(jù)重要性的值高低判斷Tentative類型的變量是否要為Confirmed或Rejected。
Tentative.boruta <- TentativeRoughFix(boruta)機器學習系列教程
從隨機森林開始,一步步理解決策樹、隨機森林、ROC/AUC、數(shù)據(jù)集、交叉驗證的概念和實踐。
文字能說清的用文字、圖片能展示的用、描述不清的用公式、公式還不清楚的寫個簡單代碼,一步步理清各個環(huán)節(jié)和概念。
再到成熟代碼應用、模型調(diào)參、模型比較、模型評估,學習整個機器學習需要用到的知識和技能。
