前面( 机器学习第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)

前面(机器学习第17篇 - 特征变量筛选(1))评估显示Boruta在生物数据中具有较高的特征变量选择准确度,下面就具体看下如何应用Boruta进行特征变量选择。Boruta算法概述Bor...
This article describes a R package Boruta, implementing a novel feature selection algorithm for nding all relevant variables. The algorithm is designed as a wrapper around a Random Forest classication algorithm. It iteratively removes the features which are proved by a statistical test to be less relevant than random probes. The Boruta package provides a convenient interface to the algorithm. The short description of the algorithm and examples of its application are presented. 本文介绍了一个R包Boruta,实现了一种寻找所有相关变量的新特征选择算法。 该算法被设计为包装器随机森林分类算法。 它迭代地删除了那些通过统计检验证明与随机探针不太相关特征Boruta包为算法提供了方便的接口。本文是对 算法的简短描述并介绍了其应用实例。
洛杉矶臭氧污染数据的 Boruta 算法 通过在 randomForest 上实现的 Boruta 算法从所有 11 个特征中选择了 8 个。 执行 366 个观察的数据需要 2.14 秒。 您可以在此处找到相关文章: :
一、基本介绍 Boruta 算法是一种特征筛选方法,其核心是基于两个思想:shadow features和binomial distribution。 该算法可以自动在数据集上执行特征选择。作为 R 的一个包而诞生。目前 Python 的 Boruta 版本是 BorutaPy。 二、基本原理 2.1 算法原理 2.1.1 算法步骤 创建阴影特征 (shadow feature) 。从X开始,对每个真实特征R,随机打乱顺序,这些被打乱顺序的原始特征称为阴影特征(shadow features)。此时,阴
#安装相关包 install.packages(&amp;amp;amp;quot;Boruta&amp;amp;amp;quot;) library(&amp;amp;amp;quot;Boruta&amp;amp;amp;quot;) #利用R语言的内部数据 install.pack
gini重要性,每次在变量m上进行节点分割时,两个后代节点的基尼杂质标准小于父节点。 对于森林中所有树木的每个单独变量,加上基尼系数会产生快速变量的重要性,这通常与排列重要性度量非常一致。 对比三种方法:gini、Permutation、boruta,得出对重要性筛选的最好方法。Permuation Importance特征选择在精确度、召回率和f1分数方面提供了最佳模型。
过滤法变量选择是一种与模型无关的变量选择方法,先进行变量选择得到入模变量,再进行模型训练。 方差变量筛选(from sklearn.feature_selection import VarianceThreshold) 删除所有低方差特征特征选择器。 VarianceThreshold(SelectorMixin) 参数:SelectorMixin:训练集方差低于此阈值的要素将被删除。 默认设置是保留所有具有非零方差的特征,即删除所有样
Feature Selection with the Boruta Package的中文翻译全文 Feature Selection with the Boruta Package的中文翻译全文 Feature Selection with the Boruta Package的中文翻译全文 利用boruta算法进行特征选择,详细的例子和算法的解释
Boruta R包的Python实现。 此实现尝试模仿scikit-learn接口,因此请使用fit,transform或fit_transform来运行功能选择。 有关更多信息,请参见这些功能的文档以及下面的示例。 原始代码和方法,作者:Miron B. Kursa, ://notabug.org/mbq/Boruta/wiki/FAQ Boruta是所有相关的特征选择方
博鲁塔沙普 BorutaShap是一种包装器特征选择方法,它结合了Boruta特征选择算法和Shapley值。 事实证明,这种组合在速度和生成的特征子集的质量上都无法执行原始的排列重要性方法。 该算法不仅提供了更好的特征子集,而且还可以同时提供最准确和一致的全局特征等级,也可用于模型推断。 与原始R包(将用户限制为随机森林模型)不同,BorutaShap允许用户在特征选择过程中选择任何基于树的学习器作为基础模型。 尽管BorutaShap的运行时性能有所提高,但是SHAP TreeExplainer随观察次数线性增长,这使得它在处理大型数据集时非常麻烦。 为了解决这个问题,BorutaShap包含了一个采样过程,该过程使用算法每次迭代时可用数据的最小可能子采样。 它通过比较样本的隔离林产生的分布和使用ks-test的数据来找到该样本。 从实验来看,此过程可以将运行时间减少多达80%,同时
2020-05-14 15:55:49.560 16983-16983/? E/AndroidRuntime: FATAL EXCEPTION: main Process: chat.yee.android, PID: 16983 java.lang.RuntimeException: Unable to instantiate application chat.yee.android.base.CCApplication: java.lang.ClassNotFoundException:...
对于大数据的分析,特征选择Feature Selection和降维是必不可少的,R有很多做FS的包,这里我直接转载引用两英文博文,很详细的讲了Boruta和caret包的使用方法和注意问题,也分析了两种包的优缺点。我不在翻译。 如下代码很好用哈: 变量选择是模型构建的一个重要方面,每个分析人员都必须学习。毕竟,它有助于排除相关变量、偏见和不必要噪音的限制来建立预测模型。 许多分析新手认为,保持所有(或更多)的变量就能产生最佳的模型,因为你不会丢失任何信息。可悲的是,他们错了! 从模型中删除一个变量,增加了模型的