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