08-lightGBM机器学习模型
概念:LightGBM是另一个基于梯度提升决策树的高效框架,由微软推出,以其训练速度快和内存消耗低而闻名。
原理:它采用基于直方图的决策树算法,以及带有深度限制的Leaf-wise(按叶子生长)策略,而非Level-wise(按层生长)策略。同时支持类别特征无需独热编码,进一步提升了效率。
思想:在保证精度的前提下,通过算法和工程优化,大幅提升梯度提升模型在处理大规模数据时的训练速度。
应用:与XGBoost类似,特别适用于数据量巨大、特征维度高的场景,如互联网广告、推荐系统。
-设置工作目录和清理环境。
-创建结果文件夹。
-加载必要的包。
-设置中文字体支持。
-数据准备:读取Excel数据,检查结构,转换因子。
-分层抽样划分训练集和测试集。
-数据预处理:确保特征为数值型,处理非数值型列。
-准备LightGBM数据:转换为矩阵,处理NA值。
-设置LightGBM参数。
-训练模型。
-模型评价:预测测试集,计算准确率,混淆矩阵,ROC曲线,AUC。
-特征重要性分析。
-SHAP分析:计算SHAP值,绘制摘要图和waterfall图。
-保存结果表格到Excel。
-生成Word报告。
-保存工作空间。
R语言代码实现了一个完整的LightGBM(Light Gradient Boosting Machine)机器学习模型构建和分析流程,专为处理二元分类问题设计,涵盖了从数据准备到报告生成的自动化过程。
# 设置工作目录和清理环境
rm(list = ls())
if (!is.null(dev.list())) dev.off()
setwd("C:/Users/hyy/Desktop/")
# 创建结果文件夹
if (!dir.exists("Results-gbm")) dir.create("Results-gbm")
# 加载必要的包
if (!require(pacman)) install.packages("pacman")
pacman::p_load(readxl, writexl, lightgbm, pROC, ggplot2, DALEX, DALEXtra,
officer, flextable, shapviz, DiagrammeR, data.table, caret)
# 设置全局中文字体支持
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")
# 检查数据结构
cat("数据结构:\n")
str(data)
cat("\n结局变量分布:\n")
table(data$结局)
# 将结局转换为因子
data$结局 <- as.factor(data$结局)
# 分层抽样划分训练集和测试集
set.seed(123)
train_index <- createDataPartition(data$结局, p = 0.7, list = FALSE)
Train <- data[train_index, ]
Test <- data[-train_index, ]
# 2. 数据预处理 - 确保所有特征都是数值型
# 检查并转换非数值型列
feature_cols <- setdiff(names(data), c("序号", "结局"))
non_numeric_cols <- sapply(data[, feature_cols], function(x) !is.numeric(x))
if (any(non_numeric_cols)) {
cat("发现非数值型列,正在转换为数值型...\n")
# 使用独热编码或标签编码转换非数值型列
for (col in names(non_numeric_cols)[non_numeric_cols]) {
if (is.character(data[[col]]) || is.factor(data[[col]])) {
# 使用标签编码
Train[[col]] <- as.numeric(factor(Train[[col]]))
Test[[col]] <- as.numeric(factor(Test[[col]]))
cat(paste("已将列", col, "转换为数值型\n"))
}
}
}
# 准备lightGBM数据
Train.matrix <- as.matrix(Train[, feature_cols])
Test.matrix <- as.matrix(Test[, feature_cols])
Train.labels <- as.numeric(Train$结局) - 1 # 转换为0/1
# 确保矩阵不包含NA或无限值
Train.matrix[is.na(Train.matrix)] <- 0
Train.matrix[is.infinite(Train.matrix)] <- 0
Test.matrix[is.na(Test.matrix)] <- 0
Test.matrix[is.infinite(Test.matrix)] <- 0
# 创建lightGBM数据集
lgb.Train <- lgb.Dataset(data = Train.matrix, label = Train.labels)
# 3. 设置LightGBM参数
# 5. 模型评价
# 预测测试集
pred_probs <- predict(lgb.model, Test.matrix)
pred_class <- ifelse(pred_probs > 0.5, 1, 0)
# 计算准确率
accuracy <- mean(pred_class == (as.numeric(Test$结局) - 1))
cat("模型准确率:", accuracy, "\n")
# 混淆矩阵
conf_matrix <- table(实际 = as.numeric(Test$结局) - 1, 预测 = pred_class)
conf_matrix_df <- as.data.frame.matrix(conf_matrix)
# ROC曲线
roc_obj <- roc(response = as.numeric(Test$结局) - 1, predictor = pred_probs)
auc_value <- auc(roc_obj)
# 绘制ROC曲线
jpeg("Results-gbm/gbm_roc_curve.jpg", width = 800, height = 600, quality = 100)
plot(roc_obj, main = "LightGBM ROC曲线", col = "blue", print.auc = TRUE)
dev.off()
pdf("Results-gbm/gbm_roc_curve.pdf", width = 8, height = 6)
plot(roc_obj, main = "LightGBM ROC曲线", col = "blue", print.auc = TRUE)
dev.off()
# 6. 特征重要性
importance <- lgb.importance(lgb.model, percentage = TRUE)
# 绘制特征重要性图
jpeg("Results-gbm/feature_importance.jpg", width = 800, height = 600, quality = 100)
lgb.plot.importance(importance, top_n = 10, measure = "Gain")
dev.off()
pdf("Results-gbm/feature_importance.pdf", width = 8, height = 6)
lgb.plot.importance(importance, top_n = 10, measure = "Gain")
dev.off()
# 7. SHAP分析 - 修正后的代码
pdf("Results-gbm/shap_waterfall.pdf", width = 8, height = 6)
sv_waterfall(shap, row_id = 1)
dev.off()
# 8. 保存结果表格
# 模型性能指标
performance_metrics <- data.frame(
指标 = c("准确率", "AUC", "灵敏度", "特异度"),
值 = c(round(accuracy, 4),
round(auc_value, 4),
round(conf_matrix[2,2]/sum(conf_matrix[2,]), 4), # 灵敏度
round(conf_matrix[1,1]/sum(conf_matrix[1,]), 4)) # 特异度
)
# 特征重要性表格
feature_importance_df <- as.data.frame(importance)
write_xlsx(list(
混淆矩阵 = conf_matrix_df,
性能指标 = performance_metrics,
特征重要性 = feature_importance_df
), "Results-gbm/gbm_results.xlsx")
# 9. 生成Word报告
doc <- read_docx()
# 添加标题
doc <- doc %>%
body_add_par("LightGBM模型分析报告", style = "heading 1") %>%
body_add_par(paste0("生成日期: ", Sys.Date()), style = "Normal") %>%
body_add_par(" ", style = "Normal")
# 添加模型摘要
doc <- doc %>%
body_add_par("模型摘要", style = "heading 2") %>%
body_add_par(paste("准确率:", round(accuracy, 4)), style = "Normal") %>%
body_add_par(paste("AUC值:", round(auc_value, 4)), style = "Normal") %>%
body_add_par(paste("最佳迭代次数:", lgb.model$best_iter), style = "Normal") %>%
body_add_par(" ", style = "Normal")
# 添加图片
doc <- doc %>%
body_add_par("ROC曲线", style = "heading 3") %>%
body_add_img("Results-gbm/gbm_roc_curve.jpg", width = 6, height = 4.5) %>%
body_add_par(" ", style = "Normal") %>%
body_add_par("特征重要性", style = "heading 3") %>%
body_add_img("Results-gbm/feature_importance.jpg", width = 6, height = 4.5) %>%
body_add_par(" ", style = "Normal") %>%
body_add_par("SHAP摘要图", style = "heading 3") %>%
body_add_img("Results-gbm/shap_summary.jpg", width = 6, height = 4.5) %>%
body_add_par(" ", style = "Normal") %>%
body_add_par("SHAP Waterfall图", style = "heading 3") %>%
body_add_img("Results-gbm/shap_waterfall.jpg", width = 6, height = 4.5) %>%
body_add_par(" ", style = "Normal")
# 添加性能表格
doc <- doc %>%
body_add_par("性能指标", style = "heading 3") %>%
body_add_flextable(performance_metrics %>%
flextable() %>%
theme_box() %>%
set_caption("模型性能指标")) %>%
body_add_par(" ", style = "Normal")
# 添加特征重要性表格
doc <- doc %>%
body_add_par("特征重要性", style = "heading 3") %>%
body_add_flextable(feature_importance_df %>%
head(10) %>% # 只显示前10个最重要的特征
flextable() %>%
theme_box() %>%
set_caption("特征重要性排名")) %>%
body_add_par(" ", style = "Normal")
# 保存Word文档
print(doc, target = "Results-gbm/gbm_analysis_report.docx")
# 10. 保存工作空间
save.image("Results-gbm/gbm_analysis_workspace.RData")
cat("LightGBM分析完成!所有结果已保存到Results-gbm文件夹中。\n")
- 环境初始化与数据准备:设置工作目录、清理环境,并创建名为"Results-gbm"的结果文件夹;随后读取Excel格式的示例数据(如"示例数据.xlsx"),检查数据结构和结局变量分布,并将结局变量转换为因子类型以确保数据适合建模。
- 数据预处理:通过分层抽样将数据划分为训练集(70%)和测试集(30%),并对非数值型特征(如分类变量)进行编码转换(如标签编码),确保所有特征均为数值型;同时处理缺失值或无限值,转换为0以保持数据完整性。
- 模型训练与优化:使用LightGBM算法设置参数(如目标函数为二元分类、损失函数为binary_logloss、叶子数为31等),训练模型并采用早停法防止过拟合;模型通过训练集进行迭代优化,记录最佳迭代次数。
- 模型评价:在测试集上进行预测,计算准确率、生成混淆矩阵(并推导灵敏度、特异度等指标),绘制ROC曲线并计算AUC值以全面评估分类性能;所有结果以图表形式保存(如JPG和PDF格式)。
- 特征解释性分析:计算特征重要性排名(基于Gain指标),并利用SHAP(SHapley Additive exPlanations)分析进行模型可解释性探索,包括绘制特征重要性图、SHAP摘要图(蜂群图)和单个样本的SHAP waterfall图,以揭示变量对预测的贡献度。
- 结果保存与报告生成:将性能指标、混淆矩阵和特征重要性表格导出为Excel文件;自动化创建Word报告,整合模型摘要、可视化图表(如ROC曲线、SHAP图)和表格,并提供中文字体支持;最终所有输出保存到指定文件夹,包括工作空间图像。
代码通过`pacman`包加载多个专用包,每个包在流程中扮演特定角色:
- pacman:简化包的安装和加载管理,确保依赖包就绪,避免手动检查。
- readxl:读取Excel格式的数据文件(如"示例数据.xlsx"),实现数据导入到R环境。
- writexl:将结果数据(如混淆矩阵、性能指标)导出为Excel文件,便于后续查阅。
- lightgbm:核心机器学习包,提供LightGBM算法实现,包括数据准备(lgb.Dataset)、模型训练(lgb.train)、预测(predict)和特征重要性分析(lgb.importance)。
- pROC:绘制ROC曲线并计算AUC值,评估模型区分能力;通过`roc`和`auc`函数生成可视化图表。
- ggplot2:作为绘图基础包,支持其他包(如DALEX)的可视化功能,但文档中未直接调用其函数。
- DALEX 和 DALEXtra:用于模型解释性分析,但文档中主要依赖shapviz包进行SHAP分析,因此未显式使用。
- officer 和 flextable:生成和格式化Word报告,如添加标题、段落、图片和表格(通过`body_add_par`、`body_add_img`等函数),提升报告可读性。
- shapviz:专门处理SHAP值分析,计算并可视化SHAP贡献(如`shapviz`对象、`sv_importance`和`sv_waterfall`函数),增强模型可解释性。
- caret:提供数据划分工具(`createDataPartition`),实现分层抽样,确保训练集和测试集的代表性。
- 该代码适用于需要高效处理大规模数据或高维特征的二元分类场景,例如在医疗研究中预测疾病结局(如基于指标变量)、金融领域评估客户信用风险,或工业中优化预测模型;LightGBM的高效性和精度使其特别适合大数据环境。
- 自动化流程提高了分析的可重复性和效率,适合快速生成学术论文、商业分析报告或教学演示材料,通过可视化输出(如ROC曲线和SHAP图)提供直观的模型解释。
- 通过集成特征重要性分析和SHAP解释,代码有助于识别关键预测因子,支持决策制定(如变量筛选或模型优化),并为后续研究或部署提供基础(如保存模型和工作空间)。
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,机器学习,生存分析,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!
“医学统计数据分析”公众号右下角;
找到“联系作者”,
可加我微信,邀请入粉丝群!
有临床流行病学数据分析
如(t检验、方差分析、χ2检验、logistic回归)、
(重复测量方差分析与配对T检验、ROC曲线)、
(非参数检验、生存分析、样本含量估计)、
(筛检试验:灵敏度、特异度、约登指数等计算)、
(绘制柱状图、散点图、小提琴图、列线图等)、
机器学习、深度学习、生存分析
等需求的同仁们,加入【临床】粉丝群。
疾控,公卫岗位的同仁,可以加一下【公卫】粉丝群,分享生态学研究、空间分析、时间序列、监测数据分析、时空面板技巧等工作科研自动化内容。
有实验室数据分析需求的同仁们,可以加入【生信】粉丝群,交流NCBI(基因序列)、UniProt(蛋白质)、KEGG(通路)、GEO(公共数据集)等公共数据库、基因组学转录组学蛋白组学代谢组学表型组学等数据分析和可视化内容。
或者可扫码直接加微信进群!!!
精品视频课程-“医学统计数据分析”视频号付费合集
在“医学统计数据分析”视频号-付费合集兑换相应课程后,获取课程理论课PPT、代码、基础数据等相关资料,请大家在【医学统计数据分析】公众号右下角,找到“联系作者”,加我微信后打包发送。感谢您的支持!!
【二分类因变量机器学习】图文教程
往期推荐:【监测预警自动化】系列教程
往期推荐:样本含量估计(样本量计算与功效分析)
往期推荐:SPSS、R语言、Python等临床数据分析专题
往期推荐:科研图表绘制专题
往期推荐:重复测量数据分析专题
往期推荐:生信分析、基因测序数据、实验室数据专题
往期推荐:生存分析及机器学习
往期推荐:时间序列分析
往期推荐:地统计分析-GIS、地图、相关、聚类、回归
往期推荐:科研自动化探究
往期推荐:趣味阅读
统计评书系列

