首页 > 解决方案 > R - 对每个学习者具有不同特征子集的超级学习者的建议?

问题描述

我希望将每个使用不同特征和算法子集开发的学习者组合成一个超级学习者。我意识到这不是 SuperLearning 通常的工作方式,但请相信我有我的理由。

我一直在创建自定义SL.___函数并处理超参数之类的功能子集,但正如您将在下面看到的,当我尝试在CV.SuperLearner.

有什么建议么?有没有更简单的方法可以在包中做到这一点sl3

library(tidyverse)

library(SuperLearner)
#> Loading required package: nnls
#> Super Learner
#> Version: 2.0-26
#> Package created on 2019-10-27

set.seed(123)

示例数据集

data<- data.frame(
  id = 1:600, 
  a = sample(1:1000, size = 600, replace = TRUE), 
  b = rbinom(600, 1, .8), 
  c = rbinom(600, 100, .3), 
  d = sample(c(1:5), 600, replace = TRUE), 
  e = rpois(600, 4), 
  y = rnorm(600, 70, sd=15)
)

通过删除 ID 列和结果“y”创建仅包含特征/变量的数据框

data_x<-data %>%
  select(-c("id", "y"))

创建 3 个学习器,每个学习器使用不同的算法/方法和不同的特征子集。第一个学习者使用 glm 和特征 a、b 和 c。第二个学习器使用 LASSO 回归和特征 b、d 和 e,第三个学习器使用具有所有默认超参数和特征 a、c、d 和 e 的随机森林。

L1 = function(...) {
  SL.glm(..., X=L1_data)
}

L1_data<-data %>%
  select("a", "b", "c")

L2 = function(...) {
  SL.glmnet(..., X=L2_data, alpha = 1)
}

L2_data<-data %>%
  select("b", "d", "e")


L3<-function(...) {
  SL.ranger(..., X=L3_data)  
}

L3_data<-data %>%
  select("a", "c", "d", "e")

毫不奇怪,未能在 CV.SuperLearner 命令中定义“X”参数会产生错误。

cv.SL_1 = CV.SuperLearner(Y=data$y, family = gaussian(), 
                         V=10, 
                         SL.library = c("L1", "L2", "L3"))

#> Error in CV.SuperLearner(Y = data$y, family = gaussian(), V = 10, SL.library = c("L1", : argument "X" is missing, with no default

但是在CV.SuperLearner命令中定义 X 也会产生错误,因为现在 X 已经定义了两次。(为了大家的理智,我删除了大部分重复的警告和错误。)

cv.SL_2 = CV.SuperLearner(Y=data$y, X=data_x, family = gaussian(), 
                        V=10, 
                        SL.library = c("L1", "L2", "L3"))

#> Error in SL.glm(..., X = L1_data) : 
#>   formal argument "X" matched by multiple actual arguments
#> Warning in FUN(X[[i]], ...): Error in algorithm L1 
#>   The Algorithm will be removed from the Super Learner (i.e. given weight 0)
#> Error in SL.glmnet(..., X = L2_data, alpha = 1) : 
#>   formal argument "X" matched by multiple actual arguments
#> Warning in FUN(X[[i]], ...): Error in algorithm L2 
#>   The Algorithm will be removed from the Super Learner (i.e. given weight 0)
#> Error in SL.ranger(..., X = L3_data) : 
#>   formal argument "X" matched by multiple actual arguments
#> Warning in FUN(X[[i]], ...): Error in algorithm L3 

reprex 包于 2020-11-09 创建(v0.3.0)

标签: rensemble-learningsuperlearner

解决方案


没关系,我想出了如何在 SuperLearner 包中编写适当的筛选算法。下面的简短示例。

L1 <- function(X,...){
  returnCols <- rep(FALSE, ncol(X))
  returnCols[names(X) %in% c("a","b","c")] <- TRUE
  return(returnCols)
}

cv.SL_1 = CV.SuperLearner(Y=data$y, family = gaussian(), 
                         V=10, 
                         SL.library = list(c("SL.glm","L1"),
                                            ("SL.glm", "All"))
)

推荐阅读