机器学习第18篇 - Boruta特征变量筛选(2)
前面(機(jī)器學(xué)習(xí)第17篇 - 特征變量篩選(1))評估顯示Boruta在生物數(shù)據(jù)中具有較高的特征變量選擇準(zhǔn)確度,下面就具體看下如何應(yīng)用Boruta進(jìn)行特征變量選擇。
Boruta算法概述
Boruta得名于斯拉夫神話中的樹神,可以識別所有對分類或回歸有顯著貢獻(xiàn)的變量。其核心思想是統(tǒng)計比較數(shù)據(jù)中真實存在的特征變量與隨機(jī)加入的變量(也稱為影子變量)的重要性。
初次建模時,把原始變量拷貝一份作為影子變量。
原始變量的值隨機(jī)化后作為對應(yīng)影子變量的值 (隨機(jī)化就是打亂原始變量值的順序)。
使用隨機(jī)森林建模并計算每個變量的重要性得分。
對于每一個真實特征變量,統(tǒng)計檢驗其與所有影子變量的重要性最大值的差別。
重要性顯著高于影子變量的真實特征變量定義為重要。
重要性顯著低于影子變量的真實特征變量定義為不重要。
所有不重要的變量和影子變量移除。
基于新變量構(gòu)成的數(shù)據(jù)集再次重復(fù)剛才的建模和選擇過程,直到所有變量都被分類為重要或不重要,或達(dá)到預(yù)先設(shè)置的迭代次數(shù)。
其優(yōu)點是:
同時適用于分類問題和回歸問題
考慮多個變量的關(guān)系信息
改善了常用于變量選擇的隨機(jī)森林變量重要性計算方式
會輸出所有與模型性能相關(guān)的變量而不是只返回一個最小變量集合
可以處理變量的互作
可以規(guī)避隨機(jī)森林自身計算變量重要性的隨機(jī)波動性問題和不能計算顯著性的問題
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算法運(yùn)行過程中各個變量的重要性得分的變化 (綠色是重要的變量,紅色是不重要的變量,藍(lán)色是影子變量,黃色是Tentative變量)。
這個圖也可以用來查看是否有必要增加迭代的次數(shù)以便再次確認(rèn)Tentative變量中是否有一部分為有意義的特征變量。從下圖來看,黃色變量部分隨著迭代還是有部分可能高于最高值,可以繼續(xù)嘗試增加迭代次數(shù)。
Boruta::plotImpHistory(boruta)繪制鑒定出的變量的重要性。變量少了可以用默認(rèn)繪圖,變量多時繪制的圖看不清,需要自己整理數(shù)據(jù)繪圖。
# ?plot.Boruta# plot(boruta)定義一個函數(shù)提取每個變量對應(yīng)的重要性值。
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ìn)一步計算。這一步的計算比較粗糙,根據(jù)重要性的值高低判斷Tentative類型的變量是否要為Confirmed或Rejected。
Tentative.boruta <- TentativeRoughFix(boruta)機(jī)器學(xué)習(xí)系列教程
從隨機(jī)森林開始,一步步理解決策樹、隨機(jī)森林、ROC/AUC、數(shù)據(jù)集、交叉驗證的概念和實踐。
文字能說清的用文字、圖片能展示的用、描述不清的用公式、公式還不清楚的寫個簡單代碼,一步步理清各個環(huán)節(jié)和概念。
再到成熟代碼應(yīng)用、模型調(diào)參、模型比較、模型評估,學(xué)習(xí)整個機(jī)器學(xué)習(xí)需要用到的知識和技能。
機(jī)器學(xué)習(xí)算法 - 隨機(jī)森林之決策樹初探(1)
機(jī)器學(xué)習(xí)算法-隨機(jī)森林之決策樹R 代碼從頭暴力實現(xiàn)(2)
機(jī)器學(xué)習(xí)算法-隨機(jī)森林之決策樹R 代碼從頭暴力實現(xiàn)(3)
機(jī)器學(xué)習(xí)算法-隨機(jī)森林之理論概述
隨機(jī)森林拖了這么久,終于到實戰(zhàn)了。先分享很多套用于機(jī)器學(xué)習(xí)的多種癌癥表達(dá)數(shù)據(jù)集 https://file.biolab.si/biolab/supp/bi-cancer/projections/。
機(jī)器學(xué)習(xí)算法-隨機(jī)森林初探(1)
機(jī)器學(xué)習(xí) 模型評估指標(biāo) - ROC曲線和AUC值
機(jī)器學(xué)習(xí) - 訓(xùn)練集、驗證集、測試集
機(jī)器學(xué)習(xí) - 隨機(jī)森林手動10 折交叉驗證
一個函數(shù)統(tǒng)一238個機(jī)器學(xué)習(xí)R包,這也太贊了吧
基于Caret和RandomForest包進(jìn)行隨機(jī)森林分析的一般步驟 (1)
Caret模型訓(xùn)練和調(diào)參更多參數(shù)解讀(2)
機(jī)器學(xué)習(xí)相關(guān)書籍分享
基于Caret進(jìn)行隨機(jī)森林隨機(jī)調(diào)參的4種方式
送你一個在線機(jī)器學(xué)習(xí)網(wǎng)站,真香!
UCI機(jī)器學(xué)習(xí)數(shù)據(jù)集
機(jī)器學(xué)習(xí)第17篇 - 特征變量篩選(1)
總結(jié)
以上是生活随笔為你收集整理的机器学习第18篇 - Boruta特征变量筛选(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的数据也可以-三篇NAR的数据库
- 下一篇: 快速学习R语言的经验分享