xgboost算法可以说是一个比较新兴的算法,效果也非常好,在Kaggle上已经有不少例子说明其算法的优越性甚至超过了随机森林算法。
本文将主要介绍xgboost算法的R语言实现。使用的是xgboost包中的xgboost函数。
本文数据选择了红酒质量分类数据集,这是一个很经典的数据集,原数据集中“质量”这一变量取值有{3,4,5,6,7,8}。为了实现二分类问题,我们添加一个变量“等级”,并将“质量”为{3,4,5}的观测划分在等级0中,“质量”为{6,7,8}的观测划分在等级1中。
数据下载戳我
因变量:等级
自变量:非挥发性酸性、挥发性酸性、柠檬酸、剩余糖分、氯化物、游离二氧化硫、二氧化硫总量、浓度、pH、硫酸盐、酒精
library(openxlsx)
wine = read.xlsx("C:/Users/Mr.Reliable/Desktop/classification/winequality-red.xlsx")
#将数据集分为训练集和测试集,比例为7:3
train_sub = sample(nrow(wine),7/10*nrow(wine))
train_data = wine[train_sub,]
test_data = wine[-train_sub,]
install.packages('xgboost')
xgboost包中的xgboost函数对于数据格式有所要求,在使用xgboost函数之前,我们需要先对数据进行预处理。
library(Matrix)
####训练集的数据预处理
# 将自变量转化为矩阵
traindata1 <- data.matrix(train_data[,c(1:11)])
# 利用Matrix函数,将sparse参数设置为TRUE,转化为稀疏矩阵
traindata2 <- Matrix(traindata1,sparse=T)
traindata3 <- train_data[,13]
# 将自变量和因变量拼接为list
traindata4 <- list(data=traindata2,label=traindata3)
# 构造模型需要的xgb.DMatrix对象,处理对象为稀疏矩阵
dtrain <- xgb.DMatrix(data = traindata4$data, label = traindata4$label)
####测试集的数据预处理
# 将自变量转化为矩阵
testset1 <- data.matrix(test_data[,c(1:11)])
# 利用Matrix函数,将sparse参数设置为TRUE,转化为稀疏矩阵
testset2 <- Matrix(testset1,sparse=T)
# 将因变量转化为numeric
testset3 <- test_data[,13]
# 将自变量和因变量拼接为list
testset4 <- list(data=testset2,label=testset3)
# 构造模型需要的xgb.DMatrix对象,处理对象为稀疏矩阵
dtest <- xgb.DMatrix(data = testset4$data, label = testset4$label)
xgboost参数有很多,这里我们简单介绍常用并且关键的参数:
参数 | 意义 |
---|---|
silent | 默认值是0,您需要指定0连续打印消息,静默模式1。 |
booster | 默认值是gbtree,你需要指定要使用的上升模型:gbtree(树)或gblinear(线性函数)。 |
eta | 默认值设置为0.3。您需要指定用于更新步长收缩来防止过度拟合。每个提升步骤后,我们可以直接获得新特性的权重。实际上 eta 收缩特征权重的提高过程更为保守。范围是0到1。低η值意味着模型过度拟合更强。 |
max_depth | 默认值设置为6,您需要指定一个树的最大深度。参数范围是1到 ∞ \infty ∞ |
objective | 选择’binary:logistic’ |
nround | 迭代次数 |
xgb <- xgboost(data = dtrain,max_depth=6, eta=0.5, objective='binary:logistic', nround=25)
xgboost函数的参数
#在测试集上预测
pre_xgb = round(predict(xgb,newdata = dtest))
#输出混淆矩阵
table(test_data$等级,pre_xgb,dnn=c("真实值","预测值"))
xgboost_roc <- roc(test_data$等级,as.numeric(pre_xgb))
#绘制ROC曲线和AUC值
plot(xgboost_roc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=TRUE,auc.polygon.col="skyblue", print.thres=TRUE,main='xgboost模型ROC曲线')