Ich würde gerne wissen, welches der Abweichungsausdruck in der Poisson-Regression ist, der mit einem xgboostWerkzeug verwendet wird (extreme Gradientenverstärkung).
Laut Quellcode lautet die Auswertungsfunktion:
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;
}
}
Abweichung (in R) sollte also so etwas sein wie:
poisson_deviance <- function(y, py, eps) {
mean(LogGamma(y + 1.0f) + pmax(py, eps) - log(pmax(py, eps)) * y);
}
Ich habe hier zwei Fragen:
1) Wie LogGammain R übersetzen ?. Ich habe mehrere Links gefunden, die 'loggamma' googeln, und es scheint, dass jede Sprache unterschiedliche Ausdrücke für diesen Begriff versteht.
2) Was tun mit Belichtungen? Ich weiß, wir müssen auf xgbMatrix setzen mit:
setinfo(xgbMatrix, "base_margin", log(exposure))
Aber im Code von habe EvalPoissonNegLogLikich den Offset nie wieder gesehen. Was ich also abgezogen habe, ist, dass wir nur das log(exposure)zu den Prädiktoren hinzufügen müssen :
poisson_deviance <- function(y, py, exposure, eps) {
mean(LogGamma(y + 1.0f) + pmax(py + log(exposure), eps) - log(pmax(py +
log(exposure), eps)) * y);
}
Die Abweichungsformel, die vom Gradientenverstärkungs- gbmR-Paket für die Poisson-Regression verwendet wird, lautet:
poisson_deviance <- function(y, py) {mean(y*py - exp(py))}
(verkappte pybei epszu)
Wie Sie auf der letzten Seite dieses Dokuments sehen können :
Ist gbmund xgboostdie gleichen Fehler für poisson Regression? Dieser Ausdruck der Abweichung scheint anders zu sein als das, was in verwendet wird xgboost.
Schließlich sollte die Abweichungsformel in der Poisson-Regression gemäß B.5.3 hier lauten:
2 * mean(y * log(y / py) - (y - py))
das ist eine andere Formel.
Ich würde mich über jede Hilfe freuen, um zu verstehen, warum beides gbmund xgboostandere Abweichungsformulierungen verwendet werden.