Desvio de Poisson (xgboost vs gbm vs regressão)

7

Gostaria de saber qual é a expressão de desvio na regressão de Poisson usando a xgboostferramenta (aumento extremo do gradiente).

De acordo com o código fonte, a função de avaliação é:

struct EvalPoissonNegLogLik : public EvalEWiseBase {

const char *Name() const override {

return "poisson-nloglik";

}

inline bst_float EvalRow(bst_float y, bst_float py) const {

const bst_float eps = 1e-16f;

if (py < eps) py = eps;

return common::LogGamma(y + 1.0f) + py - std::log(py) * y;

}

}

Portanto, desvio (em R) deve ser algo como:

poisson_deviance <- function(y, py, eps) {

mean(LogGamma(y + 1.0f) + pmax(py, eps) - log(pmax(py, eps)) * y);

}

Eu tenho duas perguntas aqui:

1) Como traduzir LogGammapara R ?. Encontrei vários links pesquisando 'loggamma' no Google e parece que cada idioma entende expressões diferentes para esse termo.

2) O que fazer com exposições? Eu sei que precisamos definir para xgbMatrix usando:

setinfo(xgbMatrix, "base_margin", log(exposure))

Mas no código de EvalPoissonNegLogLiknunca mais vi o deslocamento, o que deduzi é que o único que precisamos é adicionar os log(exposure)a preditores:

poisson_deviance <- function(y, py, exposure, eps) {

mean(LogGamma(y + 1.0f) + pmax(py + log(exposure), eps) - log(pmax(py + 

log(exposure), eps)) * y);

}

A fórmula de desvio usada pelo gbmpacote R de aumento de gradiente para a regressão de poisson é:

poisson_deviance <- function(y, py) {mean(y*py - exp(py))}

(tapado pypelo epsdemasiado)

Como você pode ver na última página deste documento :

São gbme xgboostusando o mesmo erro de regressão de Poisson? Essa expressão de desvio parece diferente da que é usada xgboost.

Por fim, a fórmula de desvio na regressão de poisson de acordo com B.5.3 aqui deve ser:

2 * mean(y * log(y / py) - (y - py))

essa é outra fórmula diferente.

Agradeço qualquer ajuda para entender por que ambos gbme xgboostusar outra formulação de desvio.

Entalhe
fonte

Respostas:

9

Não está bem documentado, mas examinei o código-fonte do xgboost e determinei o seguinte para a contagem: objetivo de poisson:

  1. Ele usa a probabilidade de Poisson com um link de log.
  2. O base_marginparâmetro está na escala linear, não na escala de resposta. À medida que as rodadas de reforço prosseguem, novas árvores também são adicionadas na escala linear.
  3. A fórmula de probabilidade de log negativo de Poisson xgboost está correta, mas é um pouco diferente do desvio de Poisson. No entanto, a probabilidade e o desvio negativos do log são muito próximos e assintoticamente equivalentes até um fator de 2.
  4. Definir base_margincomo log(exposure)é equivalente a incluir um log(exposure)termo de compensação.

Um pouco mais detalhadamente sobre esses pontos:

LogGamma é o logaritmo da função gama, que é uma extensão contínua do fatorial. Especificamente,Γ(n)=(n-1 1)! para inteiro n. Assim LogGamma(y + 1) = factorial(y),. O termo LogGamma representa oregistro(y!)termo em toda a probabilidade de log de Poisson. (Este termo é normalmente omitido da expressão de probabilidade de log, pois não afeta a otimização.)

De acordo com a aproximação de Stirling, registro(y!)yregistro(y)-y. Substituindo LogGamma por essa aproximação e substituindo py=exp(p)(isto é, substituindo o preditor linear pela média via link de log), obtém-se rendimentos y * log(y / py) - (y - py). Este é quase o desvio padrão de Poisson, exceto pelo fator 2 que está faltando.

A fórmula encontrada para o GBM não é o desvio padrão de Poisson, embora seja a mesma até uma constante aditiva (dependente de y). De maneira confusa, a pyfórmula da GBM na verdade é a previsão da escala linear, não a escala da resposta, enquanto nas outras fórmulas pyé a resposta, a média prevista de y.

Você não precisa adicionar log(exposure)à fórmula objetiva. Tudo que você precisa fazer é definir base_margin=log(exposure). Isso garante que o primeiro termo de soma na série de reforço seja log(exposure). As rodadas de reforço subsequentes adicionam mais termos, mas o deslocamento inicial nunca é removido ou alterado.

Paulo
fonte