利用R语言的Boruta包进行特征选择
摘要:变量选择是模型构建的一个重要方面,每个分析师都必须学习。 毕竟,它有助于消除相关变量,偏差和不必要的噪声的限制,以构建预测模型。
介绍
变量选择是模型构建的一个重要方面,每个分析师都必须学习。 毕竟,它有助于消除相关变量,偏差和不必要的噪声的限制,以构建预测模型。
许多分析新手认为,保留所有(或更多)变量会产生最佳模型,因为您不会丢失任何信息。 可悲的是,他们错了!
从模型中删除变量可提高模型的准确性。 你有多少次遇到过这种事情?
至少,我遇到过很多次。 经常发现这些变量是相关的,并且可能妨碍实现更高的模型精度。 今天,我们将学习如何摆脱R中的这些变量。我必须强调的是,R有一个令人难以置信的公式库。 在所有包中,我们进行变量选择的包是Boruta包。
在本文中,我们将重点介绍Boruta软件包的理论和使用。 我将使用逐步的方法来帮助您更好地理解它。
此外,我还将Boruta与其他传统的特征选择算法进行了比较。 通过这种比较,您对特征的理解可以达到一个新的重要水平,这可以为构建强大的预测模型奠定基础。 术语“功能”,“变量”和“属性”多次使用,请勿混淆!
什么是boruta算法? 为什么这么奇怪?
Boruta是一种特征选择算法。 确切地说,它是围绕随机森林的包装算法。 这个包裹的名字来自斯拉夫神话中生活在松树林中的恶魔。
我们知道特征选择是预测模型中的关键步骤。 在构建包含多个变量的数据集的模型时,此步骤尤为重要。
当您有兴趣了解变量相关的价值时,而不是仅限于构建具有良好预测黑盒的预测模型,毫无疑问,使用boruta算法处理这些数据集是最佳选择。
它是如何工作的?
以下是运行boruta算法的步骤:
1.首先,它通过创建混合副本的所有特征(即阴影特征)为给定数据集添加随机性。
2.然后,它训练随机森林分类的扩展数据集并使用特征重要性度量(默认设置为平均减少精度)来评估每个特征的重要性,意义越高越重要。
3.在每次迭代中,它检查真实特征是否比最佳阴影特征更重要(即特征分数是否高于最大阴影特征),并且连续删除它被认为是非常不重要的。 特征。
4.最后,算法在确认或拒绝所有要素时停止,或者当算法达到随机林操作的指定限制时停止。
是什么让它与传统的特征选择算法不同?
Boruta遵循所有相关的特征选择方法,捕获与结果变量相关的所有特征。 相比之下,大多数传统的特征选择算法遵循最小化的优化方法,该方法依赖于在选择类别时产生最小误差的一小部分特征。
将随机森林模型拟合到数据集时,您可以递归处理在每次迭代期间性能不佳的特征。 该方法最小化随机森林模型的误差,其最终将形成最小化的最优特征子集。 这是通过选择输入数据集的过薄版本来实现的,而输入数据集又会丢失一些相关功能。
另一方面,Boruta发现所有特征,无论它们是否与决策变量相关。 这使其成为生物医学领域的理想选择,并且一些人将有兴趣知道哪些人类基因(特征)与某种程度的特定医学状况(目标变量)相关联。
Boruta在R(实践)中的应用
在这一点上,我们已经理解了Boruta包的理论知识。 但这还不够。 真正的挑战现在才刚刚开始。 让我们学习在R中使用这个包。
首先,让我们安装并调用此包。
> install.packages("Boruta") > library(Boruta)
现在让我们加载数据集。 我在本教程中设置的数据来自Practice Problem Loan Prediction
我们来看看数据。
> setwd("../Data/Loan_Prediction") > traindata <- read.csv("train.csv", header = T, stringsAsFactors = F)
让我们检查一下这个数据集是否缺少值。
> summary(traindata)
我们发现许多变量都缺少值。 处理缺失值的优先级对于实现boruta包非常重要。 此外,数据集还具有空白值。 我们来清理这个数据集吧。
现在我们将用NA替换所有空白。 这将帮助我立即处理所有的NA。
> traindata[traindata == “”] <- NA
在这里,我将使用最简单的方法来处理缺失值,即列删除。 可以在此处找到用于缺失值插值的更高级方法和包。
> traindata <- traindata[complete.cases(traindata),]
让我们将分类变量转换为因子数据类型。
> convert <- c(2:6, 11:13) > traindata[,convert] <- data.frame(apply(traindata[convert], 2, as.factor))
现在有必要实施和检查Boruta包的性能。 Boruta语法类似于回归(LM)方法。
> set.seed(123) > boruta.train <- Boruta(Loan_Status~.-Loan_ID, data = traindata, doTrace = 2) > print(boruta.train)
Boruta performed 99 iterations in 18.80749 secs.
5 attributes confirmed important: ApplicantIncome, CoapplicantIncome,
CreditHistory, LoanAmount, LoanAmountTerm.
4 attributes confirmed unimportant: Dependents, Education, Gender, SelfEmployed.
2 tentative attributes left: Married, PropertyArea.
Boruta为变量数据集的含义提供了明确的命令。 在这种情况下,11个属性中的4个被拒绝,5个被确认,2个属性被指定为暂定。 暂定属性的重要性非常接近最佳阴影属性,因此Boruta无法对随机林运行的默认数量产生强烈的信心。
现在,我们使用图表来显示Boruta变量的重要性。
默认情况下,由于空间不足,Boruta的绘图功能会将属性值添加到水平X轴,这会导致所有属性值无法显示。 在这里,我将属性添加到直立的X轴。
> plot(boruta.train, xlab = "", xaxt = "n") > lz<-lapply(1:ncol(boruta.train$ImpHistory),function(i) boruta.train$ImpHistory[is.finite(boruta.train$ImpHistory[,i]),i]) > names(lz) <- colnames(boruta.train$ImpHistory) > Labels <- sort(sapply(lz,median)) > axis(side = 1,las=2,labels = names(Labels), at = 1:ncol(boruta.train$ImpHistory), cex.axis = 0.7)
蓝框图对应于阴影属性的最小,平均和最大Z分数。 红色,黄色和绿色框图分别代表拒绝,暂定和确认属性的Z分数。
现在让我们判断一下实验性质。 通过将属性的Z得分中值与最佳阴影属性的Z得分中值进行比较,将实验属性分类为已确认或拒绝。 开始吧。
> final.boruta <- TentativeRoughFix(boruta.train) > print(final.boruta)
oruta performed 99 iterations in 18.399 secs.
Tentatives roughfixed over the last 99 iterations.
6 attributes confirmed important: ApplicantIncome, CoapplicantIncome,
CreditHistory, LoanAmount, LoanAmountTerm and 1 more.
5 attributes confirmed unimportant: Dependents, Education, Gender, PropertyArea,
SelfEmployed
初步分类属性后的Boruta结果图
现在我们必须得到结果。 让我们得到确认属性的列表。
> getSelectedAttributes(final.boruta, withTentative = F)
[1] "Married" "ApplicantIncome" "CoapplicantIncome" "LoanAmount"
[5] "LoanAmountTerm" "CreditHistory"
我们将创建一个来自Boruta最终结果的数据框架。
> boruta.df <- attStats(final.boruta) > class(boruta.df)
[1] "data.frame"
> print(boruta.df)
meanImp medianImp minImp maxImp normHits decision
Gender 1.04104738 0.9181620 -1.9472672 3.767040 0.01010101 Rejected
Married 2.76873080 2.7843600 -1.5971215 6.685000 0.56565657 Confirmed
Dependents 1.15900910 1.0383850 -0.7643617 3.399701 0.01010101 Rejected
Education 0.64114702 0.4747312 -1.0773928 3.745441 0.03030303 Rejected
SelfEmployed -0.02442418 -0.1511711 -0.9536783 1.495992 0.00000000 Rejected
ApplicantIncome 6.05487791 6.0311639 2.9801751 9.197305 0.94949495 Confirmed
CoapplicantIncome 5.76704389 5.7920332 1.9322989 10.184245 0.97979798 Confirmed
LoanAmount 5.19167613 5.3606935 1.7489061 8.855464 0.88888889 Confirmed
LoanAmountTerm 5.50553498 5.3938036 2.0361781 9.025020 0.90909091 Confirmed
CreditHistory 59.57931404 60.2352549 51.7297906 69.721650 1.00000000 Confirmed
PropertyArea 2.77155525 2.4715892 -1.2486696 8.719109 0.54545455 Rejected
让我们知道Boruta的参数:
maxRuns:随机林运行的最大数量。 如果保留临时属性,则可以考虑添加此参数。 默认值为100。
doTrace:它指的是细节层次。 0表示没有跟踪。 1表示清除属性后作出报告决策。 2表示每次迭代都会报告所有1加上每个报告。 默认值为0。
holdHistory:当设置为TRUE(默认)时,存储重要运行的整个历史记录。 当plotImpHistory函数被唤醒时,生成一个运行与重要性的分类器表。
有关更复杂的参数,请参阅Boruta包文件。
Boruta VS传统的特征选择算法
在这一点上,我们已经学习了在R中实现Boruta包的概念和步骤。
如果我们使用传统的特征选择算法,例如同一数据集的递归特征消除,我们最终会得到相同的重要性特征吗? 让我们来看看。
现在我们将学习用于实现递归特征消除(RFE)的步骤。 在R中,可以通过使用插入分组的方法来实现RFE算法。
让我们首先定义一个可以与RFE算法一起使用的控制函数。 我们加载了所需的库:
> library(caret) > library(randomForest) > set.seed(123) > control <- rfeControl(functions=rfFuncs, method="cv", number=10)
在这里,我们通过rfFuncs选项指定随机森林选择函数(也是Boruta中的基础算法)。
现在让我们实现RFE算法。
> rfe.train <- rfe(traindata[,2:12], traindata[,13], sizes=1:12, rfeControl=control)
我确信这一目标一目了然。 Traindata [,2:12]指的是选择除ID变量和自变量之外的所有列。 Traindata [,13],只选择因变量。 运行可能需要一些时间。
我们还可以检查该算法的结果。
> rfe.train
Recursive feature selection
Outer resampling method: Cross-Validated (10 fold)
Resampling performance over subset size:
Variables Accuracy Kappa AccuracySD KappaSD Selected
1 0.8083 0.4702 0.03810 0.1157 *
2 0.8041 0.4612 0.03575 0.1099
3 0.8021 0.4569 0.04201 0.1240
4 0.7896 0.4378 0.03991 0.1249
5 0.7978 0.4577 0.04557 0.1348
6 0.7957 0.4471 0.04422 0.1315
7 0.8061 0.4754 0.04230 0.1297
8 0.8083 0.4767 0.04055 0.1203
9 0.7897 0.4362 0.05044 0.1464
10 0.7918 0.4453 0.05549 0.1564
11 0.8041 0.4751 0.04419 0.1336
The top 1 variables (out of 1):
CreditHistory
该算法给予信用历史最高权重。 现在我们将绘制RFE算法的结果图表,并获得变量重要性的图表。
> plot(rfe.train, type=c("g", "o"), cex = 1.0, col = 1:11)
让我们提取所选的功能。 我相信这将反映在Credit History中。
> predictors(rfe.train)
[1] "CreditHistory"
因此,我们看到递归特征消除算法选择“信用记录”作为数据集的11个特征中唯一重要的特征。
与传统的特征选择算法相比,Boruta能够返回更好的重要变量,并且易于解释! 我认为访问许多令人惊叹的R语言包非常棒。 我相信会有很多其他功能选择包。 我特别想知道他们。
结论
Boruta是一个易于使用的软件包,没有很多需要调整/记忆的参数。 使用Boruta时,请勿使用缺少值或极值的重要数据集来检查重要变量。 它将直接报告。 您可以使用此算法来处理手上的任何分类/回归问题,以获得有意义的功能。
在本文中,我使用了一种快速方法来填充缺失值。 毕竟,本文的范围是理解boruta(理论和实践)。 我建议你使用估计缺失值的高级方法。 毕竟,数据信息的可知性正是我们所期望的!
上一篇:美国大选之际,23岁贩毒的美国“杀毒软件之父”又来竞选美国总统了
下一篇:华为延期,三星下架,折叠屏的技术到底有多难
人机验证(Captcha)绕过方法:使用Chrome开发者工具在目标网站登录页面上执行简单的元素编辑,以实现Captcha绕过
牛创网络: " 人机身份验证(Captcha)通常显示在网站的注册,登录名和密码重置页面上。 以下是目标网站在登录页面中排列的验证码机制。 从上图可以
2020-01-26 12:44:09 )8872( 亮了
自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
牛创网络: "自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
2020-01-30 14:04:47 )6288( 亮了
Grafana CVE-2020-13379漏洞分析:重定向和URL参数注入漏洞的综合利用可以在任何Grafana产品实例中实现未经授权的服务器端请求伪造攻击SSRF
牛创网络: "在Grafana产品实例中,综合利用重定向和URL参数注入漏洞可以实现未经授权的服务器端请求伪造攻击(SSRF)。该漏洞影响Grafana 3 0 1至7 0 1版本。
2020-08-12 14:26:44 )4301( 亮了
Nginx反向代理配置及反向代理泛目录,目录,全站方法
牛创网络: "使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀
2019-06-17 10:08:58 )3858( 亮了
fortify sca自定义代码安全扫描工具扫描规则(源代码编写、规则定义和扫描结果展示)
牛创网络: "一般安全问题(例如代码注入漏洞),当前fortify sca规则具有很多误报,可通过规则优化来减少误报。自带的扫描规则不能检测到这些问题。 需要自定义扫描规则,合规性角度展示安全风险。
2020-02-12 10:49:07 )3505( 亮了
整理几款2020年流行的漏洞扫描工具
牛创网络: "漏洞扫描器就是确保可以及时准确地检测信息平台基础架构的安全性,确保业务的平稳发展,业务的高效快速发展以及公司,企业和国家 地区的所有信息资产的维护安全。
2020-08-05 14:36:26 )2536( 亮了
微擎安装使用技巧-微擎安装的时候页面显示空白是怎么回事?
牛创网络: "我们在公众号开发中,有时候会用到微擎,那我们来看一下微擎安装的时候页面显示空白是怎么回事吧
2019-06-08 15:34:16 )2261( 亮了
渗透测试:利用前端断点拦截和JS脚本替换对前端加密数据的修改
牛创网络: " 本文介绍的两种方法,虽然断点调试比JS脚本代码替换更容易,但是JS脚本代码替换方法可以实现更强大的功能,测试人员可以根据实际需要选择适当的测试方法
2020-01-07 09:34:42 )1995( 亮了
从工业界到学界盘点SAS与R优缺点比较
牛创网络: "虽然它在业界仍然由SAS主导,但R在学术界广泛使用,因为它的免费开源属性允许用户编写和共享他们自己的应用程序 然而,由于缺乏SAS经验,许多获得数据分析学位的学生很难找到工作。
2019-07-13 22:25:29 )1842( 亮了
41款APP侵犯用户隐私权:QQ,小米,搜狐,新浪,人人均被通报
牛创网络: "随着互联网的不断发展,我们进入了一个时代,每个人都离不开手机。 但是,APP越来越侵犯了用户隐私权。12月19日,工业和信息化部发布了《关于侵犯用户权益的APP(第一批)》的通知。
2019-12-20 11:28:14 )1775( 亮了