Poisson xgboost với tiếp xúc


8

Tôi đã cố gắng mô hình hóa một biến phụ thuộc đếm với độ phơi sáng không đồng đều. Các glms cổ điển sẽ sử dụng log (phơi sáng) làm offset, cũng như gbm, nhưng xgboost không cho phép offset cho đến bây giờ ...

Cố gắng tìm một nhược điểm của ví dụ này trong giá trị chéo ( Trường hợp bù đi trong hồi quy nhị thức Poisson / âm? ) Đề nghị tôi mô hình tần số (số thực) thay vì tính trọng số theo Phơi sáng.

Tôi đã cố gắng thực hiện một số mã xgboost để áp dụng cùng một phương pháp trên dữ liệu của mình nhưng tôi đã thất bại .... Dưới đây là mã tôi đặt ra:

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

Ai có thể giúp đỡ? Ngoài ra, tôi đã tự hỏi liệu có thể chạy tất cả bằng cách sử dụng xe lửa ...

Câu trả lời:


9

Theo câu trả lời trong: /programming/34896004/xgboost-offset-exposeure

xgboostcó thể xử lý offsetthuật ngữ như trong glmhoặc gbmsử dụng setinfo, nhưng phương pháp này không được ghi chép lại rất tốt.

Trong ví dụ của bạn, mã sẽ là: setinfo(xgbMatrix,"base_margin",log(Insurance$Holders))


4

Mã của bạn hoạt động tốt, bạn chỉ cần tăng nround tham số để có kết quả mong muốn. Các mô hình Boosting không hội tụ ở các lần lặp đầu tiên.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.