得出集成机器学习模型堆栈的预测效率和预测误差

问题描述 投票:1回答:1

我正在尝试为使用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.glm")
> tmp = train(m, tsk)
> tmp$learner.model$super.model$learner.model

Call:  stats::glm(formula = f, family = family, data = d, control = ctrl, 
    model = FALSE)

Coefficients:
(Intercept)   regr.rpart     regr.svm  regr.ranger  
   -2.46902     -0.02729      0.33194      0.81128  

Degrees of Freedom: 505 Total (i.e. Null);  502 Residual
Null Deviance:      42720 
Residual Deviance: 5450     AIC: 2649
> 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 <- abs(tmp$learner.model$super.model$learner.model$coefficients[-1])
> res.all$model.error <- matrixStats::rowWeightedSds(
+           as.matrix(as.data.frame(res.all)), w=wt, na.rm=TRUE)
> res$data[1,]
  id truth response
1  1    24 26.85235
> res.all$model.error[1]
[1] 2.042609

因此,在这种情况下,预测值为26.85,真实值为24,并且预测误差估计为2.0。同样,因为使用了stack.cv方法,所以每次您重新拟合模型时,您都会得到略有不同的值。注意,我使用GLM beta系数作为权重(在此示例中,护林员获得了最高权重,这对于集合预测最为重要)。您是否知道任何类似的方法来得出整体模型的预测误差?预先感谢。

prediction ensemble-learning mlr
1个回答
0
投票

要导出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上的预测应该比您从训练数据中获得的预测高一些(取决于外推法)。该方法也可以扩展到使用例如。随机森林模型(请参阅游骑兵软件包)和分位数回归预测间隔的随机森林推导(Hengl et al. 2019)。请注意,对于这种类型的分析,至少应有两个基础学习者(推荐三个)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.