Poisson xgboost com exposição

8

Eu estava tentando modelar uma variável dependente de contagem com exposição desigual. Glms clássicos usariam log (exposição) como deslocamento, também o gbm, mas o xgboost não permite o deslocamento até agora ...

Tentando encontrar uma desvantagem neste exemplo em validação cruzada ( onde o deslocamento ocorre na regressão binomial negativa de Poisson /? ) Me sugeriu modelar a frequência (número real) em vez das contagens ponderadas pela exposição.

Eu tentei trabalhar em torno de algum código xgboost para aplicar o mesmo método nos meus dados, mas falhei .... Abaixo do código que estabeleci:

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

Alguém pode ajudar? Além disso, eu queria saber se era possível executar todos usando o trem de sinal de intercalação ...

Giorgio Spedicato
fonte

Respostas:

9

De acordo com a resposta em: /programming/34896004/xgboost-offset-exposure

xgboostpode lidar com offsetprazo como no glmou gbmutilizar setinfo, mas este método não está documentado muito bem.

No seu exemplo, o código seria: setinfo(xgbMatrix,"base_margin",log(Insurance$Holders))

Sixiang.Hu
fonte
4

Seu código funciona muito bem, você só precisa aumentar o parâmetro nround para obter o resultado desejado. Os modelos Boosting não convergem nas primeiras iterações.

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
fonte