Comment le randomForest
package estime-t-il les probabilités de classe lorsque j'utilise predict(model, data, type = "prob")
?
J'utilisais ranger
pour former des forêts aléatoires en utilisant l' probability = T
argument pour prédire les probabilités. ranger
dit 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)
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)
r
random-forest
prediction
Daniel Falbel
la source
la source
prob_real
?Réponses:
C'est juste la proportion de votes des arbres dans l'ensemble.
Alternativement, si vous multipliez vos probabilités par
ntree
, vous obtenez le même résultat, mais maintenant en nombre au lieu de proportions.la source
randomForest
je ne connais pas grand-choseranger
(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.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,
randomForest
avectype="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'
randomForest
exemple ci-dessus peuvent être obtenus avec ranger en utilisant la classification et le calcul manuel des probabilités (utilisationpredict.all=TRUE
dans la prédiction).la source
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?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.
la source