Poisson xgboost mit Exposition

8

Ich habe versucht, eine zählabhängige Variable mit ungleichmäßiger Belichtung zu modellieren. Klassische glms würden log (Belichtung) als Offset verwenden, auch gbm, aber xgboost erlaubt bis jetzt keinen Offset ...

Der Versuch, einen Nachteil in diesem Beispiel in crossvalidated ( Wohin geht der Offset in Poisson / negative binomiale Regression? ) Zu finden, schlug mir vor, die Frequenz (reelle Zahl) zu modellieren, anstatt die Gewichtung nach Belichtung zu zählen.

Ich habe versucht, um einen xgboost-Code herum zu arbeiten, um dieselbe Methode auf meine Daten anzuwenden, aber ich bin fehlgeschlagen ... Unterhalb des Codes, den ich angegeben habe:

library(MASS)
data(Insurance)
library(xgboost)
options(contrasts=c("contr.treatment","contr.treatment")) #fissa i 

Insurance$freq<-with(Insurance, Claims/Holders )
library(caret)

temp<-dplyr::select(Insurance,District, Group, Age,freq)
temp2= dummyVars(freq ~ ., data = temp, fullRank = TRUE) %>% predict(temp)

xgbMatrix <- xgb.DMatrix(as.matrix(temp2), 
                     label = Insurance$freq, 
                     weight = Insurance$Holders)

bst = xgboost(data=xgbMatrix, label = Insurance$freq,    objective='count:poisson',nrounds=5)
#In xgb.get.DMatrix(data, label) : xgboost: label will be ignored. 
#strange warning

Insurance$predFreq<-predict(bst, xgbMatrix)

with(Insurance, sum(Claims)) #3151
with(Insurance, sum(predFreq*Holders)) #7127 fails

Kann jemand helfen? Außerdem habe ich mich gefragt, ob es möglich ist, alle mit dem Caret-Zug zu fahren ...

Giorgio Spedicato
quelle

Antworten:

9

Laut der Antwort in: /programming/34896004/xgboost-offset-exposure

xgboostkann mit offsetBegriff wie in glmoder gbmmit umgehen setinfo, aber diese Methode ist nicht sehr gut dokumentiert.

In Ihrem Beispiel wäre der Code: setinfo(xgbMatrix,"base_margin",log(Insurance$Holders))

Sixiang.Hu
quelle
4

Ihr Code funktioniert einwandfrei, Sie müssen nur den Parameter nround erhöhen, um das gewünschte Ergebnis zu erzielen. Die Boosting-Modelle konvergieren nicht bei den ersten Iterationen.

xgbMatrix <- xgb.DMatrix(as.matrix(temp2), 
                         label = Insurance$freq,
                         weight = Insurance$Holders)

bst = xgboost(data=xgbMatrix, objective='count:poisson', nrounds=500, verbose = 0)

Insurance$predFreq<-predict(bst, xgbMatrix)

with(Insurance, sum(Claims)) #3151
with(Insurance, sum(predFreq*Holders)) #same
Metariat
quelle