带曝光的泊松 xgboost

机器算法验证 r 插入符号 泊松回归 抵消 助推
2022-03-31 15:14:39

我试图模拟一个曝光不均匀的计数因变量。经典 glms 将使用 log(exposure) 作为偏移量,gbm 也是如此,但 xgboost 直到现在才允许偏移量......

试图在交叉验证中找到这个示例的缺点(Poisson/负二项式回归中的偏移量在哪里?)建议我对频率(实数)进行建模,而不是按 Exposure 加权计数。

我尝试使用一些 xgboost 代码来对我的数据应用相同的方法,但我失败了......在我列出的代码下方:

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

有人可以帮忙吗?另外,我想知道是否可以使用插入符号的火车来运行所有...

2个回答

根据答案: https ://stackoverflow.com/questions/34896004/xgboost-offset-exposure

xgboost可以像 in或using一样处理offsetterm ,但是这种方法的文档记录不是很好。glmgbmsetinfo

在您的示例中,代码将是: setinfo(xgbMatrix,"base_margin",log(Insurance$Holders))

您的代码工作得很好,您只需要增加参数 nround 即可获得所需的结果。Boosting 模型在第一次迭代时不会收敛。

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