2016-04-21 9 views
0

Ich habe verschiedene neuronale Netzwerkpakete innerhalb des Caret Pakets für meine Vorhersagen verwendet. Code mit nnet Paket verwendet wird, istBerechne Vorhersageintervalle eines vorhergesagten Wertes unter Verwendung des Caret-Pakets von R

library(caret) 
    # training model using nnet method 
    data <- na.omit(data) 
    xtrain <- data[,c("temperature","prevday1","prevday2","prev_instant1","prev_instant2","prev_2_hour")] 
    ytrain <- data$power 
    train_model <- train(x = xtrain, y = ytrain, method = "nnet", linout=TRUE, na.action = na.exclude,trace=FALSE) 
    # prediction using training model created 
    pred_ob <- predict(train_model, newdata=dframe,type="raw") 

Die einfach vorhersagen Funktion berechnet den Vorhersagewert. Aber ich brauche auch Vorhersageintervalle (2-Sigma). Beim Suchen fand ich eine relevante Antwort unter stackoverflow Link, aber dies ergibt sich nicht wie benötigt. Die Lösung schlägt finalModel Variable als

predict(train_model$finalModel, newdata=dframe, interval = "confidence",type=raw) 

Gibt es eine andere Art und Weise Intervalle zu berechnen Vorhersage zu benutzen? Die Trainingsdaten verwendet, ist die dput() meiner vorherigen Frage auf stackoverflow link und die dput() meiner Vorhersage Datenrahmen (Testdaten) ist

dframe <- structure(list(temperature = 27, prevday1 = 1607.69296666667, 
    prevday2 = 1766.18103333333, prev_instant1 = 1717.19306666667, 
    prev_instant2 = 1577.168915, prev_2_hour = 1370.14983583333), .Names = c("temperature", 
"prevday1", "prevday2", "prev_instant1", "prev_instant2", "prev_2_hour" 
), class = "data.frame", row.names = c(NA, -1L)) 

****************** ********** UPDATE ***********************

Ich verwendete nnetpredint Paket wie vorgeschlagen bei link. Zu meiner Überraschung führt dies zu einem Fehler, den ich nur schwer beheben kann. Hier ist meine aktualisierte Code bis jetzt,

library(nnetpredint) 
nnetPredInt(train_model, xTrain = xtrain, yTrain = ytrain,newData = dframe) 

Es ergibt sich folgende Fehler:

Error: Number of observations for xTrain, yTrain, yFit are not the same 
[1] 0 

Ich kann überprüfen, ob xtrain, ytrain und dframe mit korrekten Abmessungen sind, aber ich habe keine Ahnung, über yFit. Ich brauche das nicht nach den Beispielen nnetpredint Vignette

Antwort

2

Vielen Dank für Ihre Frage. Und eine einfache Antwort auf Ihr Problem ist: Im Moment unterstützt die nnetPredInt Funktion nur die folgenden S3-Objekt, "nnet", "nn" und "rsnns", von verschiedenen neuronalen Netzwerk-Pakete produziert. Und die Zugfunktion im Caret-Paket gibt einen "Zug" Objekt zurück. Aus diesem Grund erhält die Funktion nnetPredInt nicht die yFit-Vektoren, die den angepassten Wert der Trainingsdatensätze darstellen, aus Ihrem train_model.

1.Kurze Art und Weise das Modell aus caret Paket zu verwenden: Holen Sie sich das finalModel Ergebnis aus dem ‚Zug‘ Objekt:

nnetObj = train_model$finalModel # return the 'nnet' model which the caret package has found. 
    yPredInt = nnetPredInt(nnetObj, xTrain = xtrain, yTrain = ytrain,newData = dframe) 

Verwenden Sie zum Beispiel die Iris Dataset und die ‚nnet‘ Methode von caret Paket für Regressions Vorhersage.

library(caret) 
    library(nnetpredint) 
    # Setosa 0 and Versicolor 1 
    ird <- data.frame(rbind(iris3[,,1], iris3[,,2]), species = c(rep(0, 50), rep(1, 50))) 
    samp = sample(1:100, 80) 
    xtrain = ird[samp,][1:4] 
    ytrain = ird[samp,]$species 
    # Training 
    train_model <- train(x = xtrain, y = ytrain, method = "nnet", linout = FALSE, na.action = na.exclude,trace=FALSE) 
    class(train_model) # [1] "train" 

    nnetObj = train_model$finalModel 
    class(nnetObj) # [1] "nnet.formula" "nnet" 

    # Constructing Prediction Interval 
    xtest = ird[-samp,][1:4] 
    ytest = ird[-samp,]$species 
    yPredInt = nnetPredInt(nnetObj, xTrain = xtrain, yTrain = ytrain,newData = xtest) 

    # Compare Results: ytest and yPredInt 
    ytest 
    yPredInt 

2. Hard Way

Verwenden Sie die generische nnetPredInt Funktion alle neuronalen Netz spezifischen Parameter an die Funktion zu übergeben:

nnetPredInt(object = NULL, xTrain, yTrain, yFit, node, wts, newData,alpha = 0.05 , lambda = 0.5, funName = 'sigmoid', ...) 

    xTrain # Training Dataset 
    yTrain # Training Target Value 
    yFit # Fitted Value of the training data 

    node # Structure of your network, like c(4,5,5,1) 
    wts # Specific order of weights parameters found by your neural network 
    newData # New Data for prediction 

Tipps: Gerade jetzt nnetpredint Paket nur unterstützen die Standard-Multilayer-Neuralnetz-Regression mit aktiviertem Ausgang, nicht die lineare Ausgabe, Und es wird bald mehr Arten von Modellen in der Zukunft unterstützen.

0

Sie können die nnetPredInt Funktion {Paket: nnetpredint} verwenden. Überprüfen Sie die Hilfeseite der Funktion. here

+0

Ich habe das schon versucht, aber es ergibt sich ein seltsamer Fehler. Ich habe diesen Code in meiner Frage als Update-Abschnitt aktualisiert. –

2

caret generiert keine Vorhersageintervalle; Das beruht auf dem individuellen Paket. Wenn das Paket dies nicht kann, dann können auch die train Objekte nicht. Ich stimme zu, dass nnetPredInt der richtige Weg ist.

Zwei weitere Hinweise:

  • Sie am ehesten Ihr Rechenzentrum und skalieren, wenn Sie nicht bereits haben.
  • Objekt finalModel ist etwas gefährlich, da es keine Ahnung hat, was mit den Daten getan wurde (z. B. Dummy-Variablen, Zentrierung und Skalierung oder andere Vorverarbeitungsmethoden, etc.), bevor es erstellt wurde.

Max

0

Wenn Sie bereit sind, Ihre eigene Implementierung zu schreiben, gibt es eine andere Option. Sie können Prognoseintervalle von einem trainierten Netz mit der gleichen Implementierung erhalten, die Sie für die nichtlineare Standardregression schreiben würden (vorausgesetzt, die Rückwärtsausbreitung wurde für die Schätzung verwendet).

Diese Arbeit geht durch die Methodik und ist ziemlich direkt: http://www.cis.upenn.edu/~ungar/Datamining/Publications/yale.pdf.

Es gibt, wie bei allem, einige Nachteile (im Papier umrissen) zu diesem Ansatz, aber definitiv wissenswert als eine Option.

Verwandte Themen