Tôi đang cố gắng sử dụng XGBoost để mô hình hóa tần suất dữ liệu được tạo ra từ các khoảng thời gian phơi sáng không bằng nhau, nhưng không thể lấy mẫu để xử lý phơi sáng một cách chính xác. Tôi thường làm điều này bằng cách thiết lập nhật ký (tiếp xúc) như là một bù đắp - bạn có thể làm điều này trong XGBoost?XGBoost - Phân bố Poisson với độ phơi sáng/bù trừ khác nhau
(Một câu hỏi tương tự đã được đăng ở đây: xgboost, offset exposure?)
Để minh họa cho vấn đề này, các mã R dưới đây tạo ra một số dữ liệu với các lĩnh vực:
- x1, x2 - Các yếu tố (0 hoặc 1)
- tiếp xúc - chiều dài của thời kỳ chính sách trên dữ liệu quan sát
- tần số - số yêu cầu bồi thường quan sát - số lượng các đơn mỗi tiếp xúc với đơn vị
- tuyên bố có ý nghĩa s ~ Poisson (tần số * phơi sáng)
Mục đích là dự đoán tần số sử dụng x1 và x2 - mô hình đúng là: tần số = 2 nếu x1 = x2 = 1, tần số = 1 nếu không.
Không thể sử dụng phơi sáng để dự đoán tần suất vì nó không được biết ngay từ đầu của chính sách. Cách duy nhất chúng tôi có thể sử dụng nó là để nói: số lượng yêu cầu bồi thường = tần số * phơi sáng.
Mã cố gắng để dự đoán này sử dụng XGBoost bởi:
- Thiết tiếp xúc như một trọng lượng trong ma trận mô hình
- Setting log (tiếp xúc) như là một bù đắp
Dưới đây này, tôi đã cho thấy làm thế nào tôi sẽ xử lý tình hình cho một cây (rpart) hoặc gbm.
set.seed(1)
size<-10000
d <- data.frame(
x1 = sample(c(0,1),size,replace=T,prob=c(0.5,0.5)),
x2 = sample(c(0,1),size,replace=T,prob=c(0.5,0.5)),
exposure = runif(size, 1, 10)*0.3
)
d$frequency <- 2^(d$x1==1 & d$x2==1)
d$claims <- rpois(size, lambda = d$frequency * d$exposure)
#### Try to fit using XGBoost
require(xgboost)
param0 <- list(
"objective" = "count:poisson"
, "eval_metric" = "logloss"
, "eta" = 1
, "subsample" = 1
, "colsample_bytree" = 1
, "min_child_weight" = 1
, "max_depth" = 2
)
## 1 - set weight in xgb.Matrix
xgtrain = xgb.DMatrix(as.matrix(d[,c("x1","x2")]), label = d$claims, weight = d$exposure)
xgb = xgb.train(
nrounds = 1
, params = param0
, data = xgtrain
)
d$XGB_P_1 <- predict(xgb, xgtrain)
## 2 - set as offset in xgb.Matrix
xgtrain.mf <- model.frame(as.formula("claims~x1+x2+offset(log(exposure))"),d)
xgtrain.m <- model.matrix(attr(xgtrain.mf,"terms"),data = d)
xgtrain <- xgb.DMatrix(xgtrain.m,label = d$claims)
xgb = xgb.train(
nrounds = 1
, params = param0
, data = xgtrain
)
d$XGB_P_2 <- predict(model, xgtrain)
#### Fit a tree
require(rpart)
d[,"tree_response"] <- cbind(d$exposure,d$claims)
tree <- rpart(tree_response ~ x1 + x2,
data = d,
method = "poisson")
d$Tree_F <- predict(tree, newdata = d)
#### Fit a GBM
gbm <- gbm(claims~x1+x2+offset(log(exposure)),
data = d,
distribution = "poisson",
n.trees = 1,
shrinkage=1,
interaction.depth=2,
bag.fraction = 0.5)
d$GBM_F <- predict(gbm, newdata = d, n.trees = 1, type="response")
Cảm ơn Vinh. Đây là một trong những lựa chọn tôi đã thử nhưng dường như không hoạt động như mong đợi trong những trường hợp đơn giản. Tôi tin rằng bây giờ tôi đã tìm thấy giải pháp và đã đăng nó ở đây. –