我目前正在关注以下link中的幻灯片。我在幻灯片121/128上,我想知道如何复制AUC。作者没有解释如何做(也与幻灯片124相同)。其次,在幻灯片125上产生以下代码;

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


我收到以下错误;


  as.matrix(cv.res)[,2]中的错误:下标超出范围


可以从here下载以下代码的数据,我提供了以下代码供您参考。

问题:我如何以作者的身份制作AUC,为什么下标超出范围?

-----代码------

# Kaggle Winning Solutions

train <- 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 other

new.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 bounds

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

cv.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)


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

为了获得最佳迭代:

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)


r - 从R中的xgboost模型绘制AUC-LMLPHP

要获得一个混淆矩阵(假设阈值为0.5概率):

library(caret)
confusionMatrix(ifelse(cv.res$pred <= 0.5, 0, 1), y)
#output
          Reference
Prediction    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,子样本,colsample_bytree,colsample_bylevel等。

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

关于r - 从R中的xgboost模型绘制AUC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46736934/

10-12 21:55