gpt4 book ai didi

r - XGBoost-具有变化的曝光/偏移的泊松分布

转载 作者:行者123 更新时间:2023-12-04 12:18:49 25 4
gpt4 key购买 nike

我正在尝试使用XGBoost对不等长的暴露时间段生成的数据的声明频率进行建模,但是无法获得模型来正确处理暴露时间。我通常会通过将log(exposure)设置为偏移量来做到这一点-您可以在XGBoost中做到这一点吗?

(一个类似的问题在这里发布:xgboost, offset exposure?)

为了说明问题,下面的R代码使用字段生成一些数据:

  • x1,x2-因子(0或1)
  • 暴露-观察数据的政策期限长度
  • 频率-每单位暴露的平均 claim 数
  • claim -观察到的 claim 数量〜泊松(频率*暴露)

  • 目标是使用x1和x2预测频率-真正的模型是:如果x1 = x2 = 1,则频率= 2,否则,频率= 1。

    暴露不能用于预测发生频率,因为在开始时尚不知道。我们可以使用的唯一方法是说:预期的 claim 数量=频率*风险敞口。

    该代码尝试通过以下方式使用XGBoost对此进行预测:
  • 在模型矩阵
  • 中将曝光设置为权重
  • 将日志(曝光)设置为偏移量

  • 在这些下面,我展示了如何处理树(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")

    最佳答案

    至少使用R中的glm函数,用count ~ x1 + x2 + offset(log(exposure))建模family=poisson(link='log')等效于用I(count/exposure) ~ x1 + x2family=poisson(link='log')建模weight=exposure。也就是说,通过曝光获取频率来归一化您的计数,并以曝光量为权重对频率进行建模。当使用glm进行Poisson回归时,在两种情况下,您估计的系数应该相同。使用样本数据集自行尝试

    我不确定是什么objective='count:poisson'对应的,但是我希望将目标变量设置为频率(计数/曝光),并使用曝光作为xgboost中的权重,这将是曝光变化时要采取的方法。

    关于r - XGBoost-具有变化的曝光/偏移的泊松分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35660588/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com