07-XGBoost机器学习模型
概念:XGBoost(eXtreme Gradient Boosting)是一种高效的、可扩展的梯度提升决策树算法,在很多机器学习竞赛中表现突出。
原理:它属于Boosting集成算法,通过串行地训练一系列决策树,每棵树学习之前所有树组合的残差。XGBoost在标准梯度提升的基础上进行了优化,包括使用二阶泰勒展开近似损失函数、加入正则化项控制模型复杂度,以及并行处理等工程优化。
思想:通过不断添加新的弱学习器(树)来纠正前一轮模型的错误,并将这些弱学习器线性组合成一个强学习器。
应用:广泛应用于点击率预测、金融反欺诈、搜索引擎排序等需要高精度的预测任务。
- 环境初始化与数据准备:
- 模型训练与预测:
- 模型评估与可视化:
- 模型解释分析:
- 结果保存与报告生成:
R语言代码实现了一个完整的XGBoost机器学习模型分析流程,专注于二元分类问题的建模、评估和解释,并自动化生成报告。
# 设置工作目录和清理环境
rm(list = ls())
if (!is.null(dev.list())) dev.off()
setwd("C:/Users/hyy/Desktop/")
# 创建结果文件夹
if (!dir.exists("Results-xgb")) dir.create("Results-xgb")
# 加载必要的包
if (!require(pacman)) install.packages("pacman")
pacman::p_load(readxl, writexl, xgboost, tidymodels, DALEXtra, auditor, vivo, pROC,
ggplot2, officer, flextable, gridExtra, showtext)
# 设置全局中文字体支持
font_add(family = "simhei", regular = "simhei.ttf") # 添加黑体
font_add(family = "simsun", regular = "simsun.ttc") # 添加宋体
showtext_auto(enable = TRUE) # 启用showtext
# 设置图形设备参数(适用于基础绘图)
if (.Platform$OS.type == "windows") {
windowsFonts(SimHei = windowsFont("SimHei"))
windowsFonts(SimSun = windowsFont("SimSun"))
chinese_font <- "SimHei"
} else {
chinese_font <- "sans"
}
# 1. 数据准备
data <- read_excel("示例数据.xlsx")
# 将分类变量转换为因子
data$`肥胖程度` <- as.factor(data$`肥胖程度`)
data$`教育水平` <- as.factor(data$`教育水平`)
data$`血型` <- as.factor(data$`血型`)
data$`指标8` <- as.factor(data$`指标8`)
data$`结局` <- as.factor(data$`结局`)
# 分层抽样划分训练集和测试集
set.seed(123)
train_index <- sample(1:nrow(data), nrow(data)*0.7)
Train <- data[train_index, ]
Test <- data[-train_index, ]
# 保存数据集
write_xlsx(Train, "Results-xgb/Train.xlsx")
write_xlsx(Test, "Results-xgb/Test.xlsx")
write_xlsx(data, "Results-xgb/All.xlsx")
# 2. XGBoost模型训练
# 4. 模型评估
# ROC曲线
roc_result <- roc(Test$结局, xg_pred_prob_value)
# 绘制ROC曲线
jpeg("Results-xgb/ROC_curve.jpg", width = 800, height = 600)
plot(roc_result, main = "XGBoost模型ROC曲线",
print.auc = TRUE, print.auc.x = 0.6, print.auc.y = 0.4,
auc.polygon = TRUE, max.auc.polygon = TRUE, grid = TRUE)
dev.off()
pdf("Results-xgb/ROC_curve.pdf", width = 8, height = 6)
plot(roc_result, main = "XGBoost模型ROC曲线",
print.auc = TRUE, print.auc.x = 0.6, print.auc.y = 0.4,
auc.polygon = TRUE, max.auc.polygon = TRUE, grid = TRUE)
dev.off()
# 计算AUC值
auc_value <- auc(roc_result)
# 混淆矩阵
conf_matrix <- confusionMatrix(xg_pred_class$.pred_class, Test$结局)
# 计算Brier得分
brier_score <- mean((as.numeric(xg_pred_prob_value) - as.numeric(Test$结局))^2)
# 5. 模型解释
pdf("Results-xgb/shap_plot.pdf", width = 8, height = 6)
plot(xgb_shap, show_boxplots = FALSE)
dev.off()
# 模型解释绘制ROC曲线
model_eval <- model_evaluation(xgb_exp)
jpeg("Results-xgb/model_evaluation.jpg", width = 800, height = 600)
plot(model_eval)
dev.off()
pdf("Results-xgb/model_evaluation.pdf", width = 8, height = 6)
plot(model_eval)
dev.off()
# 模型解释部分依赖图(PDP)
xgb_profiles <- model_profile(xgb_exp)
jpeg("Results-xgb/partial_dependence.jpg", width = 800, height = 600)
plot(xgb_profiles)
dev.off()
pdf("Results-xgb/partial_dependence.pdf", width = 8, height = 6)
plot(xgb_profiles)
dev.off()
# 模型解释变量重要性
xgb_vi <- model_parts(xgb_exp)
jpeg("Results-xgb/variable_importance.jpg", width = 800, height = 600)
plot(xgb_vi)
dev.off()
pdf("Results-xgb/variable_importance.pdf", width = 8, height = 6)
plot(xgb_vi)
dev.off()
# 模型解释CP图
xgb_cp <- predict_profile(xgb_exp, new_observation = Test[1, ])
jpeg("Results-xgb/ceteris_paribus.jpg", width = 800, height = 600)
plot(xgb_cp)
dev.off()
pdf("Results-xgb/ceteris_paribus.pdf", width = 8, height = 6)
plot(xgb_cp)
dev.off()
# 6. 保存结果
# 保存预测结果
results_table <- data.frame(
实际值 = Test$结局,
预测概率 = xg_pred_prob_value,
预测类别 = xg_pred_class$.pred_class
)
write_xlsx(results_table, "Results-xgb/predictions.xlsx")
# 保存模型性能指标
performance_table <- data.frame(
指标 = c("准确率", "灵敏度", "特异度", "AUC", "Brier得分"),
值 = c(round(conf_matrix$overall[1], 4),
round(conf_matrix$byClass[1], 4),
round(conf_matrix$byClass[2], 4),
round(auc_value, 4),
round(brier_score, 4))
)
write_xlsx(performance_table, "Results-xgb/performance_metrics.xlsx")
# 保存变量重要性数据
vi_data <- as.data.frame(xgb_vi)
write_xlsx(vi_data, "Results-xgb/variable_importance_data.xlsx")
# 7. 创建Word报告
doc <- read_docx()
doc <- body_add_par(doc, "XGBoost模型分析报告", style = "heading 1")
doc <- body_add_par(doc, paste0("分析日期: ", Sys.Date()), style = "Normal")
doc <- body_add_par(doc, "数据概览", style = "heading 2")
doc <- body_add_par(doc, paste0("总样本量: ", nrow(data)), style = "Normal")
doc <- body_add_par(doc, paste0("训练集样本量: ", nrow(Train)), style = "Normal")
doc <- body_add_par(doc, paste0("测试集样本量: ", nrow(Test)), style = "Normal")
doc <- body_add_par(doc, "模型性能指标", style = "heading 2")
doc <- body_add_flextable(doc, flextable(performance_table))
doc <- body_add_par(doc, "ROC曲线", style = "heading 2")
doc <- body_add_img(doc, "Results-xgb/ROC_curve.jpg", width = 6, height = 5)
doc <- body_add_par(doc, "变量重要性", style = "heading 2")
doc <- body_add_img(doc, "Results-xgb/variable_importance.jpg", width = 6, height = 5)
doc <- body_add_par(doc, "模型解释", style = "heading 2")
doc <- body_add_par(doc, "Breakdown分析", style = "heading 3")
doc <- body_add_img(doc, "Results-xgb/breakdown_plot.jpg", width = 6, height = 5)
doc <- body_add_par(doc, "SHAP值分析", style = "heading 3")
doc <- body_add_img(doc, "Results-xgb/shap_plot.jpg", width = 6, height = 5)
doc <- body_add_par(doc, "部分依赖图", style = "heading 3")
doc <- body_add_img(doc, "Results-xgb/partial_dependence.jpg", width = 6, height = 5)
doc <- body_add_par(doc, "Ceteris Paribus分析", style = "heading 3")
doc <- body_add_img(doc, "Results-xgb/ceteris_paribus.jpg", width = 6, height = 5)
doc <- body_add_par(doc, "结论", style = "heading 2")
doc <- body_add_par(doc, paste0(
"XGBoost模型在测试集上表现",
ifelse(auc_value > 0.7, "良好", "一般"),
",AUC值为", round(auc_value, 3),
"。模型准确率为", round(conf_matrix$overall[1], 3), "。"
), style = "Normal")
print(doc, target = "Results-xgb/XGBoost分析报告.docx")
# 8. 保存工作空间
save.image("Results-xgb/XGBoost分析.RData")
cat("分析完成!所有结果已保存到 Results-xgb 文件夹中。")
- 环境初始化与数据准备:设置工作目录并清理环境,创建结果文件夹;随后读取Excel格式的示例数据,将分类变量(如肥胖程度、教育水平、血型等)转换为因子类型,并通过分层抽样将数据划分为训练集(70%)和测试集(30%),保存为Excel文件 。
- 模型训练与预测:使用XGBoost算法构建分类模型,以指标1-6作为特征预测结局变量;在测试集上进行概率和类别预测,支持模型性能评估 。
- 模型评估与可视化:通过ROC曲线计算AUC值,生成混淆矩阵(输出准确率、灵敏度、特异度等指标),并计算Brier得分以全面评估模型性能;所有结果以图表形式保存(如JPG和PDF格式) 。
- 模型解释分析:利用Breakdown图、SHAP值、部分依赖图(PDP)、变量重要性图和Ceteris Paribus图等方法解释模型决策过程,增强可解释性;相关图表和数据分析结果保存到文件 。
- 结果保存与报告生成:自动化输出预测结果、性能指标和变量重要性数据为Excel表格,并使用Word报告整合数据概览、模型性能、可视化图表和结论;所有输出保存到"Results-xgb"文件夹中 。
- pacman:简化包的安装和加载管理,确保分析依赖就绪 。
- readxl 和 writexl:分别用于读取Excel数据文件(如"示例数据.xlsx")和导出数据集到Excel格式 。
- xgboost 和 tidymodels:核心建模包,xgboost提供XGBoost算法引擎,tidymodels用于设置模型模式(分类)和拟合流程 。
- DALEXtra、auditor 和 vivo:支持模型解释,如生成Breakdown分析、SHAP值、部分依赖图和变量重要性图 。
- pROC:绘制ROC曲线并计算AUC值,评估模型区分能力 。
- ggplot2 和 gridExtra:用于创建高质量可视化图形,如整合多个图表 。
- officer 和 flextable:生成和格式化Word报告,插入文本、表格和图片 。
- showtext:设置中文字体支持,确保图表中的中文标签正确渲染 。
该代码适用于需要高性能预测和可解释性分析的二元分类场景,例如在医疗研究中预测疾病结局、金融领域评估客户风险,或商业分析中识别关键影响因素 。自动化流程提高了分析效率,适合快速生成学术论文、实践报告或决策支持材料,通过模型解释工具(如SHAP和部分依赖图)帮助用户理解变量贡献,优化模型性能,并为后续研究提供基础 。
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,机器学习,生存分析,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!
“医学统计数据分析”公众号右下角;
找到“联系作者”,
可加我微信,邀请入粉丝群!
有临床流行病学数据分析
如(t检验、方差分析、χ2检验、logistic回归)、
(重复测量方差分析与配对T检验、ROC曲线)、
(非参数检验、生存分析、样本含量估计)、
(筛检试验:灵敏度、特异度、约登指数等计算)、
(绘制柱状图、散点图、小提琴图、列线图等)、
机器学习、深度学习、生存分析
等需求的同仁们,加入【临床】粉丝群。
疾控,公卫岗位的同仁,可以加一下【公卫】粉丝群,分享生态学研究、空间分析、时间序列、监测数据分析、时空面板技巧等工作科研自动化内容。
有实验室数据分析需求的同仁们,可以加入【生信】粉丝群,交流NCBI(基因序列)、UniProt(蛋白质)、KEGG(通路)、GEO(公共数据集)等公共数据库、基因组学转录组学蛋白组学代谢组学表型组学等数据分析和可视化内容。
或者可扫码直接加微信进群!!!
精品视频课程-“医学统计数据分析”视频号付费合集
在“医学统计数据分析”视频号-付费合集兑换相应课程后,获取课程理论课PPT、代码、基础数据等相关资料,请大家在【医学统计数据分析】公众号右下角,找到“联系作者”,加我微信后打包发送。感谢您的支持!!
【二分类因变量机器学习】图文教程
往期推荐:【监测预警自动化】系列教程
往期推荐:样本含量估计(样本量计算与功效分析)
往期推荐:SPSS、R语言、Python等临床数据分析专题
往期推荐:科研图表绘制专题
往期推荐:重复测量数据分析专题
往期推荐:生信分析、基因测序数据、实验室数据专题
往期推荐:生存分析及机器学习
往期推荐:时间序列分析
往期推荐:地统计分析-GIS、地图、相关、聚类、回归
往期推荐:科研自动化探究
往期推荐:趣味阅读
统计评书系列

