XGBoost 机器学习模型是一种高效且可扩的展的机器学习分类器,由 Chen 和 Guestrin 在 2016 年推广。XGBoost原理是是在决策树的基础上产生迭代,它以 boosting 的方式结合了多个决策树。通常创建每棵新树是为了通过梯度提升来减少先前模型的误差,误差指的是实际值和预测值之间的差异。把误差作为协变量参与下一个模型的预测,反复执行这个过程,降低出错率,直到决策树指定阈值,模型已经被训练成功。XGBoost 具有与梯度提升相同的原理,它使用提升次数、学习率、二次采样率和最大树深度来控制过度拟合并增强更好的性能.
在既往文章中,我们已经介绍R语言应用xgboost进行机器学习的基本操作,今天我们依据论文:何玉花, 周梦林, 徐建云,等. 应用机器学习方法建立大于胎龄儿预测模型[J]. 现代妇产科进展, 2019.
来介绍一下xgboost进行机器学习预测,继续使用我们的体检数据,先导入数据
library(xgboost)
bc<-read.csv("E:/r/test/demo.csv",sep=',',header=TRUE)
数据变量很多,我解释几个我等下要用的,HBP:是否发生高血压,结局指标,AGE:年龄,是我们的协变量,SEX:性别等。公众号回复:体检数据,可以获得数据。
我们用不到这么多变量取一部分变量来建模
bc<-bc[,c("HBP","SEX","AGE","FEV1","OCCU","COUGH","EDU")]
删除缺失变量,这步是必须的
bc <- na.omit(bc)
分类变量转化成因子,这里注意一下,结局变量不能转成因子
bc$SEX<-as.factor(bc$SEX)
bc$OCCU<-as.factor(bc$OCCU)
bc$EDU<-as.factor(bc$EDU)
先把数据分成训练集和预测集
set.seed(12345)
tr1<- sample(nrow(bc),0.8*nrow(bc))##随机无放抽取
bc_train <- bc[tr1,]#70%数据集
bc_test<- bc[-tr1,]#30%数据集
把训练集转变格式
x = model.matrix(HBP~.,bc_train)[,-1]
data_train <- xgb.DMatrix(x , label =as.numeric(bc_train$HBP))#构造模型需要的xgb.DMatrix对象,处理对象为稀疏矩阵
在测试集也是要同样的改变格式
x1 = model.matrix(HBP~.,bc_test)[,-1]
model_martix_bc_test<-model.matrix(HBP~.,bc_test)[,-1]
data_test <- xgb.DMatrix(x1 , label =as.numeric(bc_test$HBP))#构造模型需要的xgb.DMatrix对象,处理对象为稀疏矩阵
建立xgboost模型
xgb <- xgboost(data = data_train,max_depth=6, eta=0.5, objective='binary:logistic', nround=25)
在测试集上预测
pre_xgb = round(predict(xgb,newdata = data_test))
输出混淆矩阵的预测结果值,表示预测值和真实值的对比,我们这里0预测错了9个,1预测错了17个,
table(bc_test$HBP,pre_xgb,dnn=c("真实值","预测值"))
绘制ROC曲线
library(pROC)
xgboost_roc <- roc(bc_test$HBP,as.numeric(pre_xgb))
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曲线')
这里ROC曲线得出了模型的各项指标指标,可以放在论文中,
在论文:何玉花, 周梦林, 徐建云,等. 应用机器学习方法建立大于胎龄儿预测模型[J]. 现代妇产科进展, 2019.中,还使用Logistic 回归模型和XGBoost 模型进行对比,比较模型优劣性,我们这里也比较一下,先导入R包
library(InformationValue)
建立模型
f2<-glm(HBP~ SEX+OCCU+EDU,family = binomial(link = logit), data = bc_train)
summary(f2)
得出预测值
bc_test$pre<-round(predict(f2,newdata = bc_test))
pre<-round(predict(f2,newdata = bc_test))
表格显示真实和预测值
table(bc_test$HBP,pre,dnn=c("真实值","预测值"))
使用混淆矩阵进行分类
confusionMatrix(bc_test$HBP,pre)#使用混淆矩阵进行分类
建立ROC并绘图
roc1<-roc(as.ordered(bc_test$HBP) ,as.ordered(bc_test$pre))
plot(roc1,print.auc=T, auc.polygon=T, grid=c(0.1, 0.2), grid.col=c("green","red"),
max.auc.polygon=T, auc.polygon.col="skyblue",print.thres=T)
可以看出来,在验证集中Logistic 回归模型的AUC没有XGBoost 模型的高,到此我们已经完全复现了论文:何玉花, 周梦林, 徐建云,等. 应用机器学习方法建立大于胎龄儿预测模型[J]. 现代妇产科进展, 2019.的核心结果,感兴趣的可以自己取研究一下论文。
Logistic 回归模型和XGBoost 模型的ROC曲线也可以绘制在同一张图中,方法可以参看我的既往文章:《R语言基于ggplot绘制多条ROC曲线(2)》。
OK,本文结束。