2016-02-26 15 views
5

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:

  1. Thiết tiếp xúc như một trọng lượng trong ma trận mô hình
  2. 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") 

Trả lời

1

Ít nhất với glm hàm trong R, mẫu count ~ x1 + x2 + offset(log(exposure)) với family=poisson(link='log') tương đương với mô hình I(count/exposure) ~ x1 + x2 với family=poisson(link='log')weight=exposure. Tức là, bình thường hóa số lượng của bạn bằng cách phơi sáng để nhận tần suất và tần suất của mô hình với mức phơi sáng dưới dạng trọng số. Hệ số ước tính của bạn sẽ giống nhau trong cả hai trường hợp khi sử dụng glm cho hồi quy Poisson. Hãy thử nó cho chính mình bằng cách sử dụng một tập dữ liệu mẫu

Tôi không chắc chắn những gì objective='count:poisson' tương ứng, nhưng tôi mong đợi đặt biến mục tiêu của bạn là tần suất (đếm/phơi sáng) và sử dụng phơi sáng vì trọng số trong xgboost sẽ là con đường để đi khi tiếp xúc là khác nhau.

+0

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

1

bây giờ tôi đã tìm ra cách để làm điều này bằng setinfo để thay đổi thuộc tính base_margin là bù đắp (như là một yếu tố dự báo tuyến tính), ví dụ:

setinfo(xgtrain, "base_margin", log(d$exposure)) 
Các vấn đề liên quan