के साथ पोइसन वितरण असमान लंबाई एक्सपोजर अवधि से उत्पन्न डेटा की दावों की आवृत्ति मॉडल मॉडल करने के लिए एक्सजीबीओस्ट का उपयोग करने की कोशिश कर रहा हूं, लेकिन एक्सपोजर का सही ढंग से इलाज करने में मॉडल नहीं मिला है। मैं आम तौर पर ऑफसेट के रूप में लॉग (एक्सपोजर) सेट करके ऐसा करता हूं - क्या आप इसे XGBoost में करने में सक्षम हैं?XGBoost - अलग-अलग एक्सपोजर/ऑफ़सेट
(ऐसा ही एक सवाल यहाँ पोस्ट किया गया: xgboost, offset exposure?): - कारकों (या तो 0 या 1
- x1, x2
मुद्दा समझाने के लिए, आर कोड नीचे दिए गए फ़ील्ड के साथ कुछ डेटा उत्पन्न करता है)
- जोखिम - मनाया डेटा पर नीति अवधि की लंबाई
- आवृत्ति - मनाया दावा की संख्या - इकाई जोखिम प्रति दावों
- दावों की संख्या का मतलब एस ~ पोइसन (आवृत्ति * एक्सपोजर)
लक्ष्य x1 और x2 का उपयोग करके आवृत्ति की भविष्यवाणी करना है - वास्तविक मॉडल है: आवृत्ति = 2 यदि x1 = x2 = 1, आवृत्ति = 1 अन्यथा।
एक्सपोजर का उपयोग आवृत्ति की भविष्यवाणी करने के लिए नहीं किया जा सकता क्योंकि यह पॉलिसी के आरंभ में ज्ञात नहीं है। इसका एकमात्र तरीका हम इसका उपयोग कर सकते हैं: दावों की अपेक्षित संख्या = आवृत्ति * एक्सपोजर।
कोड द्वारा XGBoost का उपयोग कर इस भविष्यवाणी करने के लिए कोशिश करता है:
- मॉडल मैट्रिक्स
- सेटिंग लॉग (जोखिम) में एक वजन के रूप में जोखिम की स्थापना एक ऑफसेट
इन नीचे के रूप में, मैं मैंने दिखाया है कि मैं एक पेड़ (आरपीटी) या जीबीएम के लिए स्थिति को कैसे संभालेगा।
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")
धन्यवाद विन्ह। यह उन विकल्पों में से एक है जिन्हें मैंने कोशिश की थी लेकिन सरल मामलों में अपेक्षित काम नहीं कर रहे थे। मेरा मानना है कि अब मुझे समाधान मिला है और इसे यहां पोस्ट किया है। –