前面(
机器学习第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 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
类型的变量是否要为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)
前面(机器学习第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;quot;Boruta&amp;amp;quot;)
library(&amp;amp;quot;Boruta&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包的使用方法和注意问题,也分析了两种包的优缺点。我不在翻译。
如下代码很好用哈:
变量选择是模型构建的一个重要方面,每个分析人员都必须学习。毕竟,它有助于排除相关变量、偏见和不必要噪音的限制来建立预测模型。
许多分析新手认为,保持所有(或更多)的变量就能产生最佳的模型,因为你不会丢失任何信息。可悲的是,他们错了!
从模型中删除一个变量,增加了模型的