我想知道使用 byxgboost
工具(极端梯度提升)在泊松回归中哪个是偏差表达式。
根据源码,评价函数为:
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;
}
}
所以偏差(在R中)应该是这样的:
poisson_deviance <- function(y, py, eps) {
mean(LogGamma(y + 1.0f) + pmax(py, eps) - log(pmax(py, eps)) * y);
}
我在这里有两个问题:
1)如何翻译LogGamma
成R?我发现几个链接谷歌搜索'loggamma',似乎每种语言都理解这个术语的不同表达。
2)如何处理曝光?我知道我们需要设置为 xgbMatrix 使用:
setinfo(xgbMatrix, "base_margin", log(exposure))
但是在EvalPoissonNegLogLik
我再也没有看到偏移量的代码中,所以我推断出我们唯一需要的是添加log(exposure)
到预测器:
poisson_deviance <- function(y, py, exposure, eps) {
mean(LogGamma(y + 1.0f) + pmax(py + log(exposure), eps) - log(pmax(py +
log(exposure), eps)) * y);
}
梯度提升gbm
R 包用于泊松回归的偏差公式为:
poisson_deviance <- function(y, py) {mean(y*py - exp(py))}
py
(也有上限eps
)
正如您在本文档的最后一页中看到的:
泊松回归是否使用相同的错误gbm
?xgboost
这种偏差的表达似乎与 中使用的不同xgboost
。
最后,这里根据 B.5.3 的泊松回归中的偏差公式 应该是:
2 * mean(y * log(y / py) - (y - py))
那是其他不同的公式。
我将不胜感激任何帮助以了解两者的原因gbm
并xgboost
使用其他偏差公式。