网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

行业资讯团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 新闻资讯 > 行业资讯 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

利用R语言的Boruta包进行特征选择

文章来源:网络收集整理 发布时间:2019-07-11 21:00:12 围观次数:
分享到:

摘要:变量选择是模型构建的一个重要方面,每个分析师都必须学习。 毕竟,它有助于消除相关变量,偏差和不必要的噪声的限制,以构建预测模型。

介绍

  变量选择是模型构建的一个重要方面,每个分析师都必须学习。 毕竟,它有助于消除相关变量,偏差和不必要的噪声的限制,以构建预测模型。

  许多分析新手认为,保留所有(或更多)变量会产生最佳模型,因为您不会丢失任何信息。 可悲的是,他们错了!

  从模型中删除变量可提高模型的准确性。 你有多少次遇到过这种事情?

  至少,我遇到过很多次。 经常发现这些变量是相关的,并且可能妨碍实现更高的模型精度。 今天,我们将学习如何摆脱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(理论和实践)。 我建议你使用估计缺失值的高级方法。 毕竟,数据信息的可知性正是我们所期望的! 


本文由 网络收集整理 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:R语言 Boruta包 特征选择

上一篇:美国大选之际,23岁贩毒的美国“杀毒软件之父”又来竞选美国总统了
下一篇:华为延期,三星下架,折叠屏的技术到底有多难

热门资讯

鼠标向下滚动