Gostaria de saber qual é a expressão de desvio na regressão de Poisson usando a xgboost
ferramenta (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 LogGamma
para 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 EvalPoissonNegLogLik
nunca 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 gbm
pacote R de aumento de gradiente para a regressão de poisson é:
poisson_deviance <- function(y, py) {mean(y*py - exp(py))}
(tapado py
pelo eps
demasiado)
Como você pode ver na última página deste documento :
São gbm
e xgboost
usando 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 gbm
e xgboost
usar outra formulação de desvio.