2016-02-26 16 views
5

के साथ पोइसन वितरण असमान लंबाई एक्सपोजर अवधि से उत्पन्न डेटा की दावों की आवृत्ति मॉडल मॉडल करने के लिए एक्सजीबीओस्ट का उपयोग करने की कोशिश कर रहा हूं, लेकिन एक्सपोजर का सही ढंग से इलाज करने में मॉडल नहीं मिला है। मैं आम तौर पर ऑफसेट के रूप में लॉग (एक्सपोजर) सेट करके ऐसा करता हूं - क्या आप इसे XGBoost में करने में सक्षम हैं?XGBoost - अलग-अलग एक्सपोजर/ऑफ़सेट

(ऐसा ही एक सवाल यहाँ पोस्ट किया गया: xgboost, offset exposure?): - कारकों (या तो 0 या 1

  • x1, x2

    मुद्दा समझाने के लिए, आर कोड नीचे दिए गए फ़ील्ड के साथ कुछ डेटा उत्पन्न करता है)

  • जोखिम - मनाया डेटा पर नीति अवधि की लंबाई
  • आवृत्ति - मनाया दावा की संख्या - इकाई जोखिम प्रति दावों
  • दावों की संख्या का मतलब एस ~ पोइसन (आवृत्ति * एक्सपोजर)

लक्ष्य x1 और x2 का उपयोग करके आवृत्ति की भविष्यवाणी करना है - वास्तविक मॉडल है: आवृत्ति = 2 यदि x1 = x2 = 1, आवृत्ति = 1 अन्यथा।

एक्सपोजर का उपयोग आवृत्ति की भविष्यवाणी करने के लिए नहीं किया जा सकता क्योंकि यह पॉलिसी के आरंभ में ज्ञात नहीं है। इसका एकमात्र तरीका हम इसका उपयोग कर सकते हैं: दावों की अपेक्षित संख्या = आवृत्ति * एक्सपोजर।

कोड द्वारा XGBoost का उपयोग कर इस भविष्यवाणी करने के लिए कोशिश करता है:

  1. मॉडल मैट्रिक्स
  2. सेटिंग लॉग (जोखिम) में एक वजन के रूप में जोखिम की स्थापना एक ऑफसेट

इन नीचे के रूप में, मैं मैंने दिखाया है कि मैं एक पेड़ (आरपीटी) या जीबीएम के लिए स्थिति को कैसे संभालेगा।

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") 

उत्तर

1

कम से कम आर में glm समारोह, family=poisson(link='log') साथ count ~ x1 + x2 + offset(log(exposure)) मॉडलिंग के साथ family=poisson(link='log') और weight=exposure के साथ मॉडलिंग I(count/exposure) ~ x1 + x2 के बराबर है। यही है, वज़न प्राप्त करने के जोखिम के साथ अपनी गिनती को सामान्य करें, और वजन के रूप में एक्सपोजर के साथ मॉडल आवृत्ति। Poisson प्रतिगमन के लिए glm का उपयोग करते समय आपके अनुमानित गुणांक दोनों मामलों में समान होना चाहिए। नमूना डेटा सेट

मुझे बिल्कुल यकीन नहीं है कि objective='count:poisson' के अनुरूप है, लेकिन मैं आपके लक्ष्य चर को आवृत्ति (गणना/एक्सपोजर) के रूप में सेट करने और xgboost में वजन के रूप में एक्सपोजर का उपयोग करने की अपेक्षा करता हूं। एक्सपोजर अलग-अलग होने पर जाने का तरीका।

+0

धन्यवाद विन्ह। यह उन विकल्पों में से एक है जिन्हें मैंने कोशिश की थी लेकिन सरल मामलों में अपेक्षित काम नहीं कर रहे थे। मेरा मानना ​​है कि अब मुझे समाधान मिला है और इसे यहां पोस्ट किया है। –

1

मैं अब बाहर काम किया है कैसे setinfo का उपयोग कर base_margin विशेषता बदलने के लिए यह करने के लिए ऑफसेट (एक रेखीय कारक के रूप में), अर्थात्:

setinfo(xgtrain, "base_margin", log(d$exposure)) 
संबंधित मुद्दे