2017-10-13 6 views
0

Ich befolge derzeit die Folien von der folgenden link. Ich bin auf Folie 121/128 und würde gerne wissen, wie man die AUC repliziert. Der Autor hat nicht erklärt, wie man das macht (das gleiche auch auf Folie 124). Zweitens wird auf Folie 125 der folgende Code erzeugt;Plotten der AUC von einem xgboost Modell in R

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

Ich erhalte den folgenden Fehler;

Fehler in as.matrix (cv.res) [2]: Index

außerhalb der Grenzen

Die Daten für den folgenden Code aus here und ich habe den Code erzeugt heruntergeladen werden für deine Referenz

Frage: Wie kann ich die AUC als Autor erstellen und warum ist der Index außerhalb der Grenzen?

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

Plot die AUC Graph hier

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) 

Hier ist der Bruch in dem Code, den ich über kommen

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

Antwort

1

Viele Teile des Codes h wenig Sinn für mich ave aber hier ist ein minimales Beispiel für ein Modell mit den zur Verfügung gestellten Daten Aufbau:

Daten:

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

Modell:

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

Kreuzvalidierung Vorhersagen zu erhalten, man angeben muss prediction = T beim Aufruf xgb.cv.

beste Iteration zu erhalten:

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

auf den Kreuzvalidierungsergebnisse ROC-Kurve zu zeichnen:

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

enter image description here

eine Konfusionsmatrix zu erhalten (unter der Annahme von 0,5 prob ist die Schwelle):

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 

Davon abgesehen man die Hyperparameter mit Kreuzvalidierung wie eta, gamma, lambda, Unterabtast, colsample_bytree, colsample_bylevel usw. darauf abzielen soll

abzustimmen

Der einfachste Weg, um eine Rastersuche zu konstruieren ist, wo man expand.grid verwenden auf alle Kombinationen von Hyper-Parametern und verwenden Sie plattformübergreifend mit xgb.cv als Teil der benutzerdefinierten Funktion). Wenn Sie mehr Details benötigen, bitte Kommentar.

+0

Vielen Dank die AUC-Plot funktioniert. "Um Kreuzvalidierungsvorhersagen zu erhalten, muss beim Aufruf von xgb.cv die Vorhersage = T angegeben werden", wo ich falsch lag. – user113156

+0

Ein weiterer Punkt, den ich gerne wiederholen möchte, war auf Folie 121/128: "Wir können den AUC-Trend bei Trainings- und Testsets sehen." Wie kann ich das auf dem Testgerät replizieren? und was ist der Zweck, dies auf dem Test-Set zu replizieren? – user113156

+0

@ user113156 Es gibt viel mehr zum Training xgboost Modelle als dies. Und Menschen haben Präferenzen in der Art, wie sie Dinge tun. Im Allgemeinen werden Hyperparameter, Datentransformationen, Aufwärts-/Abwärtsabtastung, Variablenauswahl, Wahrscheinlichkeitsschwellenoptimierung, Kostenfunktionsauswahl während der Kreuzvalidierung durchgeführt. Normalerweise nicht nur eine Wiederholung von CV, sondern zum Beispiel 5 Wiederholungen von 3-4 facher CV. Und wenn Sie das Beste aus all diesen Dingen herausholen, trainieren Sie ein Modell mit allen Zugdaten und validieren auf dem Testset. Dies alles wird getan, um eine Überanpassung zu vermeiden. – missuse