XGBoost(eXtreme Gradient Boosting)是一种机器学习算法,XGBoost的核心思想是通过构建一系列有序的决策树来逐步改进模型,每个树都尝试纠正前一个树的错误。这种方法通常可以提高模型的准确性,同时减少过拟合的风险。
(XGBoost 入门指南:从基础概念到实践应用 - 简书 (jianshu.com))
优点:
高效性:训练速度快,适合处理大规模数据
准确性:泛化能力强
灵活性:支持多种任务类型(分类、回归、排序等)
缺点:
参数众多:需要一定的经验或借助自动调参数工具
过拟合风险:复杂数据或数据量较小的情况可能存在过拟合风险
对缺失值敏感:含有大量缺失值的数据需要进行预处理
(深度探索:机器学习XGBoost原理及其应用_xgboost的应用-CSDN博客)
#与随机森林对比:XGBoost通常在准确度上优于随机森林,训练时间可能更长
用途:
疾病预测:XGBoost可以用于构建疾病预测模型,预测患某种慢性疾病的风险
影响因素分析:在流行病学调查中,XGBoost可以用于分析收集的大规模、多维度数据,发现影响健康结果的关键因素
生存分析:XGBoost可以用来构建生存分析模型,帮助确定对特定类型癌症或其他严重健康问题患者进行干预治疗时可能最有效果
暴露预测:Xgboost可以用于某些暴露因素的预测,如大气污染物的浓度、气温等。
R示例:用数据集trainpre1训练xgboost模型用于大气污染物PM2.5的预测
部分数据集trainpre1:
R代码:
#读取R包
library(xgboost);library(dplyr);library(lubridate);library(data.table)
#读取数据
trainpre1<-read.csv("D:\\path\\.csv", header=T, stringsAsFactors = FALSE, fileEncoding = 'GBK')
#划分训练集和测试集
ind <- sample(2, nrow(trainpre1), replace = TRUE, prob = c(0.7, 0.3))
train <- trainpre1[ind == 1, ]
test <- trainpre1[ind == 2, ]
#随机数种子
set.seed(2024)
#训练集数据预处理
library(Matrix)
train1<-data.matrix(train[,-1])
train2<-Matrix(train1,sparse=T)
train_y<-as.numeric(train[,1])
traindata<-list(data=train2,label=train_y)
dtrain<-xgb.DMatrix(data=traindata$data,label=traindata$label)
#测试集数据预处理
test1<-data.matrix(test[,-1])
test2<-Matrix(test1,sparse=T)
test_y<-as.numeric(test[,1])
testdata<-list(data=test2,label=test_y)
dtest<-xgb.DMatrix(data=testdata$data,label=testdata$label)
#建立模型model_xgb <- xgboost(data = dtrain, max_depth = 8, eta = 0.1, nround = 200, objective ='reg:squarederror', lambda = 0.1, alpha = 0.1, colsample_bytree = 0.8)
#max_depth(树的最大深度): 值为正整数,一般在3到10之间。增加该值会增加模型复杂度,并可能导致过拟合,减小该值可以提高模型泛化能力。
#eta(学习率): 值为0到1之间的实数,表示每次迭代中权重的更新幅度。较小的学习率能实现更好的收敛性和泛化能力。
#nround(迭代次数): 值为正整数。增加该值可能会提高模型性能,但也可能导致过拟合。
#objective指定目标函数,'reg:squarederror',表示使用均方误差作为损失函数进行回归建模,用于大多数连续型预测问题,reg:logistic用于二元分类问题
#lambda(L2正则化项权重): 值为非负实数,用于控制模型复杂度。增大提高模型的泛化能力。
#alpha(L1正则化项权重): 值为非负实数,用于控制模型复杂度。增大提高模型的泛化能力。
#colsample_bytree(每棵树使用特征比例): 值为0到1之间的实数,表示每棵树使用的特征比例。增大可能出现过拟合。
#用测试集预测
pre <- predict(model_xgb,newdata=dtest)
#模型评估
summary(pre)
summary(test_y)
模型预测结果可视化:
#画图
#创建数据框
comparison_data <- data.frame(actual = test_y, predicted = pre)
# 计算预测误差
comparison_data$error <- comparison_data$actual - comparison_data$predicted
# 绘制散点图
p1<-ggplot(comparison_data, aes(x = actual, y = predicted)) +
geom_point(color = "#BA55D3",size=1.5) +
geom_abline(intercept = 0, slope = 1, color = "grey20",linewidth=1) +
xlab("PM2.5 Actual Value") +
ylab("PM2.5 Predicted Value") +
ggtitle("Test Set: Actual vs Predicted") +
theme(plot.title = element_text(size = 5))+
theme(text = element_text(family = "Times New Roman",size=5))+theme_bw()+theme(plot.title = element_text(size = 12, hjust = 0, vjust = 1))
p1
p21 = plot(p1, suppressprint=TRUE)
#输出图片
#ggplot2::ggsave("C:\\path\\xgboost-2017-PM2.5.Tiff", plot=p21,width=8, height=6,dpi=800)
#决定系数
r_squared <- 1 - sum((test_y - pre)^2) / sum((test_y - mean(pre))^2)
print(paste("R-squared:", r_squared))
#预测的决定系数(R-squared)为0.95表示模型能够解释因变量中95%的方差。说明这个模型能够很好地拟合观测数据,并用自变量来解释因变量的变化