Wie trainiere und validiere ich ein neuronales Netzwerkmodell in R?

33

Ich bin neu in der Modellierung mit neuronalen Netzwerken, aber es ist mir gelungen, ein neuronales Netzwerk mit allen verfügbaren Datenpunkten einzurichten, das gut zu den beobachteten Daten passt. Das neuronale Netzwerk wurde in R mit dem nnet-Paket erstellt:

require(nnet)      
##33.8 is the highest value
mynnet.fit <- nnet(DOC/33.80 ~ ., data = MyData, size = 6, decay = 0.1, maxit = 1000)      
mynnet.predict <- predict(mynnet.fit)*33.80  
mean((mynnet.predict - MyData$DOC)^2) ## mean squared error was 16.5      

Die Daten, die ich analysiere, sehen folgendermaßen aus: Der DOC ist die Variable, die modelliert werden muss (es gibt ungefähr 17.000 Beobachtungen):

      Q  GW_level Temp   t_sum   DOC
1 0.045    0.070 12.50     0.2 11.17
2 0.046    0.070 12.61     0.4 11.09
3 0.046    0.068 12.66     2.8 11.16
4 0.047    0.050 12.66     0.4 11.28
5 0.049    0.050 12.55     0.6 11.45
6 0.050    0.048 12.45     0.4 11.48

Jetzt habe ich gelesen, dass das Modell mit 70% der Datenpunkte trainiert und mit den restlichen 30% der Datenpunkte validiert werden sollte. Wie mache ich das? Welche Funktionen muss ich nutzen?

Ich habe die Zugfunktion aus dem Caret-Paket verwendet, um die Parameter für Größe und Verfall zu berechnen.

require(caret)
my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
mynnetfit <- train(DOC/33.80 ~ ., data = MyData, method = "nnet", maxit = 100, tuneGrid = my.grid, trace = f)

Jede direkte Hilfe oder Verknüpfung zu anderen Websites / Posts wird sehr geschätzt.

Strohmi
quelle
6
Tatsächlich ist die Zug / Test-Aufteilungsmethode unterdurchschnittlich, da die Leistung Ihres Algorithmus je nach Wahl des Aufteilungspunkts erheblich variieren kann (ich habe 5% Unterschiede gesehen ...). Eine bessere Methodik ist die gegenseitige Validierung.
John Doucette

Antworten:

36

Das Caret-Handbuch von Max Kuhn - Modellbau ist ein guter Ausgangspunkt.

Ich würde mir vorstellen, dass die Validierungsphase innerhalb des Aufrufs caret train () stattfindet, da hier Ihre Hyperparameter für Zerfall und Größe über Bootstrapping oder einen anderen Ansatz ausgewählt werden, den Sie über den Parameter trControl angeben können. Ich bezeichne den Datensatz, mit dem ich den Fehler des endgültig ausgewählten Modells charakterisiere, als meinen Testsatz. Da Caret die Auswahl von Hyperparametern für Sie erledigt, benötigen Sie nur ein Trainingsset und ein Testset.

Sie können die Funktion createDataPartition () in caret verwenden, um Ihren Datensatz in Trainings- und Testsätze aufzuteilen. Ich habe dies mit dem Prestige-Datensatz aus dem Fahrzeugpaket getestet, der Informationen zum Einkommen in Bezug auf Bildungsstand und berufliches Prestige enthält:

library(car)
library(caret)
trainIndex <- createDataPartition(Prestige$income, p=.7, list=F)
prestige.train <- Prestige[trainIndex, ]
prestige.test <- Prestige[-trainIndex, ]

Die Funktion createDataPartition () scheint etwas falsch zu heißen, da sie die Partition nicht für Sie erstellt, sondern einen Indexvektor bereitstellt, mit dem Sie dann Trainings- und Testsätze erstellen können. Es ist ziemlich einfach, dies mit sample () in R selbst zu tun, aber eine Sache, die createDataPartition () anscheinend tut, ist, aus Faktorebenen heraus zu probieren. Wenn Ihr Ergebnis kategorisch ist, wird die Verteilung außerdem über die Datenpartitionen beibehalten. In diesem Fall ist dies jedoch nicht relevant, da Ihr Ergebnis kontinuierlich ist.

Jetzt können Sie Ihr Modell auf dem Trainingsset trainieren:

my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
prestige.fit <- train(income ~ prestige + education, data = prestige.train,
    method = "nnet", maxit = 1000, tuneGrid = my.grid, trace = F, linout = 1)    

Nebenbei: Ich musste den Linout-Parameter hinzufügen, damit nnet mit einem Regressions- (vs. Klassifikations-) Problem funktioniert. Ansonsten habe ich alle Einsen als vorhergesagte Werte aus dem Modell erhalten.

Anschließend können Sie mithilfe des Testdatensatzes eine Vorhersage für das Anpassungsobjekt aufrufen und den RMSE aus den Ergebnissen berechnen:

prestige.predict <- predict(prestige.fit, newdata = prestige.test)
prestige.rmse <- sqrt(mean((prestige.predict - prestige.test$income)^2)) 
Anne Z.
quelle
Ihr Max Kuhn Link scheint gestorben zu sein.
EngrStudent - Wiedereinsetzung von Monica
Ich habe Max Kuhns Buch gefunden, es ist hier versteckt: feat.engineering
Agile Bean