Comment utiliser R gbm avec distribution = “adaboost”?

9

La documentation indique que R gbm avec distribution = "adaboost" peut être utilisé pour un problème de classification 0-1. Considérez le fragment de code suivant:

gbm_algorithm <- gbm(y ~ ., data = train_dataset, distribution = "adaboost", n.trees = 5000)
gbm_predicted <- predict(gbm_algorithm, test_dataset, n.trees = 5000)

Il peut être trouvé dans la documentation que Predict.gbm

Renvoie un vecteur de prédictions. Par défaut, les prédictions sont à l'échelle de f (x).

Cependant l'échelle particulière n'est pas claire pour le cas de distribution = "adaboost".

Quelqu'un pourrait-il aider à l'interprétation des valeurs de retour de Predict.gbm et donner une idée de la conversion en sortie 0-1?

Alexey Lakhno
la source
Cette question semble être uniquement sur la façon d'interpréter la sortie R, et non sur les problèmes statistiques connexes (bien que cela n'en fasse pas un mauvais Q). En tant que tel, il vaut mieux demander, et probablement répondre, sur Stack Overflow , plutôt qu'ici. Veuillez ne pas effectuer de publication croisée (SE déconseille fortement cela), si vous souhaitez que votre Q migre plus rapidement, veuillez le signaler à l'attention du modérateur.
gung - Rétablir Monica
4
@gung me semble être une question statistique légitime. Le paquet GBM fournit la Deviance utilisée pour adaboost mais il n'est pas clair pour moi non plus ce qu'est f (x) et comment retourner la transformation à une échelle de probabilité (peut-être faut-il utiliser la mise à l'échelle Platt). cran.r-project.org/web/packages/gbm/vignettes/gbm.pdf
B_Miner

Réponses:

11

La méthode adaboost donne les prédictions à l'échelle logit. Vous pouvez le convertir en sortie 0-1:

gbm_predicted<-plogis(2*gbm_predicted)

notez le 2 * à l'intérieur du logis

razgon
la source
10

Vous pouvez également obtenir directement les probabilités de la predict.gbmfonction;

predict(gbm_algorithm, test_dataset, n.trees = 5000, type = 'response')
Edwin
la source
3

La fonction de liaison adaboost est décrite ici . Cet exemple fournit une description détaillée du calcul:

library(gbm);
set.seed(123);
n          <- 1000;
sim.df     <- data.frame(x.1 = sample(0:1, n, replace=TRUE), 
                         x.2 = sample(0:1, n,    replace=TRUE));
prob.array <- c(0.9, 0.7, 0.2, 0.8);
df$y       <- rbinom(n, size = 1, prob=prob.array[1+sim.df$x.1+2*sim.df$x.2])
n.trees    <- 10;
shrinkage  <- 0.01;

gbmFit <- gbm(
  formula           = y~.,
  distribution      = "bernoulli",
  data              = sim.df,
  n.trees           = n.trees,
  interaction.depth = 2,
  n.minobsinnode    = 2,
  shrinkage         = shrinkage,
  bag.fraction      = 0.5,
  cv.folds          = 0,
  # verbose         = FALSE
  n.cores           = 1
);

sim.df$logods  <- predict(gbmFit, sim.df, n.trees = n.trees);  #$
sim.df$prob    <- predict(gbmFit, sim.df, n.trees = n.trees, type = 'response');  #$
sim.df$prob.2  <- plogis(predict(gbmFit, sim.df, n.trees = n.trees));  #$
sim.df$logloss <- sim.df$y*log(sim.df$prob) + (1-sim.df$y)*log(1-sim.df$prob);  #$


gbmFit <- gbm(
  formula           = y~.,
  distribution      = "adaboost",
  data              = sim.df,
  n.trees           = n.trees,
  interaction.depth = 2,
  n.minobsinnode    = 2,
  shrinkage         = shrinkage,
  bag.fraction      = 0.5,
  cv.folds          = 0,
  # verbose         = FALSE
  n.cores           = 1
);

sim.df$exp.scale  <- predict(gbmFit, sim.df, n.trees = n.trees);  #$
sim.df$ada.resp   <- predict(gbmFit, sim.df, n.trees = n.trees, type = 'response');  #$
sim.df$ada.resp.2 <- plogis(2*predict(gbmFit, sim.df, n.trees = n.trees));  #$
sim.df$ada.error  <- -exp(-sim.df$y * sim.df$exp.scale);  #$

sim.df[1:20,]
user43392
la source
y´shoulbe´sjem.F