`predict.randomForest`はクラスの確率をどのように推定しますか?


15

randomForestパッケージを使用すると、クラスの確率はどのように推定されますpredict(model, data, type = "prob")か?

確率を予測する引数をranger使用してランダムフォレストをトレーニングするために使用していましたprobability = Trangerドキュメントでそれを言う:

Malleyらのように確率の森を育てます。(2012)。

いくつかのデータをシミュレートし、両方のパッケージを試して、非常に異なる結果を得ました(以下のコードを参照)

ここに画像の説明を入力してください

だから、私はそれが確率を推定するために異なるテクニック(そしてレンジャー)を使用することを知っています。しかし、どれですか?

simulate_data <- function(n){
  X <- data.frame(matrix(runif(n*10), ncol = 10))
  Y <- data.frame(Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>%
                               pnorm(mean = 5)
                             ) %>% 
                    as.factor()

  ) 
  dplyr::bind_cols(X, Y)
}

treino <- simulate_data(10000)
teste <- simulate_data(10000)

library(ranger)
modelo_ranger <- ranger(Y ~., data = treino, 
                                num.trees = 100, 
                                mtry = floor(sqrt(10)), 
                                write.forest = T, 
                                min.node.size = 100, 
                                probability = T
                                )

modelo_randomForest <- randomForest(Y ~., data = treino,
                                    ntree = 100, 
                                    mtry = floor(sqrt(10)),
                                    nodesize = 100
                                    )

pred_ranger <- predict(modelo_ranger, teste)$predictions[,1]
pred_randomForest <- predict(modelo_randomForest, teste, type = "prob")[,2]
prob_real <- apply(teste[,1:10], 1, sum) %>% pnorm(mean = 5)

data.frame(prob_real, pred_ranger, pred_randomForest) %>%
  tidyr::gather(pacote, prob, -prob_real) %>%
  ggplot(aes(x = prob, y = prob_real)) + geom_point(size = 0.1) + facet_wrap(~pacote)

1
好奇心から、何でしょうprob_realか?
Firebug

1
実際の応答確率。これはシミュレーションであるため、観測ごとにこれがあります
ダニエルファルベル

回答:


17

これは、アンサンブルの木の投票の割合です。

library(randomForest)

rf = randomForest(Species~., data = iris, norm.votes = TRUE, proximity = TRUE)
p1 = predict(rf, iris, type = "prob")
p2 = predict(rf, iris, type = "vote", norm.votes = TRUE)

identical(p1,p2)
#[1] TRUE

あるいは、確率をで乗算するとntree、同じ結果が得られますが、比率ではなくカウントになります。

p1 = predict(rf, iris, type = "prob")
p2 = predict(rf, iris, type = "vote", norm.votes = FALSE)

identical(500*p1,p2)
#[1] TRUE

2
ありがとう!投票の割合が確率の森よりも優れている理由はありますか?または、これはこの問題のためだけに起こると思いますか?このリンクを参照(ポルトガル語)
ダニエルファルベル

2
@DanielFalbel私は非常によく知っていますが、randomForest私はあまり知識がありませんranger(実際、私はそれを使用したことはありません)。しかし、これは興味深い質問です。おそらく、両方の戦略の違いについて別の質問をすることができます。
Firebug

6

Malley(2012)は、http//dx.doi.org/10.3414%2FME00-01-0052で入手できます。完全なリファレンスは、レンジャーのドキュメントのリファレンス部分にあります。

つまり、各ツリーはクラス確率を予測し、これらの確率はフォレスト予測のために平均化されます。2つのクラスの場合、これは0-1コード化された応答の回帰フォレストに相当します。

これとは対照的に、中randomForesttype="prob"各ツリークラスを予測した確率は、これらのクラスから計算されます。

ここの例では、確率を生成するために正規分布の代わりに均一分布を使用しようとしましたが、ここでは他のアプローチの方がパフォーマンスが良いようです。これらの確率は本当に真実なのだろうか?

ちなみに、randomForest上記の例と同じ結果は、分類と手動の確率計算(predict.all=TRUE予測で使用)を使用することにより、レンジャーで達成できます。


これらがシミュレーションコードでの応答の確率であることがわかります。見てくださいY = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5))。これがYの生成方法で、X1、X2、...、X10を合計し、合計が表す平均= 5の正規分布の分位数を取得します。これは理にかなっていると思いますか?
ダニエルファルベル16

-1

Out-Of-Bag確率推定が必要な場合は、model $ votesを使用してRのrandomForestパッケージでのみ実行できます。他の確率推定値はOOBではありません。


OOB確率推定とは何ですか?
user158565

バッグの確率の推定値ではありません。ランダムフォレストでは、各クラスに関連付けられた確率を推定する1つの方法は、各クラスに投票したツリーの割合を計算することです。OOBの見積もりでも同じことを行いますが、インスタンスがトレーニングで使用されなかったツリーの投票のみをカウントします(別名インスタンスはインバッグではありませんでした)
最大
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.