 个人信息:酷在前行 版权: 博文由【酷在前行】原创、需要转载请联系博主 如果博文对您有帮助,欢迎点赞、关注、收藏 + 订阅专栏 本文收录于【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/

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: