web-dev-qa-db-ja.com

UseMethod( "predict"):クラス "train"のオブジェクトに適用される 'predict'の適用可能なメソッドはありません

先月までの履歴情報に基づいたモデル(fit)があります。ここで、今月のモデルを使用して予測したいと思います。次のコードを呼び出そうとすると:

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

次のエラーが表示されます。

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

注:

  1. フィットモデルは、ランダムフォレストアルゴリズムを使用して、 caret パッケージのtrain関数を介して作成されました。
  2. predictは、最初の入力引数に基づいて特定の予測関数を呼び出す汎用関数です。私の場合、次のようになります。

    >fit$modelInfo$label

    [1] "Random Forest"

したがって、呼び出されるpredictメソッドは predict.randomForest になります。詳細については、[キャレットのドキュメント] [3]を参照してください。

モデルを生成して呼び出すための要約ソースコードを次に示します。

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

:モデルを生成するための実行時間は約3時間です。そのため、オブジェクトを保存してから再利用できます。

次の構造としてのトレーニングモデルのデータセット:

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

これで、testDataは次の構造になります。

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

変数の構造は同じですが、一部の変数には新しい値があるため、一部の因子変数のレベルが異なります。たとえば、モデルのAcuityには3つのレベルがあり、テストデータには4つのレベルがあります。

私は、すべての変数のすべての可能なレベルを知る方法を前もって持っていません。

アドバイスをお願いします...

前もって感謝します、

デビッド

11
David Leal

私はこれがなぜ起こったのか見つけたと思います... predictstatsパッケージからの汎用関数です。名前空間::- notationを使用してcaretパッケージから関数を呼び出し(ユーザーパッケージを作成するための推奨事項)、同等のpredict関数をcaretパッケージから呼び出します:predict.train、これは内部関数であり、外部アプリケーションから呼び出すことはできません。この関数を呼び出す唯一の方法は、predictパッケージの汎用stats関数を使用し、最初の入力引数のクラスに基づいて:predicted <- predict(fit, testData[-$Readmit])特定のpredict関数が呼び出されます。

この特定のケースでは、この関数のクラスはtrainであるため、実際にはcaretパッケージのtrain.predict関数を呼び出します。この関数は、使用されるアルゴリズム(メソッド)に基づいて、予測のために要求された特定の関数も処理します。例:predict.gbmまたはpredict.glmなど。詳細については、キャレット documentation セクション:予測とクラス確率の抽出」。

したがって、::- notationは、パッケージ内の他の関数(たとえば、caret.train)に対してはうまく機能しますが、この特定の関数predictに対してはうまく機能しません。そのような場合、ライブラリを明示的にロードする必要があるため、内部でpredict.train関数を呼び出すことができます。

要するに、解決策はpredict関数を呼び出す前に次の行を追加するだけです。

library(caret)

その後、エラーが消えます。

11
David Leal

@David Lealの回答に基づいて、predict関数を呼び出す前にlibrary(caret)をロードしようとしましたが、役に立ちませんでした。

少し試した後、モデル自体を含むライブラリをロードする必要があることに気付きました。私の場合、サポートベクターのlibrary(kenlab)を呼び出す必要がありました。

3
Nikhil Gupta