在R中绘制xgboost模型的AUC

我目前正在按照以下链接中的幻灯片进行学习。我在第121/128页,我想知道如何复制AUC。作者没有解释如何做到这一点(第124页也是如此)。其次,在第125页上,出现了以下代码;

bestRound = which.max(as.matrix(cv.res)[,3]-as.matrix(cv.res)[,4])bestRound

我收到了以下错误;

Error in as.matrix(cv.res)[, 2] : subscript out of bounds

以下代码的数据可以从这里下载,我已经为您提供了下面的代码参考。

问题:我如何像作者一样生成AUC,以及为什么会出现下标越界错误?

—– 代码 ——

# Kaggle Winning Solutionstrain <- read.csv('train.csv', header = TRUE)test <- read.csv('test.csv', header = TRUE)y <- train[, 1]train <- as.matrix(train[, -1])test <- as.matrix(test)train[1, ]#We want to determin who is more influencial than the othernew.train <- cbind(train[, 12:22], train[, 1:11])train = rbind(train, new.train)y <- c(y, 1 - y)x <- rbind(train, test)(dat[,i]+lambda)/(dat[,j]+lambda)A.follow.ratio = calcRatio(x,1,2)A.mention.ratio = calcRatio(x,4,6)A.retweet.ratio = calcRatio(x,5,7)A.follow.post = calcRatio(x,1,8)A.mention.post = calcRatio(x,4,8)A.retweet.post = calcRatio(x,5,8)B.follow.ratio = calcRatio(x,12,13)B.mention.ratio = calcRatio(x,15,17)B.retweet.ratio = calcRatio(x,16,18)B.follow.post = calcRatio(x,12,19)B.mention.post = calcRatio(x,15,19)B.retweet.post = calcRatio(x,16,19)x = cbind(x[,1:11],          A.follow.ratio,A.mention.ratio,A.retweet.ratio,          A.follow.post,A.mention.post,A.retweet.post,          x[,12:22],          B.follow.ratio,B.mention.ratio,B.retweet.ratio,          B.follow.post,B.mention.post,B.retweet.post)AB.diff = x[,1:17]-x[,18:34]x = cbind(x,AB.diff)train = x[1:nrow(train),]test = x[-(1:nrow(train)),]set.seed(1024)cv.res <- xgb.cv(data = train, nfold = 3, label = y, nrounds = 100, verbose = FALSE,                 objective = 'binary:logistic', eval_metric = 'auc')

在这里绘制AUC图

set.seed(1024)cv.res = xgb.cv(data = train, nfold = 3, label = y, nrounds = 3000,                objective='binary:logistic', eval_metric = 'auc',                eta = 0.005, gamma = 1,lambda = 3, nthread = 8,                max_depth = 4, min_child_weight = 1, verbose = F,                subsample = 0.8,colsample_bytree = 0.8)

这是我遇到的代码中断点

#bestRound: -  subscript out of boundsbestRound <- which.max(as.matrix(cv.res)[,3]-as.matrix(cv.res)[,4])bestRoundcv.rescv.res[bestRound,]set.seed(1024) bst <- xgboost(data = train, label = y, nrounds = 3000,                             objective='binary:logistic', eval_metric = 'auc',                             eta = 0.005, gamma = 1,lambda = 3, nthread = 8,                             max_depth = 4, min_child_weight = 1,                             subsample = 0.8,colsample_bytree = 0.8)preds <- predict(bst,test,ntreelimit = bestRound)result <- data.frame(Id = 1:nrow(test), Choice = preds)write.csv(result,'submission.csv',quote=FALSE,row.names=FALSE)

回答:

代码的许多部分对我来说意义不大,但这里是一个使用提供的数据构建模型的最小示例:

数据:

train <- read.csv('train.csv', header = TRUE)y <- train[, 1]train <- as.matrix(train[, -1])

模型:

library(xgboost)cv.res <- xgb.cv(data = train, nfold = 3, label = y, nrounds = 100, verbose = FALSE,                 objective = 'binary:logistic', eval_metric = 'auc', prediction = T)

要获得交叉验证预测,必须在调用xgb.cv时指定prediction = T

要获得最佳迭代次数:

it = which.max(cv.res$evaluation_log$test_auc_mean)best.iter = cv.res$evaluation_log$iter[it]

要在交叉验证结果上绘制ROC曲线:

library(pROC)plot(pROC::roc(response = y,               predictor = cv.res$pred,               levels=c(0, 1)),     lwd=1.5) 

enter image description here

要获得混淆矩阵(假设0.5的概率是阈值):

library(caret)confusionMatrix(ifelse(cv.res$pred <= 0.5, 0, 1), y)#output          ReferencePrediction    0    1         0 2020  638         1  678 2164               Accuracy : 0.7607                          95% CI : (0.7492, 0.772)    No Information Rate : 0.5095             P-Value [Acc > NIR] : <2e-16                           Kappa : 0.5212          Mcnemar's Test P-Value : 0.2823                     Sensitivity : 0.7487                     Specificity : 0.7723                  Pos Pred Value : 0.7600                  Neg Pred Value : 0.7614                      Prevalence : 0.4905                  Detection Rate : 0.3673            Detection Prevalence : 0.4833               Balanced Accuracy : 0.7605                'Positive' Class : 0 

尽管如此,应该通过交叉验证来调整超参数,如eta、gamma、lambda、subsample、colsample_bytree、colsample_bylevel等。

最简单的方法是构建一个网格搜索,您可以对所有超参数组合使用expand.grid,并在网格上使用lapply,将xgb.cv作为自定义函数的一部分。如果您需要更多详细信息,请评论。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注