寻找更整洁的模型工作流程来生成预测和其他数据
Finding a tidier tidy model workflow for generating predictions plus other data
我想知道如何制作这个 "tidy model" 代码 "cleaner"。
通常我会拟合一个模型并在一个包装函数中提供预测,但有时我想从拟合或预测中传回其他数据(模型本身、元数据或拟合值等)。这是一个返回的列表。将此结果作为附加列传回的最简洁方法是什么,列表中的每个元素一个(这里是 yhat_fit
和 yhat
),带有管道
library(tidymodels)
y_s <- vfold_cv(mtcars, 5)
fit_model <- function(x) {
model <- lm(mpg ~ hp, data = analysis(x))
yhat <- predict(model, assessment(x))
list(yhat_fit = model$fitted.values, yhat = yhat)
}
# this is a problem:
out <- y_s %>% mutate(model = map(y_s$splits, fit_model))
# # A tibble: 5 x 3
# splits id model
# * <list> <chr> <list>
# 1 <split [25/7]> Fold1 <list [2]>
# 2 <split [25/7]> Fold2 <list [2]>
# 3 <split [26/6]> Fold3 <list [2]>
# 4 <split [26/6]> Fold4 <list [2]>
# 5 <split [26/6]> Fold5 <list [2]>
这是一个解决方案,但我不确定是否已经存在以更简洁的方式执行此操作的函数?
y_s2 <- bind_cols(y_s, as_tibble(transpose(out$model)))
# A tibble: 5 x 4
# splits id yhat_fit yhat
# <list> <chr> <list> <list>
# 1 <split [25/7]> Fold1 <dbl [25]> <dbl [7]>
# 2 <split [25/7]> Fold2 <dbl [25]> <dbl [7]>
# 3 <split [26/6]> Fold3 <dbl [26]> <dbl [6]>
# 4 <split [26/6]> Fold4 <dbl [26]> <dbl [6]>
# 5 <split [26/6]> Fold5 <dbl [26]> <dbl [6]>
这似乎是一种方法:将输出(内容列表)转换为列表列的小标题,然后取消嵌套。
fit_model2 <- function(x) {
model <- lm(mpg ~ hp, data = analysis(x))
yhat <- predict(model, assessment(x))
tibble(yhat_fit = list(model$fitted.values), yhat = list(yhat))
}
out <- y_s %>% mutate(model = map(y_s$splits, fit_model2)) %>% unnest(model)
# A tibble: 5 x 4
# splits id yhat_fit yhat
# <list> <chr> <list> <list>
#1 <split [25/7]> Fold1 <dbl [25]> <dbl [7]>
#2 <split [25/7]> Fold2 <dbl [25]> <dbl [7]>
#3 <split [26/6]> Fold3 <dbl [26]> <dbl [6]>
#4 <split [26/6]> Fold4 <dbl [26]> <dbl [6]>
#5 <split [26/6]> Fold5 <dbl [26]> <dbl [6]>
我想知道如何制作这个 "tidy model" 代码 "cleaner"。
通常我会拟合一个模型并在一个包装函数中提供预测,但有时我想从拟合或预测中传回其他数据(模型本身、元数据或拟合值等)。这是一个返回的列表。将此结果作为附加列传回的最简洁方法是什么,列表中的每个元素一个(这里是 yhat_fit
和 yhat
),带有管道
library(tidymodels)
y_s <- vfold_cv(mtcars, 5)
fit_model <- function(x) {
model <- lm(mpg ~ hp, data = analysis(x))
yhat <- predict(model, assessment(x))
list(yhat_fit = model$fitted.values, yhat = yhat)
}
# this is a problem:
out <- y_s %>% mutate(model = map(y_s$splits, fit_model))
# # A tibble: 5 x 3
# splits id model
# * <list> <chr> <list>
# 1 <split [25/7]> Fold1 <list [2]>
# 2 <split [25/7]> Fold2 <list [2]>
# 3 <split [26/6]> Fold3 <list [2]>
# 4 <split [26/6]> Fold4 <list [2]>
# 5 <split [26/6]> Fold5 <list [2]>
这是一个解决方案,但我不确定是否已经存在以更简洁的方式执行此操作的函数?
y_s2 <- bind_cols(y_s, as_tibble(transpose(out$model)))
# A tibble: 5 x 4
# splits id yhat_fit yhat
# <list> <chr> <list> <list>
# 1 <split [25/7]> Fold1 <dbl [25]> <dbl [7]>
# 2 <split [25/7]> Fold2 <dbl [25]> <dbl [7]>
# 3 <split [26/6]> Fold3 <dbl [26]> <dbl [6]>
# 4 <split [26/6]> Fold4 <dbl [26]> <dbl [6]>
# 5 <split [26/6]> Fold5 <dbl [26]> <dbl [6]>
这似乎是一种方法:将输出(内容列表)转换为列表列的小标题,然后取消嵌套。
fit_model2 <- function(x) {
model <- lm(mpg ~ hp, data = analysis(x))
yhat <- predict(model, assessment(x))
tibble(yhat_fit = list(model$fitted.values), yhat = list(yhat))
}
out <- y_s %>% mutate(model = map(y_s$splits, fit_model2)) %>% unnest(model)
# A tibble: 5 x 4
# splits id yhat_fit yhat
# <list> <chr> <list> <list>
#1 <split [25/7]> Fold1 <dbl [25]> <dbl [7]>
#2 <split [25/7]> Fold2 <dbl [25]> <dbl [7]>
#3 <split [26/6]> Fold3 <dbl [26]> <dbl [6]>
#4 <split [26/6]> Fold4 <dbl [26]> <dbl [6]>
#5 <split [26/6]> Fold5 <dbl [26]> <dbl [6]>