UseMethod("Vorhersagen") : keine anwendbare Methode für "prognostizieren" angewandt auf ein Objekt der Klasse "Zug"
Habe ich ein Modell (fit
), basierend auf historischen Informationen, bis letzten Monat. Jetzt würde ich mag, um vorherzusagen, mit meinem Modell für den aktuellen Monat. Wenn ich versuche zu aufrufen, den folgenden code:
predicted <- predict(fit, testData[-$Readmit])
Bekomme ich die folgende Fehlermeldung:
Error in UseMethod("predict") : no applicable method for 'predict'
applied to an object of class "train"
Hinweise:
- Das fit-Modell wurde erstellt über:
train
Funktion von caret - Paket, mit random forest Algorithmus -
Den
predict
ist eine generische Funktion, die ruft die spezifische Vorhersage der Funktion basierend auf den ersten input-argument. In meinem Fall ist es:>fit$modelInfo$label
[1] "Random Forest"
Daher die predict-Methode aufgerufen werden: Vorhersagen.randomForest. Siehe [caret Dokumentation][3] weitere info.
Hier die Zusammenfassung Quellcode für die Erzeugung des Modells und die Berufung auf Sie:
# Script-1: create a model:
fit <- train(testData[-$Readmit], testData$Readmit)
saveRDS(fit, modelFileName) # save the fit object into a file
# Script-2: predict
fit <- readRDS(modelFileName) # Load the model (generated previously)
predicted <- predict(fit, testData[-$Readmit])
Hinweis: Die Ausführungszeit für die Erzeugung des Modells beträgt etwa 3 Stunden, das ist, warum ich das Objekt speichern für die Wiederverwendung später.
Den Datensatz aus der Ausbildung Modell, wie die folgende Struktur:
> str(fit$trainingData)
'data.frame': 29955 obs. of 27 variables:
$ Acuity : Factor w/ 3 levels "Elective ","Emergency ",..: 2 2 2 1 1 2 2 2 1 1 ...
$ AgeGroup : Factor w/ 10 levels "100-105","65-70",..: 8 6 9 9 5 4 9 2 3 2 ...
$ IsPriority : int 0 0 0 0 0 0 0 0 0 0 ...
$ QNXTReferToId : int 115 1703712 115 3690 1948 115 109 512 481 1785596 ...
$ QNXTReferFromId : int 1740397 1724801 1711465 1704170 1714272 1731911 1535 1712758 1740614 1760252 ...
$ iscasemanagement : Factor w/ 2 levels "N","Y": 2 1 1 2 2 1 2 1 2 2 ...
$ iseligible : Factor w/ 2 levels "N","Y": 2 2 2 2 2 2 2 2 2 2 ...
$ referralservicecode : Factor w/ 11 levels "12345","278",..: 1 1 1 9 9 1 1 6 9 9 ...
$ IsHighlight : Factor w/ 2 levels "N","Y": 1 1 1 1 1 1 1 1 1 1 ...
$ admittingdiagnosiscode: num 439 786 785 786 428 ...
$ dischargediagnosiscode: num 439 0 296 786 428 ...
$ RealLengthOfStay : int 3 1 6 1 2 3 3 7 3 2 ...
$ QNXTPCPId : int 1740397 1724801 1711465 1704170 1714272 1731911 1535 1712758 1740614 1760252 ...
$ QNXTProgramId : Factor w/ 3 levels "QMXHPQ0839 ",..: 1 1 1 1 1 1 1 1 1 1 ...
$ physicalzipcode : int 33054 33712 33010 33809 33010 33013 33142 33030 33161 33055 ...
$ gender : Factor w/ 2 levels "F","M": 1 1 1 1 2 1 1 2 2 1 ...
$ ethnicitycode : Factor w/ 4 levels "ETHN0001 ",..: 4 4 4 4 4 4 4 4 4 4 ...
$ dx1 : num 439 786 296 786 428 ...
$ dx2 : num 439 292 785 786 428 ...
$ dx3 : num 402 0 250 0 0 ...
$ svc1 : int 0 120 120 762 762 120 120 120 762 762 ...
$ svc2 : int 120 0 0 0 0 0 0 0 0 0 ...
$ svc3 : int 0 0 0 0 0 0 0 0 0 0 ...
$ Disposition : Factor w/ 28 levels "0","APPEAL & GRIEVANCE REVIEW ",..: 11 11 16 11 11 11 11 11 11 11 ...
$ AvgIncome : Factor w/ 10 levels "-1",">100k","0-25k",..: 3 6 3 8 3 4 3 5 4 4 ...
$ CaseManagerNameID : int 124 1 1 19 20 1 16 1 43 20 ...
$ .outcome : Factor w/ 2 levels "NO","YES": 1 2 2 1 1 1 2 2 1 1 ...
nun die testData
haben die folgende Struktur:
> str(testData[-$Readmit])
'data.frame': 610 obs. of 26 variables:
$ Acuity : Factor w/ 4 levels "0","Elective ",..: 3 2 4 2 2 2 4 3 3 3 ...
$ AgeGroup : Factor w/ 9 levels "100-105","65-70",..: 4 3 5 4 2 9 4 2 4 6 ...
$ IsPriority : int 0 0 0 0 0 0 1 1 1 1 ...
$ QNXTReferToId : int 2140 482 1703785 1941 114 1714905 1703785 98 109 109 ...
$ QNXTReferFromId : int 1791383 1729375 1718532 1746336 1718267 1718267 1718532 98 109 109 ...
$ iscasemanagement : Factor w/ 2 levels "N","Y": 2 2 2 2 2 2 1 2 2 1 ...
$ iseligible : Factor w/ 2 levels "N","Y": 2 2 2 2 2 2 2 2 2 2 ...
$ referralservicecode : Factor w/ 7 levels "12345","IPMAT ",..: 5 1 1 1 1 1 1 5 1 5 ...
$ IsHighlight : Factor w/ 2 levels "N","Y": 1 1 1 1 1 1 1 1 1 1 ...
$ admittingdiagnosiscode: num 11440 11317 11420 11317 1361 ...
$ dischargediagnosiscode: num 11440 11317 11420 11317 1361 ...
$ RealLengthOfStay : int 1 2 4 3 1 1 16 1 1 3 ...
$ QNXTPCPId : int 3212 1713678 1738430 1713671 1720569 1791640 1725962 1148 1703290 1705009 ...
$ QNXTProgramId : Factor w/ 2 levels "QMXHPQ0839 ",..: 1 1 1 1 1 1 1 1 1 1 ...
$ physicalzipcode : int 34744 33175 33844 33178 33010 33010 33897 33126 33127 33125 ...
$ gender : Factor w/ 2 levels "F","M": 2 1 2 1 2 2 2 1 1 2 ...
$ ethnicitycode : Factor w/ 1 level "No Ethnicity ": 1 1 1 1 1 1 1 1 1 1 ...
$ dx1 : num 11440 11317 11420 11317 1361 ...
$ dx2 : num 11440 11317 11420 11317 1361 ...
$ dx3 : num 0 1465 0 11326 0 ...
$ svc1 : int 52648 27447 50040 27447 55866 55866 51595 0 99221 300616 ...
$ svc2 : int 76872 120 50391 120 120 38571 120 762 120 0 ...
$ svc3 : int 762 0 120 0 0 51999 0 0 0 762 ...
$ Disposition : Factor w/ 14 levels "0","DENIED- Not Medically Necessary ",..: 3 5 3 4 3 3 5 3 3 5 ...
$ AvgIncome : Factor w/ 10 levels "-1",">100k","0-25k",..: 6 7 5 9 3 3 6 4 3 4 ...
$ CaseManagerNameID : int 1 2 3 4 5 6 7 8 9 7 ...
Die variable Struktur ist die gleiche, nur, dass einige Faktor-Variablen hat unterschiedliche Ebenen, weil einige Variablen neue Werte. Zum Beispiel: Acuity
im Modell hat 3 Ebenen und in den Testdaten 4-Ebenen.
Habe ich nicht aus vorab ein Weg zu wissen, alle möglichen level für alle Variablen.
Einen Rat, bitte...
Vielen Dank im Voraus,
David
train
ist nicht eine R-Funktion. Lesen Sie die Dokumentation, wie?library_you_got_it_from::train
. Sie wohl schweigen, ob es einepredict
Methode.- Ist das aus der
caret
Paket? - tun
summary(fit)
gibt Ihnen etwas logisches? - Ich fügte hinzu, mehr detail in der original-post auf der Grundlage der vorherigen Kommentare durch ( @loiri @Frank und @ abhiieor ). @ abhiieor die Ausgabe von str(fit) bieten zu viele Informationen, ich bekam von ihm die Trainings-Daten-Struktur über:
fit$trainingData
. Die nur andere aus diesem und anderen Beispielen, die ich verwende ist auch, dass ich das speichern der variable laden und die test-set kommt aus eine neue Datei (es ist nicht Teil des Zuges eingestellt), aber mit der gleichen Datenstruktur (aber nicht möglich, alle gleichen Werte oder Pegel). Ich weiß nicht, ob dies im Zusammenhang mit meinem problem. danke. - Nur die ersten @ - Namen in einen Kommentar bekommt angepingt, fyi.
- Ich vergaß hinzuzufügen, die Bibliothek caret-Zeichen im Quellcode. Das löst den ursprünglichen Fehler und generiert diese:
Error in predict.randomForest(modelFit, newdata, type = "prob") : New factor levels not present in the training data
diesem Punkt für den Verdacht, ich habe im Zusammenhang mit den Ebenen. Nun Suche in Stackoverflow über dieses neue Fehler, die ich gefunden habe, dieses link als mögliche Lösung für diese neue Nachricht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, ich fand, warum dieses passiert ist...Die
predict
ist eine generische Funktion aus:stats
Paket. Ich verwenden den namespace::
-notation für den Aufruf der Funktionen aus dercaret
Paket (das ist die Empfehlung für die Erstellung einer user-packages) und den entsprechendenpredict
Funktion voncaret
Paket ist:predict.train
, das ist eine interne Funktion, die nicht aufgerufen werden kann durch eine externe Anwendung. Der einzige Weg, um die Funktion aufzurufen, ist die Verwendung der generischenpredict
Funktion vonstats
- Paket, basierend auf der Klasse des ersten input-argument:predicted <- predict(fit, testData[-$Readmit])
identifiziert es den bestimmtenpredict
Funktion aufgerufen wird.Für diesen speziellen Fall die Klasse dieser Funktion ist
train
, so würde es rufen tatsächlich die Funktion:train.predict
auscaret
Paket. Auch diese Funktion übernimmt die spezielle Funktion angefordert, die für die Vorhersage basiert auf dem Algorithmus (Methode), die verwendet werden, zum Beispiel:predict.gbm
oderpredict.glm
usw. Es wird erklärt, im detail, in der caret - Dokumentation Abschnitt: "5.7 Gewinnung von Vorhersagen und Wahrscheinlichkeiten Klasse".Daher die
::
-notation funktioniert auch für andere Funktionen in dem Paket enthalten, wie:caret.train
zum Beispiel, aber nicht für diesen einen:predict
. In solchen Fällen ist es notwendig, explizit laden der Bibliothek, so dass es intern aufrufen kannpredict.train
Funktion.Kurz gesagt, die Lösung ist nur das hinzufügen der folgenden Zeile vor dem Aufruf der
predict
Funktion:Dann der Fehler verschwindet.
biglm
Paket, nachdem Sie angebracht caret-Zeichen aber nichtbiglm
, also + 1.Basiert auf der Antwort von @David Leal, ich habe versucht, laden
library(caret)
vor dem Aufruf der predict-Funktion, aber es hat nicht geholfen.Nach dem Versuch ein wenig, ich erkannte, dass ich hatte, um das laden der Bibliothek, enthält das Modell selbst. In meinem Fall, ich musste anrufen
library(kenlab)
für Support-Vektoren.