k-fache Kreuzvalidierung für Random Forest

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

Mia89
Beiträge: 15
Registriert: Sa Mär 30, 2019 12:39 pm

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von Mia89 »

Vielen Dank schonmal für deine Hilfe.
Ich denke auch, dass es wohl mit den x und y zusammenhängt.
Ich versuche mal weiter dem Fehler auf den Grund zu gehen, da die Fehlermeldung weiterhin Bestand hat.
Mia89
Beiträge: 15
Registriert: Sa Mär 30, 2019 12:39 pm

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von Mia89 »

Ich habe jetzt versucht für jeden Tuningparameter und die Folds eine eigene for- Schleife zu erstellen und für die Tuningparameter einen Vektor erstellt.
In jeder Schleife würde ich gerne ein Element aus dem Vektor verwenden, kann mir jemand zeigen wie ich diesen Code baue?
Damit n.tree einmal 200, einmal 500 usw. und bei mtry das gleiche
So hätte ich es mal gemacht.

Code: Alles auswählen


set.seed(1234)
training$folds = 
  sample(1:10,nrow(training), replace=TRUE)
  
#Erstelle Vektor für n.trees

n.trees <- c("200", "500", "600")

#Schleife für n.trees
output<- character(0)
for(k in n.trees){
  output<- c(output, toupper(n.trees))
  
}
print(output)

#Erstelle Vektor für mtry

mtry <- c("2", "4", "6", "8")

#Schleife für n.trees
output<- character(0)
for(p in mtry){
  output<- c(output, toupper(mtry))
  
}
print(output)

#Schleife für folds
set.seed(1234)

for(i in 1:10){
  validation_indices <- which(training$folds == i, arr.ind = TRUE)
  validation_data <-data.train[validation_indices,]
  training_data <- data.train[-validation_indices,]

  new.rf <-randomForest(x= training_data,
                        y=as.factor(training.mt.y)
                       ,n.trees = n.trees[k]
                       , mtry = mtry[p]
                        , importance = TRUE
                        , do.trace = 20) 
                        
  new.pred <- predict(new.rf1,validation_data )
  
                        }
auc(roc(training$new.pred.1, training$class))                     
}
plot(roc(training$new.pred.1, training$class))  
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von jogo »

Hallo Mia,

der Vektor n.trees hat 3 Elemente und der Vektor mtry hat 4 Elemente. Müsstest Du dann den Schleifenkörper nicht 12-mal abarbeiten?

Gruß, Jörg
p.s.:
wenn ich mich nicht verguckt habe, stimmt etwas mit der Paarigkeit der geschweiften Klammern nicht in Deinem Code.
Außerdem verwendest Du die Parameter ntree= und mtry= falsch beim Aufruf von randomForest(); in der Dokumentation heißt es:
ntree
Number of trees to grow. This should not be set to too small a number, to ensure
that every input row gets predicted at least a few times.
mtry
Number of variables randomly sampled as candidates at each split.

Wenn möglich sollte man die automatische Typanpassung (coercing) nicht in Anspruch nehmen - ansonsten kann es einige Überraschungen geben.
Mia89
Beiträge: 15
Registriert: Sa Mär 30, 2019 12:39 pm

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von Mia89 »

Hallo Jörg, ja also ich hätte dann im ersten Schritt ja 3x4 Ergebnisse, also insgesamt 12. ja wahrscheinlich muss ich ihn dann 12 mal durchlaufen lassen oder?
Aber wie stelle ich das ein, dass jede Kombination einmal dran kommt?
Ok das kann gut sein mit der Paarigkeit, da muss ich wieder drüber schauen.
Komme einfach nicht weiter mit dem code...
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von jogo »

Hallo Mia,

da mir die Daten fehlen, kann ich mich nur um den Teil des Codes kümmern, den ich auch entschlüsseln kann. Hauptsächlich behandelt mein folgender Vorschlag den Umgang mit den verschiedenen Kombinationen der Parameter n.trees= und mtry=. Einige andere Kleinigkeiten habe ich weggelassen.
Das sieht dann so aus:

Code: Alles auswählen

set.seed(1234)

Params <- expand.grid(n.trees=c(200, 500, 600), mtry=seq(2, 8, by=2))
training$folds <- sample(1:nrow(Params), nrow(training), replace=TRUE)

#Schleife für folds
set.seed(1234)

for(i in 1:nrow(Params)) {
  validation_indices <- which(training$folds == i, arr.ind = TRUE)
  validation_data    <- data.train[validation_indices,]
  training_data      <- data.train[-validation_indices,]
  
  new.rf <-randomForest(x= training_data, y=as.factor(training.mt.y),
                n.trees=Params$n.trees[i], mtry=Params$mtry[i], importance=TRUE, do.trace=20)
  # ...
}
Gruß, Jörg
Mia89
Beiträge: 15
Registriert: Sa Mär 30, 2019 12:39 pm

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von Mia89 »

Hallo Jörg,

vielen Dank für den Teil des Codes. Kannst du mir vielleicht erklären, was hier die "=2" bedeuten?

Code: Alles auswählen

 mtry=seq(2, 8, by=2))
Ich habe den Teil mal in den gesamten Code gebaut, bekomme aber immer noch den Fehler

Code: Alles auswählen

Fehler in randomForest.default(x = training_data, y = as.factor(training.mt.y),  : 
  length of response must be the same as predictors
, ich denke dahinter verbirgt sich schonmal der größte Fehler in meinem Code. Aber ich verstehe nicht so ganz wieso.

Und würde ich dann theoretisch den Code 12 mal wiederholen insgesamt? oder müsste ich dann jedes mal nochmal was ändern in dem Code?
Dann müsste ich ja auch nach jeder Runde meinen Wert abspeichern, und am Ende einen Durchschnitt über alle Folds bilden oder?
Aber auch für das Speichern und den AUC als Evaluationsmaß habe ich Probleme im Code.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von jogo »

Hallo Mia,
Mia89 hat geschrieben: Mi Apr 03, 2019 5:33 pm Kannst du mir vielleicht erklären, was hier die "=2" bedeuten?

Code: Alles auswählen

 mtry=seq(2, 8, by=2))
das kann der Hilfetext der Funktion seq() recht gut erklären ... und einfach mal alleine laufen lassen:

Code: Alles auswählen

seq(2, 8, by=2)
... und an den Parametern drehen.
Ich habe den Teil mal in den gesamten Code gebaut, bekomme aber immer noch den Fehler

Code: Alles auswählen

Fehler in randomForest.default(x = training_data, y = as.factor(training.mt.y),  : 
  length of response must be the same as predictors
, ich denke dahinter verbirgt sich schonmal der größte Fehler in meinem Code. Aber ich verstehe nicht so ganz wieso.
Den Teil konnte ich nicht beackern. Dazu bräuchte ich die Daten.
Und würde ich dann theoretisch den Code 12 mal wiederholen insgesamt? oder müsste ich dann jedes mal nochmal was ändern in dem Code?
Zur Zeit wird der Schleifenköper so oft durchlaufen wie es Zeilen im Dataframe Params gibt:

Code: Alles auswählen

for(i in 1:nrow(Params))
Bei jedem Durchlauf werden die Parameter aus der i-ten Zeile des Dataframes verwendet. Schau Dir den Dataframe an:

Code: Alles auswählen

Params
Dann müsste ich ja auch nach jeder Runde meinen Wert abspeichern, und am Ende einen Durchschnitt über alle Folds bilden oder?
Aber auch für das Speichern und den AUC als Evaluationsmaß habe ich Probleme im Code.
Alles, was Du nach dem Aufruf von randomForest() noch machen möchtest (z.B. das Speichern von Ergebnissen), hatte ich durch die Zeile

Code: Alles auswählen

# ...
angedeutet.

Gruß, Jörg
Mia89
Beiträge: 15
Registriert: Sa Mär 30, 2019 12:39 pm

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von Mia89 »

Hallo Jörg,

vielen Dank für deine Hilfe!!
Das mit seq() und auch mit den Durchlaufen habe ich jetzt verstanden :D .
Bei dem anderen Fehler, der mit dem Datensatz zusammenhängt muss ich selbst noch etwas austesten.

Nur noch eine Frage, ist es notwendig die Werte abzuspeichern? Und mache ich das dann nach jeder Runde oder wie macht man das?

Gruß,
Mia
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von jogo »

Hallo Mia,
Mia89 hat geschrieben: Do Apr 04, 2019 11:00 am Das mit seq() und auch mit den Durchlaufen habe ich jetzt verstanden :D .
sehr schön. :mrgreen:
Nur noch eine Frage, ist es notwendig die Werte abzuspeichern? Und mache ich das dann nach jeder Runde oder wie macht man das?
Also für mich musst Du keine Werte speichern - das soll heißen, Du musst wissen, ob Du etwas von den Werten pro Schleifendurchlauf benötigst für weitere Berechnungen.
Die Art und Weise, wie man die Werte speichert, hängt davon ab, was das für Werte sind (einzelne Zahl pro Durchlauf oder Matrix oder strukturierte Liste oder ein Mix verschiedener Objekte).

Gruß, Jörg
Mia89
Beiträge: 15
Registriert: Sa Mär 30, 2019 12:39 pm

Re: k-fache Kreuzvalidierung für Random Forest

Beitrag von Mia89 »

Ohje gut, ich dachte irgendwie nachdem ich die Vorhersage auf dem ausgelassenen Fold validiert habe, müsste ich den Wert abspeichern.
Weil ich den Vorgang so oft wiederholen müsste wie ich Folds habe, damit jeder Fold einmal Validierungsset war und ich dann am Ende den Durchschnitt pro Parameterkombination bilden will, damit ich meine optimalen Parameter festlegen kann.

Da scheitert es aber noch bei der Umsetzung in R.
Antworten