Search code examples
rh2omlr

Averaging model prediction in R using mlr package


Is there a way to combine multiple predictions from different models in mlr into a single average prediction so that it can be used to calculate performance measures etc.?

library(mlr)
data(iris)
iris2 <- iris
iris2$Species <- ifelse(iris$Species=="setosa", "ja", "nein")
task = makeClassifTask(data = iris2, target = "Species")
lrn = makeLearner("classif.h2o.deeplearning", predict.type="prob")
model1 = train(lrn, task)
model2 = train(lrn, task)
pred1 = predict(model1, newdata=iris2)
pred2 = predict(model2, newdata=iris2)
performance(pred1, measures = auc)
g = generateThreshVsPerfData(pred1)
plotThreshVsPerf(g)

A workaround to show what I mean could be maybe

pred_avg = pred1
pred_avg$data[,c("prob.ja","prob.nein")] = (pred1$data[,c("prob.ja","prob.nein")] + 
                                              pred2$data[,c("prob.ja","prob.nein")])/2
performance(pred_avg, measures = auc)
g_avg = generateThreshVsPerfData(pred_avg)
plotThreshVsPerf(g_avg)

Is there a way to do this without a workaround and could this workaround have any unwanted side effects?


Solution

  • It sounds like you are looking for a stacking learner, which is mlr's method of performing ensembles.

    from the docs

     # Regression
      data(BostonHousing, package = "mlbench")
      tsk = makeRegrTask(data = BostonHousing, target = "medv")
      base = c("regr.rpart", "regr.svm")
      lrns = lapply(base, makeLearner)
      m = makeStackedLearner(base.learners = lrns,
        predict.type = "response", method = "average")
      tmp = train(m, tsk)
      res = predict(tmp, tsk)
    # Prediction: 506 observations
    # predict.type: response
    # threshold: 
    # time: 0.02
    #   id truth response
    # 1  1  24.0 27.33742
    # 2  2  21.6 22.08853
    # 3  3  34.7 33.52007
    # 4  4  33.4 32.49923
    # 5  5  36.2 32.67973
    # 6  6  28.7 22.99323
    # ... (506 rows, 3 cols)
    
    performance(res, rmse)
    #     rmse 
    # 3.138981