9

XGBoost を使用して、不均等な露出期間から生成されたデータのクレーム頻度をモデル化しようとしていますが、露出を正しく処理するモデルを取得できませんでした。私は通常、ログ(露出)をオフセットとして設定することでこれを行います-XGBoostでこれを行うことができますか?

(同様の質問がここに投稿されました: xgboost, offset Exposure? )

この問題を説明するために、以下の R コードはフィールドを使用していくつかのデータを生成します。

  • x1、x2 - 係数 (0 または 1)
  • 露出 - 観察されたデータのポリシー期間の長さ
  • 頻度 - 単位エクスポージャーあたりのクレームの平均数
  • クレーム - 観測されたクレームの数 ~ポアソン(頻度*露出)

目標は、x1 と x2 を使用して周波数を予測することです。実際のモデルは、x1 = x2 = 1 の場合は周波数 = 2、それ以外の場合は周波数 = 1 です。

エクスポージャーは、ポリシーの開始時にはわからないため、頻度を予測するために使用することはできません。これを使用できる唯一の方法は、次のように言うことです。クレームの予想数 = 頻度 * 露出。

コードは、XGBoost を使用して次のように予測しようとします。

  1. モデル マトリックスで露出を重みとして設定する
  2. ログ(露出)をオフセットとして設定

これらの下に、ツリー (rpart) または 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")
4

2 に答える 2

4

setinfo を使用して base_margin 属性をオフセット (線形予測子として) に変更する方法を考え出しました。

setinfo(xgtrain, "base_margin", log(d$exposure))
于 2016-09-13T14:54:52.423 に答える