2016-07-09 20 views
1

Ich verwende den R-Wrapper für XGBoost. In der Funktion xgb.cv, ein Parameter ist folds mit der BeschreibungWie benutzerdefinierte Kreuzvalidierung mit XGBoost verwendet wird

Liste eine Möglichkeit der Verwendung einer Liste von vordefinierten CV liefert Falten (jedes Element muß ein Vektor der Falte der Indizes sein). Wenn die Falten geliefert werden, werden die nfold und stratifizierten Parameter ignoriert.

Also, gebe ich nur die Indizes für das Training des Modells an und nehme an, der Rest wird zum Testen sein? Zum Beispiel ist, wenn meine Trainingsdaten so etwas wie

Feature1 Feature2 Target 
1:  2  10  10 
2:  7  1  9 
3:  8  2  3 
4:  8  10  7 
5:  8  2  9 
6:  3  7  3 

und ich möchte Validate überqueren mit (Zug, Test) Indizes ((1,2,3), (4,5,6)) und ((4,5,6), (1,2,3)) setze ich folds=list(c(1,2,3), c(4,5,6))?

+0

Einen 'caret :: createFolds 'oder' caret :: createDataPartition' würde die harte Arbeit für Sie erledigen. Ihr Beispiel ist wahrscheinlich richtig. –

Antwort

0

Durch ein paar Versuche und Fehler habe ich herausgefunden, dass xgboost die übergebenen Indizes als Indizes der Test Falten verwendet. Dies wurde bestätigt, indem die aktuelle Entwicklungsversion von xgboost explizit in der documentation angegeben wird.

1

Hier ist ein Beispiel für das Erstellen der Falten und deren Verwendung.

In unserem Datenrahmen haben wir eine Spalte von IDs, so dass wir alle Zeilen mit einem bestimmten ID-Wert in einer Falte setzen möchten.

Der folgende Code

  • findet die eindeutigen IDs
  • eine Liste für die Falze
  • iteriert über IDs zuweist, Listen von Zeilenindizes schaffen, die

    fold.ids <- unique(df$id) custom.folds <- vector("list", length(fold.ids)) i <- 1 for(id in fold.ids){ custom.folds[[i]] <- which(df$id %in% id) i <- i+1 }

überein

Hier ist ein Beispiel für die oben fold Liste in xgb.cv

res <- xgb.cv(param, dtrain, nround, folds=custom.folds, prediction = TRUE)

Vernünftige Werte für andere xgb.cv Parameter können mit Hilfe seines found in the documentation

1

Das funktionierte für mich am besten:

custom.folds <- caret::createFolds(data$Label, k=10, list=T) 

xgbcv <- xgb.cv(
    params = params 
    ,data = df 
    ,maximize = F 
    ,prediction = T 
    ,metrics = "logloss" 
    ,folds = custom.folds 
) 
Verwandte Themen