MLR3整体平均分

问题描述

使用非常有用的mlr3 book中的示例,我试图简单地返回堆叠模型输出的平均得分。有人可以解释一下如何使用mlr3吗?我曾尝试同时使用 LearnerClassifAvg $ new(id =“ classif.avg”) po(“ classifavg”),但不确定我是否正确应用了这些代码,谢谢

示例:

library("magrittr")
library("mlr3learners") # for classif.glmnet

task      = mlr_tasks$get("iris")
train.idx = sample(seq_len(task$nrow),120)
test.idx  = setdiff(seq_len(task$nrow),train.idx)

rprt = lrn("classif.rpart",predict_type = "prob")
glmn = lrn("classif.glmnet",predict_type = "prob")

#  Create Learner CV Operators
lrn_0 = PipeOpLearnerCV$new(rprt,id = "rpart_cv_1")
lrn_0$param_set$values$maxdepth = 5L
lrn_1 = PipeOpPCA$new(id = "pca1") %>>% PipeOpLearnerCV$new(rprt,id = "rpart_cv_2")
lrn_1$param_set$values$rpart_cv_2.maxdepth = 1L
lrn_2 = PipeOpPCA$new(id = "pca2") %>>% PipeOpLearnerCV$new(glmn)

# Union them with a PipeOpNULL to keep original features
level_0 = gunion(list(lrn_0,lrn_1,lrn_2,PipeOpnop$new(id = "nop1")))

# Cbind the output 3 times,train 2 learners but also keep level
# 0 predictions
level_1 = level_0 %>>%
  PipeOpFeatureUnion$new(4) %>>%
  PipeOpcopy$new(3) %>>%
  gunion(list(
    PipeOpLearnerCV$new(rprt,id = "rpart_cv_l1"),PipeOpLearnerCV$new(glmn,id = "glmnt_cv_l1"),PipeOpnop$new(id = "nop_l1")
  ))


level_1$plot(html = FALSE)


level_2  <- level_1 %>>%
  PipeOpFeatureUnion$new(3,id = "u2") %>>%
  LearnerClassifAvg$new( id = "classif.avg")

level_2$plot(html = FALSE)


lrn = GraphLearner$new(level_2)


lrn$
  train(task,train.idx)$
  predict(task,test.idx)$
  score()

## returns: Error: Trying to predict response,but incoming data has no factors

解决方法

如果我们不将特征传递给 library(modelsummary) dat <- mtcars dat$weights <- dat$mpg datasummary_balance(~vs,data = dat) (classif.avg),我们仍然会遇到同样的错误:

PipeOpNOP
Error: Trying to predict response,but incoming data has no factors

library("magrittr")
library("mlr3learners") # for classif.glmnet
library("mlr3verse") #for LearnerClassifAvg
library("mlr3pipelines") # for pipelines

task      = mlr_tasks$get("iris")
train.idx = sample(seq_len(task$nrow),120)
test.idx  = setdiff(seq_len(task$nrow),train.idx)

rprt = lrn("classif.rpart",predict_type = "prob")
glmn = lrn("classif.glmnet",predict_type = "prob")

#  Create Learner CV Operators
lrn_0 = PipeOpLearnerCV$new(rprt,id = "rpart_cv_1")
lrn_0$param_set$values$maxdepth = 5L
lrn_1 = PipeOpPCA$new(id = "pca1") %>>% PipeOpLearnerCV$new(rprt,id = "rpart_cv_2")
lrn_1$param_set$values$rpart_cv_2.maxdepth = 1L
lrn_2 = PipeOpPCA$new(id = "pca2") %>>% PipeOpLearnerCV$new(glmn)

# Union them with a PipeOpNULL to keep original features
level_0 = gunion(list(lrn_0,lrn_1,lrn_2,PipeOpNOP$new(id = "NOP1")))

# Cbind the output 3 times,train 2 learners but also keep level
# 0 predictions
level_1 = level_0 %>>%
  PipeOpFeatureUnion$new(4) %>>%
  PipeOpCopy$new(2) %>>%
  gunion(list(
    PipeOpLearnerCV$new(rprt,id = "rpart_cv_l1"),PipeOpLearnerCV$new(glmn,id = "glmnt_cv_l1")
    # PipeOpNOP$new(id = "NOP_l1") #leave out features here
  ))


level_2  <- level_1 %>>%
  PipeOpFeatureUnion$new(2,id = "u2") %>>%
  LearnerClassifAvg$new( id = "classif.avg")

level_2$plot(html = FALSE)

reprex package (v1.0.0) 于 2021 年 3 月 27 日创建

可以通过设置学习器的正确预测类型来减轻此错误:


lrn = GraphLearner$new(level_2)


lrn$
  train(task,train.idx)$
  predict(task,test.idx)$
  score()
#> INFO  [20:42:55.490] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 2/3) 
#> INFO  [20:42:55.557] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 1/3) 
#> INFO  [20:42:55.591] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 3/3) 
#> INFO  [20:42:55.810] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 3/3) 
#> INFO  [20:42:55.849] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 2/3) 
#> INFO  [20:42:55.901] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 1/3) 
#> INFO  [20:42:56.188] [mlr3]  Applying learner 'classif.glmnet' on task 'iris' (iter 3/3) 
#> INFO  [20:42:56.299] [mlr3]  Applying learner 'classif.glmnet' on task 'iris' (iter 1/3) 
#> INFO  [20:42:56.374] [mlr3]  Applying learner 'classif.glmnet' on task 'iris' (iter 2/3) 
#> INFO  [20:42:56.634] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 1/3) 
#> INFO  [20:42:56.699] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 2/3) 
#> INFO  [20:42:56.765] [mlr3]  Applying learner 'classif.rpart' on task 'iris' (iter 3/3) 
#> INFO  [20:42:57.065] [mlr3]  Applying learner 'classif.glmnet' on task 'iris' (iter 2/3) 
#> INFO  [20:42:57.177] [mlr3]  Applying learner 'classif.glmnet' on task 'iris' (iter 1/3) 
#> INFO  [20:42:57.308] [mlr3]  Applying learner 'classif.glmnet' on task 'iris' (iter 3/3)
#> Error: Trying to predict response,but incoming data has no factors

在此处检查错误消息:https://github.com/cran/mlr3pipelines/blob/master/R/LearnerAvg.R

lrn_avg <- LearnerClassifAvg$new( id = "classif.avg")
lrn_avg$predict_type ="prob"

用更简单的集成演示了解决方案

if (all(fcts) != (self$predict_type == "response")) {
        stopf("Trying to predict %s,but incoming data has %sfactors",self$predict_type,if (all(fcts)) "only " else "no "

library("magrittr")
library("mlr3learners") # for classif.glmnet
#> Lade nötiges Paket: mlr3
library("mlr3verse") #for LearnerClassifAvg
library("mlr3pipelines") # for pipelines

# Define task
task      = mlr_tasks$get("iris")
train.idx = sample(seq_len(task$nrow),predict_type = "prob")

# Define level 0
level_0 =
  gunion(list(
    PipeOpLearnerCV$new(rprt,id = "glmnt_cv_l1")
    # PipeOpNOP$new(id = "NOP_l1")
  ))

# Create "averager" learner (and set predict type to "prob")
lrn_avg <- LearnerClassifAvg$new( id = "classif.avg")
lrn_avg$predict_type ="prob"

# Combine level 0 and "averager" learner
level_1  <- level_0 %>>%
  PipeOpFeatureUnion$new(2,id = "u1") %>>%
  lrn_avg

# Show ensemble
level_1$plot(html = FALSE)

reprex package (v1.0.0) 于 2021 年 3 月 28 日创建

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...