2016-07-27 11 views
6

Mam model (fit), oparty na informacjach historycznych do zeszłego miesiąca. Teraz chciałbym przewidzieć, używając mojego modelu na bieżący miesiąc. Kiedy próbuję wywołać następujący kod:UseMethod ("predict"): brak stosowanej metody "predict" zastosowanej do obiektu klasy "train"

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

pojawia się następujący błąd:

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

Uwagi:

  1. Pasowanie model został stworzony przez: train funkcji z caret pakiet, przy użyciu losowego algorytmu lasu
  2. predict jest funkcją ogólną, która wywoła określoną funkcję przewidywania na podstawie pierwszego argumentu wejściowego. W moim przypadku będzie to:

    >fit$modelInfo$label

    [1] "Random Forest"

Dlatego przewidywania metody wywoływane będą: predict.randomForest. Aby uzyskać więcej informacji, patrz [dokumentacja caret] [3].

Oto kod podsumowanie źródło generowania modelu i powołując go:

# 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]) 

Uwaga: czas realizacji do generowania modelu wynosi około 3 godzin, czyli dlaczego zapisać obiekt do ponownego użycia po że.

Zestaw danych z modelu szkolenia jako następującą 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 ... 

teraz testData będzie miała następującą 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 ... 

Zmienna struktura jest taka sama, tylko że niektóre czynnikiem zmienne mają różne poziomy, ponieważ niektóre zmienne mają nowe wartości. Na przykład: Acuity w modelu ma 3 poziomy, aw danych testowych 4 poziomy.

Nie mam od początku sposobu na poznanie wszystkich możliwych poziomów dla wszystkich zmiennych.

Wszelkie porady, proszę ...

Dzięki z góry,

David

+1

'train' nie jest funkcją R. Możesz przeczytać jego dokumentację, np. '? Library_you_got_it_from :: train'. Prawdopodobnie wspominają tam, czy ma metodę "przewidywania". – Frank

+1

Czy to z pakietu 'caret'? – liori

+0

czy 'summary (fit)' daje ci coś logicznego? – abhiieor

Odpowiedz

6

Chyba znalazłem dlaczego tak się stało ... The predict jest rodzajowy funkcja od: stats opakowaniu. Używam przestrzeni nazw :: -notacja do wywoływania funkcji z pakietu caret (to jest zalecenie do tworzenia pakietów użytkownika), a równoważna funkcja predict z pakietu caret to: predict.train, która jest funkcją wewnętrzną, której nie można wywołać aplikacja zewnętrzna.Jedynym sposobem wywołania tej funkcji jest użycie ogólnej funkcji predict z pakietu stats, a następnie na podstawie klasy pierwszego argumentu wejściowego: predicted <- predict(fit, testData[-$Readmit]) określa ona konkretną funkcję predict, która zostanie wywołana.

W tym konkretnym przypadku klasą tej funkcji jest train, więc wywołałoby to faktycznie funkcję: train.predict z pakietu caret. Ta funkcja obsługuje również konkretną funkcję wymaganą do przewidywania na podstawie zastosowanego algorytmu (metody), na przykład: predict.gbm lub predict.glm itd. Szczegółowo wyjaśniono to w sekcji o numerze documentation: "5.7 Wyodrębnianie przewidywań i prawdopodobieństw klasowych".

Dlatego też notatka :: działa dobrze dla innych funkcji w pakiecie, na przykład: caret.train, ale nie dla tej konkretnej: predict. W takich przypadkach konieczne jest jawne załadowanie biblioteki, aby wewnętrznie mogła wywołać funkcję predict.train.

Krótko mówiąc, rozwiązanie jest po prostu dodając następującą linię przed wywołaniem funkcji predict:

library(caret) 

Potem znika błąd.

+0

To samo przydarzyło mi się z pakietem 'biglm', po podłączeniu karetki, ale nie' biglm', więc + 1. – YCR

Powiązane problemy