web-dev-qa-db-ja.com

RでrandomForestパッケージを使用して、分類モデルから確率を取得する方法は?

TL; DR:

オリジナルにフラグを立てることができるものはありますかrandomForest必要のない呼び出し再実行predictありそうなカテゴリだけでなく、予測されたカテゴリ確率を取得する関数

詳細:

randomForest パッケージを使用しています。

私は次のようなモデルを持っています:

model <- randomForest(x=out.data[train.rows, feature.cols],
                      y=out.data[train.rows, response.col],
                      xtest=out.data[test.rows, feature.cols],
                      ytest=out.data[test.rows, response.col],
                      importance= TRUE)

どこ out.dataはデータフレームで、feature.cols数値的特徴とカテゴリー的特徴の混合、response.colTRUE/FALSEバイナリ変数で、factorモデルがカテゴリカルとして適切に扱うようにrandomForestに強制しました。

すべて正常に実行され、変数modelが適切に返されます。ただし、randomForest関数に渡すフラグまたはパラメーターが見つからないため、modelprobabilitiesで返されます=of TRUEまたはFALSE。代わりに、単純に予測値を取得します。つまり、model$predicted、次のようなものが表示されます。

FALSE
FALSE
TRUE
TRUE
FALSE
.
.
.

代わりに、私は次のようなものを見たいです:

   FALSE  TRUE
1  0.84   0.16
2  0.66   0.34
3  0.11   0.89
4  0.17   0.83
5  0.92   0.08
.   .      .
.   .      .
.   .      .

上記を取得できますが、そのためには次のようなことをする必要があります。

tmp <- predict(model, out.data[test.rows, feature.cols], "prob")

[test.rowsは、モデルのテスト中に使用された行の行番号をキャプチャします。詳細はここには示されていませんが、テスト行IDがmodelに出力されるため単純です。

その後、すべてが正常に動作します。 問題は、モデルが大きく、実行に非常に長い時間がかかることです。予測自体にも時間がかかります。予測shouldはまったく不要であるため(テストデータセットのROC曲線を計算したいだけです。計算)、このステップをスキップしたいと考えていました。 オリジナルにフラグを立てることができるものはありますかrandomForest必要のない呼び出し再実行]predictfunction?

19
Mike Williamson

_model$predicted_は[〜#〜] not [〜#〜]predict()によって返されるものと同じものです。 TRUEまたはFALSEクラスの確率が必要な場合は、predict()を実行するか、_x,y,xtest,ytest_を渡す必要があります

_randomForest(x,y,xtest=x,ytest=y), 
_

ここで_x=out.data[, feature.cols], y=out.data[, response.col]_。

_model$predicted_は、各レコードの_model$votes_の値が大きいクラスに基づいてクラスを返します。 votesは、@ joranが指摘したように、ランダムフォレストからのOOB(out of bag)「投票」の割合であり、投票はOOBサンプルでレコードが選択されたときにのみカウントされます。一方、predict()は、すべてのツリーによる投票に基づいて、各クラスの真の確率を返します。

randomForest(x,y,xtest=x,ytest=y)関数の使用は、上記の例のように、式または単にrandomForest(x,y)を渡す場合とは少し異なります。 randomForest(x,y,xtest=x,ytest=y)は各クラスの確率を返します。これは少し奇妙に聞こえるかもしれませんが、_model$test$votes_の下にあり、予測クラスは_model$test$predicted_の下にあります。どのクラスの_model$test$votes_の値が大きいか。また、randomForest(x,y,xtest=x,ytest=y)を使用する場合、_model$predicted_および_model$votes_の定義は上記と同じです。

最後に、randomForest(x,y,xtest=x,ytest=y)を使用する場合、predict()関数を使用するには、keep.forestフラグをTRUEに設定する必要があります。

_model=randomForest(x,y,xtest=x,ytest=y,keep.forest=TRUE). 
prob=predict(model,x,type="prob")
_

prob[〜#〜] will [〜#〜]テストデータ入力は両方ともxであるため、_model$test$votes_と同等です。

25
Oscar