Como usar R gbm com distribution = “adaboost”?

9

A documentação afirma que R gbm com distribution = "adaboost" pode ser usado para o problema de classificação 0-1. Considere o seguinte fragmento de código:

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

Pode ser encontrado na documentação que prevê.gbm

Retorna um vetor de previsões. Por padrão, as previsões estão na escala de f (x).

No entanto, a escala específica não é clara para o caso de distribuição = "adaboost".

Alguém poderia ajudar com a interpretação de predict.gbm retornar valores e fornecer uma idéia de conversão para a saída 0-1?

Alexey Lakhno
fonte
Esta pergunta parece ser apenas sobre como interpretar a saída R, e não sobre os problemas estatísticos relacionados (embora isso não a torne um Q ruim). Como tal, é melhor perguntar, e provavelmente responder, no Stack Overflow , em vez de aqui. Não faça postagens cruzadas (o SE desencoraja fortemente isso). Se você deseja que seu Q seja migrado mais rapidamente, sinalize-o para atenção do moderador.
gung - Restabelece Monica
4
@gung parece ser uma pergunta estatística legítima para mim. O pacote GBM fornece o Deviance usado para o adaboost, mas não está claro para mim o que é f (x) e como voltar a transformar em uma escala de probabilidade (talvez seja necessário usar o dimensionamento de Platt). cran.r-project.org/web/packages/gbm/vignettes/gbm.pdf
B_Miner

Respostas:

11

O método adaboost fornece as previsões em escala de logit. Você pode convertê-lo na saída 0-1:

gbm_predicted<-plogis(2*gbm_predicted)

observe o 2 * dentro do logis

razgon
fonte
10

Você também pode obter diretamente as probabilidades da predict.gbmfunção;

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

A função de link adaboost é descrita aqui . Este exemplo fornece uma descrição detalhada da computação:

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
fonte
y´shovocêeudbe´sEum.df