Comment «predire.randomForest» estime-t-il les probabilités de classe?

16

Comment le randomForestpackage estime-t-il les probabilités de classe lorsque j'utilise predict(model, data, type = "prob")?

J'utilisais rangerpour former des forêts aléatoires en utilisant l' probability = Targument pour prédire les probabilités. rangerdit dans la documentation qu'il:

Cultivez une forêt probabiliste comme dans Malley et al. (2012).

J'ai simulé quelques données et essayé les deux packages et obtenu des résultats très différents (voir code ci-dessous)

entrez la description de l'image ici

Je sais donc qu'il utilise une technique différente (alors ranger) pour estimer les probabilités. Mais lequel?

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
la source
1
Par curiosité, ce serait quoi prob_real?
Firebug
1
La probabilité de réponse réelle. Comme il s'agit d'une simulation, je l'ai pour chaque observation
Daniel Falbel

Réponses:

17

C'est juste la proportion de votes des arbres dans l'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

Alternativement, si vous multipliez vos probabilités par ntree, vous obtenez le même résultat, mais maintenant en nombre au lieu de proportions.

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

identical(500*p1,p2)
#[1] TRUE
Pyromane
la source
2
Merci! Savez-vous pourquoi la proportion de votes est meilleure que les forêts probabilistes? Ou pensez-vous que cela se produit uniquement pour ce problème? Voir ce lien (en portugais)
Daniel Falbel
2
@DanielFalbel Bien que je sois assez familier avec, randomForestje ne connais pas grand-chose ranger(en fait, je ne l'ai jamais utilisé), donc je ne serais pas en mesure de répondre, je suis désolé. Mais c'est une question intéressante, peut-être pourriez-vous poser une autre question sur la façon dont les deux stratégies sont différentes.
Firebug
6

The Malley (2012) est disponible ici: http://dx.doi.org/10.3414%2FME00-01-0052 . Une référence complète se trouve dans la partie références de la documentation du ranger.

En bref, chaque arbre prédit les probabilités de classe et ces probabilités sont moyennées pour la prédiction de la forêt. Pour deux classes, cela équivaut à une forêt de régression sur une réponse codée 0-1.

En revanche, randomForestavec type="prob"chaque arbre prédit une classe et les probabilités sont calculées à partir de ces classes.

Dans l'exemple ici, j'ai essayé d'utiliser la distribution uniforme au lieu de la distribution normale pour générer les probabilités, et ici l'autre approche semble mieux fonctionner. Je me demande si ces probabilités sont vraiment la vérité?

Soit dit en passant, les mêmes résultats que dans l' randomForestexemple ci-dessus peuvent être obtenus avec ranger en utilisant la classification et le calcul manuel des probabilités (utilisation predict.all=TRUEdans la prédiction).

mnwright
la source
vous pouvez voir que ce sont les probabilités de réponse dans le code de simulation. Regardez: Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). C'est ainsi que Y est généré, en additionnant X1, X2, ..., X10 et en obtenant ensuite le quantile de la distribution normale avec une moyenne = 5 que la somme représente. Pensez-vous que cela a du sens?
Daniel Falbel
-1

Si vous voulez des estimations de probabilité Out-Of-Bag, vous ne pouvez le faire que dans le package randomForest dans R en utilisant le modèle $ votes. Les autres estimations de probabilité ne sont pas OOB.

Max
la source
quelle est l'estimation de la probabilité OOB?
user158565
Il s'agit d'une estimation de probabilité hors du sac. Dans une forêt aléatoire, une façon d'estimer la probabilité associée à chaque classe est de calculer la proportion des arbres qui ont voté pour chaque classe. L'estimation OOB ferait de même mais ne compterait que les votes de ces arbres que l'instance n'a pas été utilisée dans leur formation (alias l'instance n'était pas dans le sac)
Max