XGBoost - Poissonverteilung mit variierender Belichtung / Offset

Ich versuche XGBoost zu verwenden, um die Häufigkeit von Angaben zu modellieren, die aus Belichtungszeiträumen mit ungleicher Länge generiert wurden, konnte das Modell jedoch nicht dazu bringen, die Belichtung korrekt zu behandeln. Ich würde dies normalerweise tun, indem ich das Protokoll (die Belichtung) als Offset setze. Können Sie dies in XGBoost tun?

(Eine ähnliche Frage wurde hier gestellt:xgboost, Offsetbelichtung?)

Um das Problem zu veranschaulichen, generiert der folgende R-Code einige Daten mit den Feldern:

x1, x2 - Faktoren (entweder 0 oder 1)exposure - Dauer des Versicherungszeitraums für beobachtete DatenFrequenz - mittlere Anzahl von Forderungen pro Risikoeinheitclaims - Anzahl der beobachteten Claims ~ Poisson (Häufigkeit * Exposition)

Das Ziel ist es, die Häufigkeit mit x1 und x2 vorherzusagen - das wahre Modell lautet: Häufigkeit = 2, wenn x1 = x2 = 1, andernfalls Häufigkeit = 1.

Exposure kann nicht zur Vorhersage der Häufigkeit verwendet werden, da dies zu Beginn einer Richtlinie nicht bekannt ist. Die einzige Möglichkeit, die wir nutzen können, besteht darin, zu sagen: Erwartete Anzahl von Forderungen = Häufigkeit * Exposition.

Der Code versucht dies mit XGBoost vorherzusagen, indem er:

Belichtung als Gewicht in der Modellmatrix festlegenLog (Belichtung) als Offset einstellen

Unter diesen habe ich gezeigt, wie ich mit der Situation für einen Baum (rpart) oder gbm umgehen würde.

set.seed(1)
size<-10000
d <- data.frame(
  x1 = sample(c(0,1),size,replace=T,prob=c(0.5,0.5)),
  x2 = sample(c(0,1),size,replace=T,prob=c(0.5,0.5)),
  exposure = runif(size, 1, 10)*0.3
)
d$frequency <- 2^(d$x1==1 & d$x2==1)
d$claims <- rpois(size, lambda = d$frequency * d$exposure)

#### Try to fit using XGBoost
require(xgboost)
param0 <- list(
  "objective"  = "count:poisson"
  , "eval_metric" = "logloss"
  , "eta" = 1
  , "subsample" = 1
  , "colsample_bytree" = 1
  , "min_child_weight" = 1
  , "max_depth" = 2
)

## 1 - set weight in xgb.Matrix

xgtrain = xgb.DMatrix(as.matrix(d[,c("x1","x2")]), label = d$claims, weight = d$exposure)
xgb = xgb.train(
  nrounds = 1
  , params = param0
  , data = xgtrain
)

d$XGB_P_1 <- predict(xgb, xgtrain)

## 2 - set as offset in xgb.Matrix
xgtrain.mf  <- model.frame(as.formula("claims~x1+x2+offset(log(exposure))"),d)
xgtrain.m  <- model.matrix(attr(xgtrain.mf,"terms"),data = d)
xgtrain  <- xgb.DMatrix(xgtrain.m,label = d$claims)

xgb = xgb.train(
  nrounds = 1
  , params = param0
  , data = xgtrain
)

d$XGB_P_2 <- predict(model, xgtrain)

#### Fit a tree
require(rpart)
d[,"tree_response"] <- cbind(d$exposure,d$claims)
tree <- rpart(tree_response ~ x1 + x2,
              data = d,
              method = "poisson")

d$Tree_F <- predict(tree, newdata = d)

#### Fit a GBM

gbm <- gbm(claims~x1+x2+offset(log(exposure)), 
           data = d,
           distribution = "poisson",
           n.trees = 1,
           shrinkage=1,
           interaction.depth=2,
           bag.fraction = 0.5)

d$GBM_F <- predict(gbm, newdata = d, n.trees = 1, type="response")

Antworten auf die Frage(4)

Ihre Antwort auf die Frage