问题描述
我希望将每个使用不同功能和算法子集开发的学习器组合到一个SuperLearner中。我意识到这不是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,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","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,V = 10,: argument "X" is missing,with no default
但是在CV.SuperLearner
命令中定义X也会产生错误,因为现在X已经被定义了两次。 (出于所有人的理智,我删除了大多数重复的警告和错误。)
cv.SL_2 = CV.SuperLearner(Y=data$y,X=data_x,"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 package(v0.3.0)于2020-11-09创建
解决方法
没关系,我想出了如何在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"))
)