Poisson-Abweichung (xgboost vs gbm vs Regression)

7

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.

Jag
quelle

Antworten:

9

Es ist nicht gut dokumentiert, aber ich habe den Quellcode für xgboost untersucht und Folgendes für die Zählung ermittelt: Poisson-Ziel:

  1. Es verwendet die Poisson-Wahrscheinlichkeit mit einem Protokolllink.
  2. Der base_marginParameter befindet sich auf der linearen Skala, nicht auf der Antwortskala. Im Verlauf der Boosting-Runden werden auch neue Bäume auf der linearen Skala hinzugefügt.
  3. Die xgboost Poisson-Formel für die negative Log-Wahrscheinlichkeit ist korrekt, unterscheidet sich jedoch ein wenig von der Poisson-Abweichung. Die negative logarithmische Wahrscheinlichkeit und Abweichung sind jedoch sehr nahe und asymptotisch äquivalent bis zu einem Faktor von 2.
  4. Die Einstellung base_marginauf log(exposure)entspricht dem Einfügen eines log(exposure)Offset-Terms.

Ein bisschen mehr Details zu diesen Punkten:

LogGamma ist der Logarithmus der Gammafunktion, die eine kontinuierliche Erweiterung der Fakultät darstellt. Insbesondere istfür ganze Zahl . Also , . Der LogGamma-Term repräsentiert den Term in der vollen Poisson-Log-Wahrscheinlichkeit. (Dieser Begriff wird normalerweise im Log-Likelihood-Ausdruck weggelassen, da er die Optimierung nicht beeinflusst.)Γ(n)=(n1)!nLogGamma(y + 1) = factorial(y)log(y!)

Nach Stirlings Näherung ist . Das Ersetzen von LogGamma durch diese Näherung und das Ersetzen (dh Ersetzen des linearen Prädiktors durch den Mittelwert über die logarithmische Verknüpfung) ergibt . Dies ist fast die Standard-Poisson-Abweichung, außer dass der Faktor 2 fehlt.log(y!)ylog(y)ypy=exp(p)y * log(y / py) - (y - py)

Die Formel, die Sie für GBM gefunden haben, ist nicht die Standard-Poisson-Abweichung, obwohl sie bis zu einer additiven (y-abhängigen) Konstante dieselbe ist. Verwirrenderweise ist die pyin Ihrer GBM-Formel tatsächlich die lineare Skalenvorhersage, nicht die Antwortskala, während in den anderen Formeln pydie Antwort der vorhergesagte Mittelwert von y ist.

Sie müssen log(exposure)die Zielformel nicht ergänzen . Alles was Sie tun müssen, ist eingestellt base_margin=log(exposure). Dies stellt sicher, dass der erste Summenterm in der Boosting-Reihe ist log(exposure). Nachfolgende Boosting-Runden fügen weitere Begriffe hinzu, aber der anfängliche Versatz wird niemals entfernt oder geändert.

Paul
quelle