2017-10-13 10 views
0

Je suis actuellement les diapositives du link suivant. Je suis sur la diapositive 121/128 et j'aimerais savoir comment reproduire l'AUC. L'auteur n'a pas expliqué comment le faire (le même sur la diapositive 124 également). Deuxièmement, sur la diapositive 125, le code suivant est produit;Tracer l'AUC à partir d'un modèle xgboost dans R

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

Je reçois l'erreur suivante;

Erreur dans as.matrix (cv.res) [2]: hors limites indice

Les données pour le code suivant peut être téléchargé à partir here et j'ai produit le code ci-dessous pour ta référence. Question: Comment puis-je produire l'AUC en tant qu'auteur et pourquoi l'indice est-il hors limite?

----- ------ code

# 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') 

Tracer la courbe AUC ici

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) 

Voici la pause dans le code que je tombe sur

#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) 

Répondre

1

Plusieurs parties du code h ave peu de sens pour moi, mais voici un exemple minimal de la construction d'un modèle avec les données fournies:

données:

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

Modèle:

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

Pour obtenir des prévisions de validation croisée, il faut spécifier prediction = T lors de l'appel xgb.cv.

Pour obtenir la meilleure itération:

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

pour tracer la courbe ROC sur les résultats de validation croisée:

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

enter image description here

Pour obtenir une matrice de confusion (en supposant 0,5 prob est le seuil):

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 

Cela étant dit il faut viser à régler les hyper-paramètres avec validation croisée tels que êta, gamma, lambda, sous-échantillon, colsample_bytree, colsample_bylevel etc.

La façon la plus simple est de construire une recherche de grille où vous utilisez expand.grid sur toutes les combinaisons d'hyper-paramètres et utilisez la lapply sur la grille avec xgb.cv dans le cadre de la fonction personnalisée). Si vous avez besoin de plus de détails s'il vous plaît commenter.

+0

Merci à l'intrigue AUC travaillé. "Pour obtenir des prédictions de validation croisée, il faut spécifier la prédiction = T lors de l'appel de xgb.cv" était l'endroit où je me trompais. – user113156

+0

Un autre point que je voudrais essayer de reproduire était sur la diapositive 121/128 l'auteur déclare "Nous pouvons voir la tendance de l'AUC sur les ensembles d'entraînement et de test." Comment puis-je répliquer cela sur l'ensemble de test? et quel est le but de répliquer ceci sur l'ensemble de test? – user113156

+0

@ user113156 Il y a beaucoup plus à faire pour entraîner les modèles xgboost. Et les gens ont des préférences dans la façon dont ils font les choses. Généralement, les paramètres hyper, les transformations de données, l'échantillonnage haut/bas, la sélection de variables, l'optimisation du seuil de probabilité, la sélection de la fonction de coût sont effectués lors de la validation croisée. Habituellement, pas seulement une répétition de CV, mais par exemple 5 répétitions de CV 3-4 fois. Et quand vous prenez le meilleur ensemble de toutes ces choses, vous formez un modèle avec toutes les données de train et validez sur l'ensemble de test. Tout est fait pour éviter le sur-ajustement. – missuse