京公网安备 11010802034615号
经营许可证编号:京B2-20210330
我是R语言小白带你建模之adaboost建模
今天更新我用我蹩脚的R技能写的一个adaboost建模的过程,代码有参考别人的代码再根据自己的思路做了更改。代码一部分来自书籍《实用机器学习》,我个人特别喜欢这本书
至于adaboost,大家自动移步谷歌,我跟一个人说我喜欢百度,他误以为我喜欢百度一个公司,所以我决定改口说去谷歌,毕竟谷歌没广告。
先说,模型的数据是我实现已经缺失值填补,以及分组好的数据,所以代码中没有预处理的部分,只有一些简单变量的转化。
代码分为三部分:
1、加载包以及一个简单的变量形式转化,以及训练集和测试的分区,还有初步拟合一个简单的adaboost。
2、设置深度以及树的棵树,希望是,能通过输出的模型评估指标,找到一个复杂度低,但是模型效果相对较好的adaboost。
3、检查你取的最优的adaboost的模型的泛化能力,这里是通过把数据集变成十等份,用刚才拟合出来的adaboost模型计算其ks、auc、正确率啊,看时候会不会过拟合造成在其他数据集中的效果下降。
这可能是我这么久以来这么正经的写R代码,所以我的注释特别多,不像我的sas代码,基本不写注释。
1
rm(list=ls())
# 清空缓存数据
rpart.installed <- 'rpart' %in% rownames(installed.packages())
if (rpart.installed) {
print("the rpart package is already installed, let's load it...")
}else {
print("let's install the rpart package first...")
install.packages('rpart', dependencies=T)
}
#检查是否存在rpart包,若没有就加载
library('rpart')
partykit.installed <- 'partykit' %in% rownames(installed.packages())
if (partykit.installed) {
print("the partykit package is already installed, let's load it...")
}else {
print("let's install the partykit package first...")
install.packages('partykit', dependencies=T)
}
#检查是否存在partykit包,若没有就加载
library('grid')
library('partykit')
adabag.installed <- 'adabag' %in% rownames(installed.packages())
if (adabag.installed) {
print("the adabag package is already installed, let's load it...")
}else {
print("let's install the adabag package first...")
install.packages('adabag', dependencies=T)
}
library('adabag')
library('rpart')
library('gplots')
library('ROCR')
# 加载在代码中需要使用的包
x<-read.csv("alldata_zuhe.csv",header=T);
#读目标数据,读取数据之前,手动加载路径
D<-as.data.frame(x)
#把x数据转成数据框
D$APPL_STATUS_1<-as.factor(D$APPL_STATUS_1)
# 把目标变量转成因子格式,以防模型拟合的时候识别为连续变量建立回归树
# colnames(D)[ncol(D)] <- 'APPL_STATUS_1'
D<-D[-which(names(D) %in% c('APPL_ID'))]
# 剔除掉一些不用进入模型的变量
train_ratio <- 0.7
# 设置训练集以及测试集的比例,这里设置的是3:7
n_total <- nrow(D)
# 取出原样本数据集的数量
n_train <- round(train_ratio * n_total)
# 计算出训练集的数量
n_test <- n_total - n_train
# 计算出测试集的数量
set.seed(42)
# 设置抽取种子,种子的意义在于当取同个种子的时候,抽取的样本一样。
list_train <- sample(n_total, n_train)
# 利用sample函数取数测试集的样本的行数
D_train <- D[list_train,]
# 从原样本中取出训练数据
D_test <- D[-list_train,]
# 从原样本中取出测试集数据
y_train <- D_train$APPL_STATUS_1
# 取数训练集中的因变量,待会对模型的评估需要用到
y_test <- D_test$APPL_STATUS_1
# 取数测试集中的因变量,待会对模型的评估需要用到
maxdepth <- 3
# 设置树的深度,利用rpart.control带着深度的向量,也可以直接写上深度,
# 设置在提升树过程中的树的深度
mfinal <- 10
# 设置树的数量
M_AdaBoost1 <- boosting(APPL_STATUS_1~., data = D_train,
boos = FALSE, mfinal = mfinal, coeflearn = 'Breiman',
control=rpart.control(maxdepth=maxdepth))
summary(M_AdaBoost1)
# 输出对象的M_AdaBoost1的信息,大概是种了几棵树,几个客户预测错了之类的。
M_AdaBoost1$trees
# 看下你种下的十棵树的大致情况。
M_AdaBoost1$trees[[1]]
# 检查第一颗树的情况,你检查也是看他合不合理,尽管不合理,只要效果好,
# 你还是会用,毕竟又不是只有一棵树。
M_AdaBoost1$weights
# 检查每棵树的权重
M_AdaBoost1$importance
# 看下变量的重要性。可以利用这个方法去筛选变量。
errorevol(M_AdaBoost1, D_test)
# 看下误差的演变
y_test_pred_AdaBoost1 <- predict(M_AdaBoost1, D_test)
# 使用模型预测测试集的效果。这里输出有概率也有预测分类,
# y_test_pred_AdaBoost1是个list的对象,跟拒想算的模型评估量选择计算。
accuracy_test_AdaBoost1 <- sum(y_test==y_test_pred_AdaBoost1$class) / n_test
# 计算正确率,即使用预测客户状态
msg <- paste0('accuracy_test_AdaBoost1 = ', accuracy_test_AdaBoost1)
print(msg)
# 输出正确率的结果
y_train_pred_AdaBoost1 <- predict(M_AdaBoost1, D_train)
# 使用模型预测训练集的效果
accuracy_train_AdaBoost1 <- sum(y_train==y_train_pred_AdaBoost1$class) / n_train
msg <- paste0('accuracy_train_AdaBoost1 = ', accuracy_train_AdaBoost1)
print(msg)
# 计算正确率之后,输出正确率的结果。
2
# 这个代码是为了寻找最优的种树的数目以及深度,因为了防止过拟合以及节省时间,这里的深度我建议设置的是2:5
# 树的数目大概是10-50课,数可能多了,但是模型复杂度也提升了,泛化能力就低了。
library(plyr)
# 加载需要的包
total1<-data.frame()
# 建立一个空表,待会这个表是用来装结果的
m <- seq(5, 30, by = 5)
# 设置树的数量,我这里设置的是从5棵树开始,到30棵树,以5为单位。
for (j in m) {
# 循环树的数量
for(i in 3:6){
# 这里设置深度循环的数字,我设置的3到6
maxdepth <- i
mfinal <- j
M_AdaBoost1 <- boosting(APPL_STATUS_1~., data = D_train,boos = FALSE, mfinal = mfinal, coeflearn = 'Breiman',control=rpart.control(maxdepth=maxdepth))
# 设置参数之后生成模型
y_test_pred_AdaBoost1 <- predict(M_AdaBoost1, D_test)
# 利用生成的模型预测测试集
accuracy_test <- sum(D_test$APPL_STATUS_1==y_test_pred_AdaBoost1$class) / length(y_test_pred_AdaBoost1$class)
# 计算正确率
pred<-prediction(y_test_pred_AdaBoost1$prob[,2],y_test)
perf<-performance(pred,'tpr','fpr')
auc1 <-performance(pred,'auc')@y.values
#计算AUC值
v = as.vector(unlist(auc1[1]))
# 因为AUC值不是一个向量的格式,但是我后续需要组成数据框,所以在这里转成向量了
ks1 <- max(attr(perf,'y.values')[[1]]-attr(perf,'x.values')[[1]])
#计算KS
total<-data.frame(auc=v,ks=ks1,accuracy=accuracy_test,maxdepth=i,mfinal=j)
# 将多个模型评估指标合并变成数据框
total1<-rbind(total1,total)
# 纵向合并
print(paste("adaboost-maxdepth:", i))
print(paste("adaboost-mfinal:", j))
# 打印循环哪一步,以防报错的时候可以直达是哪一步错误,以及跟踪进度跑到那里了
}
}
结果跑出看total1这个数据集,图:
第一列是auc,依次是ks,正确率,设置的树的深度,以及种的棵树。可以根据这张表选出你认为好的深度以及树的棵树
3
M_AdaBoost1 <- boosting(APPL_STATUS_1~., data = D_train,
boos = FALSE, mfinal = 15, coeflearn = 'Breiman',
control=rpart.control(maxdepth=3))
# 在刚才的adaboost取最优参数取出最优的树以及深度之后,在这里跑出模型之后,用在其他模型上面
# 因为集成模型大部分时候都是一个类似黑箱子的过程,你是知道几棵树,深度多少,但是实际上,你并不能
# 像逻辑回归一样一颗一颗树去看他合不合理,所以这时候就需要就检查他对其他数据是不是也可行,且效果
# 不会下降太多
library(plyr)
# 加载需要的包
CVgroup <- function(k, datasize, seed) {
cvlist <- list()
set.seed(seed)
n <- rep(1:k, ceiling(datasize/k))[1:datasize]
#将数据分成K份,并生成的完整数据集n
temp <- sample(n, datasize)
#把n打乱
x <- 1:k
dataseq <- 1:datasize
cvlist <- lapply(x, function(x) dataseq[temp==x])
#dataseq中随机生成10个随机有序数据列
return(cvlist)
}
cvlist<-CVgroup(10, 10513, 957445)
# 这个过程第二个参数输入的是你的数据集的总数,第三个是seed种子,第一个是划分成几份。
# cvlist是一个list,包含十个样本,每个样本的数量差不多
data <- D
# 将的原样本数据集赋给data
total1 <- data.frame()
#建立一个空表存储预测结果
for (i in 1:10) {
# 循环上面那个代码分好的是个数据集
print(i)
test <- data[cvlist[[i]],]
# 取出第i个数据集
y_test<-test$APPL_STATUS_1
# 取出第i个数据集中的因变量
y_test_pred_rf1 <- predict(M_AdaBoost1, test)
# 预测第i个数据集
accuracy_test <- sum(test$APPL_STATUS_1==y_test_pred_rf1$class) / length(y_test_pred_rf1$class)
# 计算第i个数据集的正确率
pred<-prediction(y_test_pred_rf1$prob[,2],y_test)
perf<-performance(pred,'tpr','fpr')
auc1 <- performance(pred,'auc')@y.values
v = as.vector(unlist(auc1[1]))
#计算第i个数据集的AUC值
ks1 <- max(attr(perf,'y.values')[[1]]-attr(perf,'x.values')[[1]]) #计算KS
#计算第i个数据集的ks值
total<-data.frame(auc=v,ks=ks1,accuracy=accuracy_test)
# 合并各项参数
total1<-rbind(total1,total)
# 合并每个数据集的结果
}
这个代码跑完之后看total1,图:
这就是你选出的模型,将总体数据分成十份每一份的ks以及auc,你要是觉得不可靠,可以多循环几次种子。要是觉得你选的模型不好,可以回去第二步再选一个放到第三步的代码跑。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
【核心关键词】客户、数据分析、指标体系、数据采集、数据指标、业务数据、分析思路、业务需求、分析方法 【专访摘要】本次 CDA ...
2026-07-24在数据分析、业务建模与数字化运营体系中,原始业务数据普遍存在缺失、重复、异常、口径不一致等质量问题,直接用于分析与建模会 ...
2026-07-24 很多数据分析师能熟练计算均值、标准差,但当被问到“如何用一张图让业务方3秒内看懂核心结论”“面对不同数据类型该怎么选 ...
2026-07-24在数据驱动的精细化运营体系中,指标是业务判断、效果复盘、策略优化的核心依据。随着企业数据化程度提升,指标数量持续膨胀,但 ...
2026-07-23在用户运营与产品增长体系中,留存是衡量产品真实价值与用户粘性的核心标尺,也是决定用户生命周期价值、获客投产比的底层因素。 ...
2026-07-23 很多数据分析师精通Excel、SQL、Python等工具,但当被问到“面对一个具体的业务问题,该用什么分析方法”“描述性分析和诊断 ...
2026-07-23【核心关键词】埋点、产品、互联网、数据库、决策、数据分析、产品经理、商业模式、移动互联网、指标体系、运营模块、大数据平 ...
2026-07-22在高并发、大数据量的业务系统中,单表数据量达到千万级甚至亿级后,会出现查询性能骤降、索引维护成本飙升、存储扩容困难等问题 ...
2026-07-22 很多企业团队并非缺乏指标,而是陷入“指标失控”:仪表盘上堆满实时跳动的数据,却无法回答“当前瓶颈在哪、下一步该做什么 ...
2026-07-22在金融风控、企业运营、行业研究等数据分析场景中,大量数据以面板数据形态存在:例如多家分支机构连续多个季度的风险指标、多位 ...
2026-07-21 很多数据分析师每天都在计算指标、制作报表,但当被问到“什么叫指标数据元”“指标数据标准包含哪些核心维度”“指标数据质 ...
2026-07-21一、活动介绍 2026暑期CDA备考冲刺季,为想利用假期拿证的你量身打造。考点胶囊内容搭配多重硬核福利,让你在旅行、实习、居家 ...
2026-07-21金融行业的运营风险贯穿业务全流程,涵盖交易欺诈、操作违规、流程漏洞、合规偏差、客户信用异常等多元场景,是银行、保险、证券 ...
2026-07-17财产保险作为金融行业的核心板块,涵盖车险、家财险、责任险、企财险等多元品类,是个人与企业抵御财产风险、经营风险的重要保障 ...
2026-07-17 很多数据分析师能熟练写SQL、做透视表,但当被问到“数据是从哪里来的?经过哪些加工才进入数据仓库?ETL具体做了什么?”时 ...
2026-07-17【核心关键词】模块、餐饮、客户、门店、企业、订单、供应链、多样化、产品、生产计划、数据分析、生产管理、物料管理、业务分 ...
2026-07-16在数字化分析时代,原始数据本身不具备业务价值,只有通过科学的统计学方法加工、拆解、验证与解读,才能挖掘数据背后的规律、差 ...
2026-07-16 很多数据分析师能熟练地写SQL、做透视表、算描述性统计,但当被问到“如何预测用户流失概率”“如何归因销量下滑的关键因素 ...
2026-07-16在描述性统计分析、数据预处理、异常值排查与多组数据分布对比工作中,箱线图(Box Plot)是应用最广泛的可视化与统计工具之一。 ...
2026-07-15在企业数据存储、业务统计与数据分析工作中,绝大多数业务数据都带有时间维度属性,例如订单创建时间、用户注册时间、支付完成时 ...
2026-07-15