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 ...

Antworten:



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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.