个人信息:酷在前行 版权: 博文由【酷在前行】原创、需要转载请联系博主 如果博文对您有帮助,欢迎点赞、关注、收藏 + 订阅专栏 本文收录于【R模型】,该专栏主要介绍R语言各类型机器学习,如线性回归模型、广义线性模型、混合线性模型、随机森林模型、支持向量机模型、决策树模型等。请大家多多关注点赞和支持,共同进步~ 欢迎大家订阅!
文章目录
一、xgboost简介 二、xgboost的R语言过程 1、加载相关R包 2、加载数据集 諾 3、划分训练集和测试集 4、拟合模型 5、模型预测及ROC曲线 6、计算MAE评估模型
三、附上所有代码
xgboost是机器学习中的一种技术,已被证明可以产生具有高预测精度的模型。在实践中实现增强的最常见方法之一是使用
XGBoost ,这是
“极端梯度增强” 的缩写。
一、xgboost简介
xgboost是Boost(提升)算法家族中的一员,Boost根本思想在于通过多个简单的弱分类器,构建出准确率很高的强分类器。简单地来说,Boost(提升)就是指每一步我都产生一个弱预测模型,通过加权累加到总模型中,可以用于回归和分类问题。如果每一步的弱预测模型生成都是依据损失函数的梯度方向,则称之为梯度提升(Gradient boosting),这样若干步以后就可以达到逼近损失函数局部最小值的目标。
boosting集成学习,由多个相关联的决策树联合决策,什么叫相关联,举个例子,有一个样本[数据->标签]是[(2,4,5)-> 4],第一棵决策树用这个样本训练得预测为3.3,那么第二棵决策树训练时的输入,这个样本就变成了[(2,4,5)-> 0.7],也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关。其中,0.7是模型预测和样本标记的差,称为残差。我们每次要学习的目标是上次学习的残差,直到残差小到满足我们的要求或其他终止条件。这个残差就是一个加预测值后能得真实值的累加量。
上面的例子,如果第二次直接预测得到0.7,并不一定好,因为每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。换句话说我们思想不完全信任每一个棵残差树,我们认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,只有通过多学几棵树才能弥补不足。
举一个简单的例子,同样使用年龄进行分枝,假设我们A的真实年龄是18岁,但第一棵树的预测年龄是12岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁……以此类推学习下去
与之对比的是random forest(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有关系。
本文主要与大家分享xgboost预测时间序列数据的案例
二、xgboost的R语言过程
1、加载相关R包
先加载R包和查看对应函数
# 安装R包
library(xgboost) #用于拟合xgboost模型
library(caret) #用于一般的数据准备和模型拟合
library(openxlsx) #读取xlsx格式的数据
library(pROC) #制作ROC曲线
2、加载数据集
#加载数据
train <- read.xlsx("training2.xlsx", 1)
test <- read.xlsx("test2.xlsx", 1)
#查看数据结构
str(train)
str(test)
这个数据集包含12个预测变量,我们将用它们来预测一个响应变量Y,它是一个分类数据(0 or 1)。 训练集包含837行和13列;测试集包含20行13列。
諾 3、划分训练集和测试集
接下来,我们将使用caret包中的createdatpartition()函数将原始数据集划分为训练集和测试集。在本例中,我们选择使用原始数据集的80%作为训练集的一部分。注意,xgboost包也使用矩阵数据,因此我们将使用data.matrix()函数来保存预测变量。
#让这个例子可重现
set.seed(20230320)
#分为训练集(80%)和测试集(20%)
parts = createDataPartition(train$Y, p = .8, list = F)
train1 = train[parts, ]
test1 = train[-parts, ]
#在训练集中定义预测变量和响应变量
train_x = data.matrix(train1[, -13])
train_y = train1[,13]
#在测试集中定义预测变量和响应变量
test_x = data.matrix(test1[, -13])
test_y = test1[, 13]
#定义最终的训练集和测试集
xgb_train = xgb.DMatrix(data = train_x, label = train_y)
xgb_test = xgb.DMatrix(data = test_x, label = test_y)
4、拟合模型
接下来,我们将使用xgb.train()函数拟合XGBoost模型,它显示了每一轮boosting的训练和测试RMSE(均方根误差)。注意,本例中我们选择使用70轮,但对于更大的数据集,使用数百甚至数千轮并不罕见。请记住,轮数越多,运行时间越长。还要注意,max.depth参数指定了每棵决策树的深度。我们通常选择相当低的数字,如2或3,以便种植较小的树。研究表明,这种方法倾向于产生更精确的模型。
#定义观察名单中
watchlist = list(train=xgb_train, test=xgb_test)
#拟合XGBoost模型并在每轮显示训练和测试数据
model = xgb.train(data = xgb_train, max.depth = 3, watchlist=watchlist, nrounds = 70)
从输出可以看出,在56轮时达到了最小的测试RMSE。超过这一点,测试RMSE实际上开始增加,这是我们过度拟合训练数据的迹象。因此,我们将最终的XGBoost模型定义为56轮:
#定义最终模型
final = xgboost(data = xgb_train, max.depth = 3, nrounds = 56, verbose = 0)
注意:参数verbose = 0告诉R不要显示每一轮的训练和测试错误。
5、模型预测及ROC曲线
#混淆矩阵
pre_xgb = round(predict(model, newdata = xgb_test))
tab = table(test_y,pre_xgb,dnn=c("true","pre"))
#预测的准确率
caret::confusionMatrix(tab)
#ROC曲线
xgboost_roc <- roc(test_y,as.numeric(pre_xgb))
xgboost_roc
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='ROC curve')
6、计算MAE评估模型
最后,我们可以使用最终的提升模型来预测测试集中Y的中位数。 然后,我们将计算模型的以下精度指标:
MSE:均方误差 MAE:平均绝对误差 RMSE:均方根误差
#计算模型的误差
mean((test_y - pre_xgb)^2) #mse
caret::MAE(test_y, pre_xgb) #mae
caret::RMSE(test_y, pre_xgb) #rmse
三、附上所有代码
# 安装R包
library(xgboost) #用于拟合xgboost模型
library(caret) #用于一般的数据准备和模型拟合
library(openxlsx) #读取xlsx格式的数据
library(pROC) #制作ROC曲线
#加载数据
train <- read.xlsx("training2.xlsx", 1)
test <- read.xlsx("test2.xlsx", 1)
#查看数据结构
str(train)
str(test)
#让这个例子可重现
set.seed(20230320)
#分为训练集(80%)和测试集(20%)
parts = createDataPartition(train$Y, p = .8, list = F)
train1 = train[parts, ]
test1 = train[-parts, ]
#在训练集中定义预测变量和响应变量
train_x = data.matrix(train1[, -13])
train_y = train1[,13]
#在测试集中定义预测变量和响应变量
test_x = data.matrix(test1[, -13])
test_y = test1[, 13]
#定义最终的训练集和测试集
xgb_train = xgb.DMatrix(data = train_x, label = train_y)
xgb_test = xgb.DMatrix(data = test_x, label = test_y)
#定义观察名单中
watchlist = list(train=xgb_train, test=xgb_test)
#拟合XGBoost模型并在每轮显示训练和测试数据
model = xgb.train(data = xgb_train, max.depth = 3, watchlist=watchlist, nrounds = 70)
#定义最终模型
final = xgboost(data = xgb_train, max.depth = 3, nrounds = 56, verbose = 0)
#混淆矩阵
pre_xgb = round(predict(model, newdata = xgb_test))
tab = table(test_y,pre_xgb,dnn=c("true","pre"))
#预测的准确率
caret::confusionMatrix(tab)
#ROC曲线
xgboost_roc <- roc(test_y,as.numeric(pre_xgb))
xgboost_roc
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='ROC curve')
#计算模型的误差
mean((test_y - pre_xgb)^2) #mse
caret::MAE(test_y, pre_xgb) #mae
caret::RMSE(test_y, pre_xgb) #rmse
#在测试数据中预测Y
test_x1 = data.matrix(test[, -13])
pre_Y <- round(predict(model, newdata = test_x1))
pre_Y
test$`Y-Prediction` <- pre_Y
write.csv(test, "test.csv", row.names = T)
参考文献:https://www.statology.org/xgboost-in-r/
好文链接
发表评论