Wie schätzt "predict.randomForest" Klassenwahrscheinlichkeiten?

15

Wie randomForestschätzt das Paket Klassenwahrscheinlichkeiten, wenn ich verwende predict(model, data, type = "prob")?

Ich habe rangerzufällige Gesamtstrukturen mit dem probability = TArgument trainiert , um Wahrscheinlichkeiten vorherzusagen. rangerIn der Dokumentation heißt es:

Bauen Sie einen Wahrscheinlichkeitswald wie in Malley et al. (2012).

Ich habe einige Daten simuliert und beide Pakete ausprobiert und dabei sehr unterschiedliche Ergebnisse erzielt (siehe Code unten).

Bildbeschreibung hier eingeben

Ich weiß also, dass es eine andere Technik (dann Waldläufer) verwendet, um Wahrscheinlichkeiten abzuschätzen. Aber welcher?

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)
Daniel Falbel
quelle
1
Was wäre nur aus Neugier prob_real?
Firebug
1
Die reale Antwortwahrscheinlichkeit. Da dies eine Simulation ist, habe ich dies für jede Beobachtung
Daniel Falbel

Antworten:

17

Es ist nur der Stimmenanteil der Bäume im Ensemble.

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

Wenn Sie alternativ Ihre Wahrscheinlichkeiten mit multiplizieren ntree, erhalten Sie dasselbe Ergebnis, jedoch jetzt in Zählungen anstelle von Anteilen.

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

identical(500*p1,p2)
#[1] TRUE
Firebug
quelle
2
Vielen Dank! Haben Sie eine Idee, warum Stimmenanteil besser ist als Wahrscheinlichkeitswälder? Oder denkst du, das passiert nur für dieses Problem? Siehe diesen Link (auf Portugiesisch)
Daniel Falbel
2
@DanielFalbel Obwohl ich ziemlich vertraut mit randomForestmir bin, weiß ich nicht viel darüber ranger(tatsächlich habe ich es nie benutzt), also wäre ich nicht in der Lage zu antworten, es tut mir leid. Aber es ist eine interessante Frage, vielleicht könnten Sie eine andere Frage dazu stellen, wie sich beide Strategien unterscheiden.
Firebug
6

Der Malley (2012) ist hier verfügbar: http://dx.doi.org/10.3414%2FME00-01-0052 . Eine vollständige Referenz finden Sie im Referenzteil der Ranger-Dokumentation.

Kurz gesagt, jeder Baum sagt Klassenwahrscheinlichkeiten voraus, und diese Wahrscheinlichkeiten werden für die Gesamtstrukturvorhersage gemittelt. Für zwei Klassen entspricht dies einer Regressionsgesamtstruktur für eine 0-1-codierte Antwort.

Im Gegensatz dazu randomForestmit type="prob"jedem Baum sagt eine Klasse und Wahrscheinlichkeiten werden aus diesen Klassen berechnet.

In diesem Beispiel habe ich versucht, die Wahrscheinlichkeiten mithilfe der Gleichverteilung anstelle der Normalverteilung zu generieren, und hier scheint der andere Ansatz eine bessere Leistung zu bringen. Ich frage mich, ob diese Wahrscheinlichkeiten wirklich die Wahrheit sind.

Übrigens randomForestkönnen mit Ranger die gleichen Ergebnisse wie im obigen Beispiel erzielt werden, indem Klassifizierung und manuelle Wahrscheinlichkeitsberechnung verwendet werden (Verwendung predict.all=TRUEbei der Vorhersage).

mnwright
quelle
Sie können sehen, dass dies die Antwortwahrscheinlichkeiten im Simulationscode sind. Schauen Sie sich: Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). Auf diese Weise wird Y erzeugt, wobei X1, X2, ..., X10 summiert werden und dann das Quantil der Normalverteilung mit dem Mittelwert = 5, das die Summe darstellt, erhalten wird. Finden Sie das sinnvoll?
Daniel Falbel
-1

Wenn Sie Out-Of-Bag-Wahrscheinlichkeitsschätzungen wünschen, können Sie dies nur im randomForest-Paket in R unter Verwendung von Modell-$ -Stimmen tun. Die anderen Wahrscheinlichkeitsschätzungen sind nicht OOB.

Max
quelle
Was ist die OOB-Wahrscheinlichkeitsschätzung?
user158565
Es ist eine Out-of-Bag-Wahrscheinlichkeitsschätzung. In einer zufälligen Gesamtstruktur berechnen sie den Anteil der Bäume, die für jede Klasse gestimmt haben, um die Wahrscheinlichkeit zu schätzen, die mit jeder Klasse verbunden ist. Die OOB-Schätzung würde dasselbe tun, aber nur die Stimmen der Bäume zählen, für die die Instanz in ihrem Training nicht verwendet wurde (auch bekannt als die Instanz nicht in der Tasche)
Max