2016-07-27 9 views
6

Ich habe ein Modell (fit), basierend auf historischen Informationen bis letzten Monat. Jetzt möchte ich mein Modell für den aktuellen Monat vorhersagen. Wenn ich versuche, den folgenden Code aufzurufen:UseMethod ("predict"): keine anwendbare Methode für 'predict' angewendet auf ein Objekt der Klasse "train"

predicted <- predict(fit, testData[-$Readmit]) 

ich die folgende Fehlermeldung erhalten:

Error in UseMethod("predict") : no applicable method for 'predict' 
    applied to an object of class "train" 

Hinweise: train Funktion von caret:

  1. Das passende Modell, über erstellt wurde Paket, mit zufälligen Wald-Algorithmus
  2. Die predict ist eine generische Funktion, die die spezifische Vorhersagefunktion basierend auf dem ersten Eingabeargument aufruft. In meinem Fall wird es sein:

    >fit$modelInfo$label

    [1] "Random Forest"

daher vorhersagen, das Verfahren wird aufgerufen: predict.randomForest. Weitere Informationen finden Sie in der [Caret-Dokumentation] [3].

Hier ist die Zusammenfassung Quellcode für das Modell zu erzeugen und es den Aufruf:

# 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 ca. 3 Stunden, das ist, warum ich das Objekt für die Wiederverwendung nach dem Speichern Das.

Die Daten aus dem Trainingsmodell als die folgende Struktur festgelegt:

> 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 ... 

jetzt die testData die folgende Struktur haben:

> 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 haben unterschiedliche Ebenen, da einige Variablen neue Werte haben. Zum Beispiel: Acuity im Modell hat 3-Stufen und in den Testdaten 4-Stufen.

Ich habe von vornherein keine Möglichkeit, alle möglichen Ebenen für alle Variablen zu kennen.

Jede Beratung, bitte ...

Vielen Dank im Voraus,

David

+1

'train' ist keine R-Funktion. Sie können die Dokumentation wie '? Library_you_got_it_from :: train' lesen. Sie erwähnen wahrscheinlich dort, ob es eine "Vorhersage" -Methode hat. – Frank

+1

Ist das aus dem 'caret' Paket? – liori

+0

then 'summary (fit)' gibt Ihnen etwas logisch? – abhiieor

Antwort

6

Ich glaube, ich fand, warum dies passiert ist ... Die predict ist eine generische Funktion aus: stats Paket. Ich benutze den Namespace :: -notation für den Aufruf der Funktionen aus dem caret Paket (das ist die Empfehlung zum Erstellen eines Benutzer-Pakete) und die entsprechende predict Funktion von caret Paket ist: predict.train, das ist eine interne Funktion, die nicht von einem aufgerufen werden kann externe Anwendung.Die einzige Möglichkeit, diese Funktion aufzurufen, ist die Verwendung der generischen predict-Funktion aus dem Paket stats, dann basierend auf der Klasse des ersten Eingabearguments: predicted <- predict(fit, testData[-$Readmit]) identifiziert es die bestimmte predict-Funktion wird aufgerufen.

Für diesen speziellen Fall ist die Klasse dieser Funktion train, so würde es tatsächlich die Funktion aufrufen: train.predict von caret Paket. Diese Funktion behandelt auch die spezielle Funktion, die für die Vorhersage auf der Grundlage des verwendeten Algorithmus (Methode) benötigt wird, zum Beispiel: predict.gbm oder predict.glm usw. Sie wird detailliert im Abschnitt documentation des Abschnitts: "5.7 Extrahieren von Vorhersagen und Klassenwahrscheinlichkeiten" erläutert.

Daher funktioniert die :: -notation gut für andere Funktionen im Paket, wie zum Beispiel: caret.train zum Beispiel, aber nicht für diese bestimmte: predict. In solchen Fällen ist es notwendig, die Bibliothek explizit zu laden, so dass sie intern die Funktion predict.train aufrufen kann.

Kurz gesagt wird die Lösung das Hinzufügen nur die folgende Zeile vor der predict Funktion aufruft:

library(caret) 

Dann verschwindet Fehler.

+0

Das gleiche passierte mir mit dem 'biglm' Paket, nachdem ich Caret angehängt hatte, aber nicht' biglm', also + 1. – YCR