r - 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)
解决方案
没关系,我想出了如何在 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"))
)
推荐阅读
- javascript - 插入嵌套数组后 Redux 状态消失
- swift - 在 Swift 中达到视频录制持续时间后如何处理警报?
- python - numpy 数字化二维直方图
- android - 键盘打开时如何聚焦 Edit-Text?
- ios - 在 tableView 中对 Int 类型的数组进行排序
- kubernetes - Kubernetes 操作员可以监视 PVC 中的文件吗
- ios - 尝试调试 Qt iOS 应用程序时 tryRemoteConnect *失败*
- macos - OSX Big Sur 11.2.3 毫秒时间戳显示为全零
- statistics - 如何使用 rbinom 在 R 中建模 polya urn 模型?
- java - 通过在 Thymeleaf 中使用 for each 循环打印有序列表中的无序列表