使用map()调用GAM模型失败,LM模型可正常运行的问题求助
问题:crossv_mc批量训练GAM模型失败,LM模型正常
- 场景:使用
modelr::crossv_mc拆分mtcars数据集,用purrr::map批量训练模型时,LM模型可以正常运行,但GAM模型报错。单独调用gam(mpg~wt, data=mtcars)则正常。
原因
crossv_mc生成的train列里的对象是resample类(并非普通数据框),lm函数内部会自动识别并转换这类对象为数据框,但mgcv::gam不会做这个自动转换,它要求data参数必须是标准数据框类型。
解决方法
方法1:手动将resample对象转为数据框
修改GAM模型的定义函数,把传入的df用as.data.frame()转换:
fn_model <- function(df){ mgcv::gam(mpg ~ wt, data = as.data.frame(df)) } df_split_model <- df_split %>% mutate(model = map(train, fn_model)) %>% print()
方法2:使用modelr的model_train函数
modelr包提供的model_train函数可以自动处理resample对象,无需手动转换:
fn_model <- function(df){ model_train(df, mpg ~ wt, mgcv::gam) } df_split_model <- df_split %>% mutate(model = map(train, fn_model)) %>% print()
验证
运行上述修正后的代码,GAM模型就能像LM模型一样批量训练成功了。
内容的提问来源于stack exchange,提问作者adrianmnc
相关产品推荐
相关产品推荐

