【问题标题】:Deriving prediction efficiency and prediction errors for Ensemble Machine Learning model stacks为集成机器学习模型堆栈推导预测效率和预测误差
【发布时间】:2019-09-15 18:41:38
【问题描述】:

我正在尝试为使用 mlr 包中的 makeStackedLearner 拟合的集成模型推导预测误差。这些是我正在遵循的步骤:

> library(mlr)
> library(matrixStats)
> data(BostonHousing, package = "mlbench")
> tsk = makeRegrTask(data = BostonHousing, target = "medv")
> BostonHousing$chas = as.numeric(BostonHousing$chas)
> base = c("regr.rpart", "regr.svm", "regr.ranger")
> lrns = lapply(base, makeLearner)
> m = makeStackedLearner(base.learners = lrns,
+                        predict.type = "response", method = "stack.cv", super.learner = "regr.lm")
> tmp = train(m, tsk)
> summary(tmp$learner.model$super.model$learner.model)

Call:
stats::lm(formula = f, data = d)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.8014  -1.5154  -0.2479   1.2160  23.6530 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -2.76991    0.43211  -6.410 3.35e-10 ***
regr.rpart  -0.09575    0.04858  -1.971   0.0493 *  
regr.svm     0.17379    0.07710   2.254   0.0246 *  
regr.ranger  1.04503    0.08904  11.736  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.129 on 502 degrees of freedom
Multiple R-squared:  0.885, Adjusted R-squared:  0.8843 
F-statistic:  1287 on 3 and 502 DF,  p-value: < 2.2e-16
> res = predict(tmp, tsk)

注意我使用method = "stack.cv",这意味着任何时候使用makeStackedLearner 改装模型时,数字都会略有不同。我的第一个问题是:

  1. 源自super.learner 模型的R 方是预测能力的客观衡量标准吗? (我假设是因为它应该是基于交叉验证并进行改装)
> ## cross-validation R-square
> round(1-tmp$learner.model$super.model$learner.model$deviance /
+   tmp$learner.model$super.model$learner.model$null.deviance, 3)
[1] 0.872
  1. 如何推导出所有newdata 行的预测误差(预测区间)?

我目前使用的方法只是推导出多个独立模型预测的标准偏差(即模型误差):

> res.all <- getStackedBaseLearnerPredictions(tmp)
> wt <- summary(tmp$learner.model$super.model$learner.model)$coefficients[-1,4]
> res.all$model.error <- matrixStats::rowSds(
+        as.matrix(as.data.frame(res.all))[,which(wt<0.05)], na.rm=TRUE)
> res$data[1,]
  id truth response
1  1    24 26.85235
> res.all$model.error[1]
[1] 2.24609

所以在这种情况下,预测值为 26.85,真值为 24,预测误差估计为 2.24。同样,由于使用了stack.cv 方法,因此每次重新拟合模型时,您都会得到略有不同的值。您是否知道任何类似的方法来导出集成模型的预测误差?提前致谢。

【问题讨论】:

  • 不确定我是否正确理解了您的问题。您可以将 mlr 支持的任何性能度量用于堆叠学习器,就像使用任何其他学习器一样。原则上,计算集成模型与“正常”模型的误差没有区别。除非我在你的问题中遗漏了什么?
  • 我正在查看每个新预测位置的预测误差(也称为预测区间)。在一个简单的回归示例中,您将使用:predict(eruption.lm, newdata, interval="predict")(请参阅:r-tutor.com/elementary-statistics/simple-linear-regression/…)。对于 R 中的堆叠学习者,没有这样的选项(还预测上/下区间,而不仅仅是平均值)。
  • 您可以将predict.type设置为se。这就是你要找的东西吗?
  • 这不适用于 StackedLearner:&gt; m.se = makeStackedLearner(base.learners = lrns, + predict.type="se", method = "stack.cv", super.learner = "regr.glm") Error in makeStackedLearner(base.learners = lrns, predict.type = "se", : Predicting standard errors currently not supported.
  • 我想我有点回答了我自己的问题。现在只是看看是否有更好的想法(统计/数学有效性显然也非常重要)。

标签: prediction ensemble-learning mlr


【解决方案1】:

要导出prediction intervals(新数据中的个别错误),我们可以使用predict.lm 函数:

> m = makeStackedLearner(base.learners = lrns, predict.type = "response",
       method = "stack.cv", super.learner = "regr.lm")
> tmp = train(m, tsk)
> tmp$learner.model$super.model$learner.model

Call:
stats::lm(formula = f, data = d)

Coefficients:
 (Intercept)   regr.rpart     regr.svm  regr.ranger  
   -2.5879      -0.0971       0.3549       0.8635  

> res.all <- getStackedBaseLearnerPredictions(tmp)
> pred.error = predict(tmp$learner.model$super.model$learner.model, 
        newdata = res.all, interval = "prediction", level=2/3)
> str(pred.error)
 num [1:506, 1:3] 29.3 23.3 34.6 36 33.6 ...
 - attr(*, "dimnames")=List of 2
 ..$ : chr [1:506] "1" "2" "3" "4" ...
 ..$ : chr [1:3] "fit" "lwr" "upr"
> summary(tmp$learner.model$super.model$learner.model$residuals)
   Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-11.8037  -1.5931  -0.3161   0.0000   1.1951  29.2145 
> mean((pred.error[,3]-pred.error[,2])/2)
[1] 3.253142

这是一个将lm 模型作为超级学习者的示例。 level 参数可用于传递不同的概率(1 个标准差为 2/3)。 newdata 的预测应该比你从训练数据中获得的要高一些(取决于外推)。这种方法也可以扩展到使用例如随机森林模型(参见 ranger 包)和预测区间的分位数回归随机森林推导(Hengl et al. 2019)。请注意,对于这种类型的分析,应该至少有两个基础学习器(推荐三个)。

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2018-06-03
    • 2011-10-04
    • 2019-01-01
    相关资源
    最近更新 更多