大家好!我是菜鸟君。最近换了份工作,倒是没有特别忙,但上下班的通勤时间更长了。视频和公众号更新的节奏也慢了下来。8月份希望能逐渐找回之前的节奏和状态。
在这期间收到了好多朋友的善意的“催更”。今天就来填一个坑,唠唠怎么用R语言来进行ababoost模型的构建。
首先,什么是adaboost模型呢?它是一种迭代算法,属于boosting这个大类别的一员。它的核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
Adaboost与之前我们介绍过的Xgboost模型都属于集成学习模型,但比Xgboost更加“古老”。目前各大比赛基本上以Xgboost为主了。
对Xgboost不熟悉的朋友可以看看:
接下来,让我们用R语言来构建一个adaboost模型。首先安装一些需要用到的R包。
install.packages("adabag") #adaboost模型install.packages("RColorBrewer") #用于绘图library(RColorBrewer)library(adabag)library(caret)
然后加载数据集。今天依然采用鸢尾花数据集进行示范。将训练集、测试集按8:2进行划分。
data(iris)#训练集、测试集划分set.seed(111)trainlist <- createDataPartition(iris$Species,p = 0.8, list = FALSE)trainset <- iris[trainlist,]testset <- iris[-trainlist,]
我们可以来进行Adaboost模型构建啦!
#Adaboost算法构建模型fit <- boosting(Species~., data = trainset,boos=TRUE, mfinal=100 )
参数具体介绍如下:
| 参数 |
意义 |
| formula |
y~x1 + x2 + . . . + xn,确定自变量和因变量 |
| data | 数据集名称 |
| boos |
True(默认)是权重使用迭代时的权重,False是各个观测使用相同的权重 |
| mfinal |
迭代次数。默认100 |
接下来介绍特征重要性排序。
#将特征重要性存为一个数据框imp <- data.frame(fit$importance)imp$variable <- row.names(imp)#从高到低进行排序imp <- imp[order(imp$fit.importance,decreasing = T),]

将所有特征按重要性分数进行从高到低排序,这个结果是不是还不够直观?让我们来做个图吧!
#特征重要性绘图barplot(rev(imp$fit.importance),horiz=T,xlim=c(-18,56),axes=F,col=rep(brewer.pal(4,'YlOrRd'),each=1))text(seq(from=0.7,length.out=135,by=1.2),x=-10,label=rev(imp$variable))axis(3,c(0,10,20,30,40,50),c('0','10','20','30','40','50'))

这个图采用不同颜色标明特征的重要程度,颜色越深越重要。此外,这个图的上方还加了刻度,方便比较各个特征的数值上的差异。比起冷冰冰的数字,这个条形图是不是更加直观明了呢?放到论文结果部分,肯定会加分的!
对了,咱们的模型还没预测呢。在测试集上预测以后,我们采用caret包来进行模型效果评估。
#预测测试集pre <- predict(fit,newdata = testset)#模型评估adaboost.cf <- caret::confusionMatrix(as.factor(pre$class),as.factor(testset$Species))adaboost.cf #acc,kappa,混淆矩阵在测试集上预测以后,我们采用caret包来进行模型效果评估。

这个模型在测试集上的准确率为100%,也太理想了吧!每当遇到这种情况我都会产生“自我怀疑”,是不是有过拟合的可能?如果数据量再扩大一些,模型效果是不是会打折扣?
最后,多分类的情况下我们计算一下ROC曲线下面积AUC。这个示例中,AUC为1。
#多类别计算AUC,multiclass.roclibrary(pROC)pre_prob <- data.frame(pre$prob)names(pre_prob) <- levels(testset$Species)roc_ada <- multiclass.roc(testset$Species,pre_prob)

这就是今天想跟大家分享的用R语言构建Adaboost模型的过程。觉得有帮助的小伙伴记得右下角点个“在看”哦!每天进步一点点,我们一起加油!

