机器学习第18篇 - Boruta特征变量筛选(2)

前面(机器学习第17篇 - 特征变量筛选(1))评估显示Boruta在生物数据中具有较高的特征变量选择准确度,下面就具体看下如何应用Boruta进行特征变量选择。

Boruta算法概述

Boruta得名于斯拉夫神话中的树神,可以识别所有对分类或回归有显著贡献的变量。其核心思想是统计比较数据中真实存在的特征变量与随机加入的变量(也称为影子变量)的重要性。

  1. 初次建模时,把原始变量拷贝一份作为影子变量。

  2. 原始变量的值随机化后作为对应影子变量的值 (随机化就是打乱原始变量值的顺序)。

  3. 使用随机森林建模并计算每个变量的重要性得分。

  4. 对于每一个真实特征变量,统计检验其与所有影子变量的重要性最大值的差别。

    重要性显著高于影子变量的真实特征变量定义为重要

    重要性显著低于影子变量的真实特征变量定义为不重要

  5. 所有不重要的变量和影子变量移除。

    基于新变量构成的数据集再次重复刚才的建模和选择过程,直到所有变量都被分类为重要不重要,或达到预先设置的迭代次数。

其优点是:

  1. 同时适用于分类问题和回归问题

  2. 考虑多个变量的关系信息

  3. 改善了常用于变量选择的随机森林变量重要性计算方式

  4. 会输出所有与模型性能相关的变量而不是只返回一个最小变量集合

  5. 可以处理变量的互作

  6. 可以规避随机森林自身计算变量重要性的随机波动性问题和不能计算显著性的问题

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      6980
boruta$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类型的变量是否要为ConfirmedRejected

Tentative.boruta <- TentativeRoughFix(boruta)

机器学习系列教程

从随机森林开始,一步步理解决策树、随机森林、ROC/AUC、数据集、交叉验证的概念和实践。

文字能说清的用文字、图片能展示的用、描述不清的用公式、公式还不清楚的写个简单代码,一步步理清各个环节和概念。

再到成熟代码应用、模型调参、模型比较、模型评估,学习整个机器学习需要用到的知识和技能。

  1. 机器学习算法 - 随机森林之决策树初探(1)

  2. 机器学习算法-随机森林之决策树R 代码从头暴力实现(2)

  3. 机器学习算法-随机森林之决策树R 代码从头暴力实现(3)

  4. 机器学习算法-随机森林之理论概述

  5. 随机森林拖了这么久,终于到实战了。先分享很多套用于机器学习的多种癌症表达数据集 https://file.biolab.si/biolab/supp/bi-cancer/projections/。

  6. 机器学习算法-随机森林初探(1)

  7. 机器学习 模型评估指标 - ROC曲线和AUC值

  8. 机器学习 - 训练集、验证集、测试集

  9. 机器学习 - 随机森林手动10 折交叉验证

  10. 一个函数统一238个机器学习R包,这也太赞了吧

  11. 基于Caret和RandomForest包进行随机森林分析的一般步骤 (1)

  12. Caret模型训练和调参更多参数解读(2)

  13. 机器学习相关书籍分享

  14. 基于Caret进行随机森林随机调参的4种方式

  15. 送你一个在线机器学习网站,真香!

  16. UCI机器学习数据集

  17. 机器学习第17篇 - 特征变量筛选(1)

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
根据引用\[3\]所提到的,R语言中可以使用Boruta包进行机器学习特征筛选Boruta是一个基于随机森林的变量筛选方法。它通过对特征进行混洗和原特征的重要性比较来确定特征的重要性。如果原特征的重要性比混洗之后还差,那么这个特征被认为是"不重要"的。如果混洗之后,重要性总是比原来的特征要低,那么这个特征被认为是"重要"的。Boruta包已经非常成熟,可以在R语言中使用,并且实现起来非常快速。你可以参考Boruta包的官方文档来了解更多关于使用Boruta进行机器学习特征筛选的详细信息。 #### 引用[.reference_title] - *1* *2* [R语言基于Boruta进行机器学习特征筛选(Feature Selection)](https://blog.csdn.net/zhongkeyuanchongqing/article/details/119615346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [全自动机器学习:自动特征筛选(B)R语言自动特征工程实现](https://blog.csdn.net/weixin_29666489/article/details/111972845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信宝典

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值