欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

树模型系列之六:基于R语言的xgboost+LR实现方法及案例

程序员文章站 2024-03-22 08:23:22
...

本文主要介绍如何利用Xgboost+LR构建分类模型,基于真实案例用R语言来实现该算法。


一、算法原理

Xgboost可以用来构造新特征变量,而LR则可以把原始特征和新特征集合起来构造模型,并计算各特征的显著性和权重系数。

树模型系列之六:基于R语言的xgboost+LR实现方法及案例


二、利用R构造Xgboost模型

原始数据,数据框格式,8个自变量,1个因变量,训练集共200万+数据,测试集90万+数据。

树模型系列之六:基于R语言的xgboost+LR实现方法及案例

# 利用xgboost包的xgb.create.features构造新特征变量
library(xgboost)

traindata1 <- data.matrix(traindata[,c(1:8)]) # 将自变量转化为矩阵
library(Matrix)
traindata2 <- Matrix(traindata1,sparse=T) # 利用Matrix函数,将sparse参数设置为TRUE,转化为稀疏矩阵
traindata3 <- as.numeric(as.character(traindata[,9])) # 将因变量转化为numeric
traindata4 <- list(data=traindata2,label=traindata3) # 将自变量和因变量拼接为list
dtrain <- xgb.DMatrix(data = traindata4$data, label = traindata4$label) # 构造模型需要的xgb.DMatrix对象,处理对象为稀疏矩阵

testset1 <- data.matrix(testset[,c(1:8)]) # 将自变量转化为矩阵
testset2 <- Matrix(testset1,sparse=T) # 利用Matrix函数,将sparse参数设置为TRUE,转化为稀疏矩阵
testset3 <- as.numeric(as.character(testset[,9])) # 将因变量转化为numeric
testset4 <- list(data=testset2,label=testset3) # 将自变量和因变量拼接为list
dtest <- xgb.DMatrix(data = testset4$data, label = testset4$label) # 构造模型需要的xgb.DMatrix对象,处理对象为稀疏矩阵

param <- list(max_depth=2, eta=1, silent=1, objective='binary:logistic') # 定义模型参数
nround = 4

bst = xgb.train(params = param, data = dtrain, nrounds = nround, nthread = 2) # 构造xgboost模型

new.features.train <- xgb.create.features(model = bst, traindata4$data) # 生成xgboost构造的新特征组合,训练集
new.features.test <- xgb.create.features(model = bst, testset4$data) # 生成xgboost构造的新特征组合,测试集

newdtrain <- as.data.frame(as.matrix(new.features.train)) # 将训练集的特征组合转化为dataframe格式
newdtest <- as.data.frame(as.matrix(new.features.test)) # 将测试集的特征组合转化为dataframe格式

newtraindata <- cbind(newdtrain,backflag1=traindata$backflag) # 将训练集的自变量和因变量合并
newtestdata <- cbind(newdtest,backflag1=testset$backflag) # 将测试集的自变量和因变量合并

model <- xgb.dump(bst,with_stats = T) # 显示计算过程,查看树结构
model 
names <- dimnames(data.matrix(traindata[,c(1:8)]))[[2]] # 获取特征的真实名称
importance_matrix <- xgb.importance(names,model=bst) # 计算变量重要性
xgb.plot.importance(importance_matrix[,])


模型共构造了4颗树,其中一棵树的树结构如下图所示。



树模型系列之六:基于R语言的xgboost+LR实现方法及案例

Xgboost模型构造了13个新特征变量,第一个数字代表第几棵树,第二个数字代表叶子节点。

树模型系列之六:基于R语言的xgboost+LR实现方法及案例

# 第一次构造LR模型 
fit <- glm(y ~ .,newtraindata, family=binomial())
summary(fit)

# 第二次构造LR模型,剔除P值大于0.05的变量
fit <- glm(y ~ x1 + x3 + x4 + x5 + x6 + x7 + x8 + V13 + V15 + V24 + V25 + V26 + V34 + V35 + V36 + V44 + V46, newtraindata, family=binomial())
summary(fit)

最终入选变量如下所示:

树模型系列之六:基于R语言的xgboost+LR实现方法及案例


# 对训练集进行预测
pred <- predict(fit,newtraindata,type='response') # 选定type为response则返回响应变量的预测概率,值在0-1之间
pred <- data.frame(predict(fit,newtraindata,type='response'))

# 计算ROC,方法一
library(pROC)
xgb_lr.train.modelroc <- roc(newtraindata$backflag1, pred)
plot(xgb_lr.train.modelroc,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)

# 计算ROC,方法二
library(ROCR)
predict <- prediction(pred$predict.fit..newtraindata.,newtraindata$backflag1)
pref <- performance(predict,"tpr","fpr")
plot(pref,colorize=T)

# 计算AUC
auc <- performance(predict, measure = "auc")
auc <- aaa@qq.com[[1]]
auc


计算出来测试集的ROC图如下所示,AUC值为0.814。训练集的ROC和AUC同理可得。
树模型系列之六:基于R语言的xgboost+LR实现方法及案例


# 计算混淆矩阵
confusion <- data.frame(pred)
confusion$pred <- ifelse(confusion$pred>0.5,1,0)
xgb_lr.train.result <- table(newtraindata$backflag1, confusion$pred)
xgb_lr.train.result

# 计算准确率
(xgb_lr.train.result[1,1]+xgb_lr.train.result[2,2])/nrow(newtraindata)

# 训练集精确度、召回率
xgb_lr.train.result[2,2]/(xgb_lr.train.result[1,2]+xgb_lr.train.result[2,2]) # 精确度
xgb_lr.train.result[2,2]/(xgb_lr.train.result[2,1]+xgb_lr.train.result[2,2]) # 召回率

# 测试集精确度、召回率
xgb_lr.test.result[2,2]/(xgb_lr.test.result[1,2]+xgb_lr.test.result[2,2]) # 精确度
xgb_lr.test.result[2,2]/(xgb_lr.test.result[2,1]+xgb_lr.test.result[2,2]) # 召回率

根据混淆矩阵,计算模型训练集的准确率为77.68%,精确度为80.17%,召回率为78.96%。