多模型场景下如何用modelr区分训练/测试数据拟合与预测?
用modelr区分训练与测试数据的正确姿势
嘿,我来帮你搞定这个问题!你现在的代码确实把训练和测试数据混在一起用了——既用全部数据训练模型,又给全部数据生成了预测,这就违背了我们“用train数据拟合、test数据验证”的初衷。咱们来调整一下代码,严格区分训练数据和测试数据的用途:
步骤1:调整数据处理逻辑
我们需要从每个大洲的嵌套数据里,分别提取仅训练数据来拟合模型,再用仅测试数据生成预测值。具体代码如下:
library(modelr) library(tidyverse) library(gapminder) # 标记训练/测试数据,并按大洲嵌套 nested_gap <- gapminder %>% mutate(test_train = ifelse(year < 1992, "train", "test")) %>% group_by(continent) %>% nest() # 模型函数保持不变 cont_model <- function(df) { lm(lifeExp ~ year, data = df) } # 核心调整:拆分训练/测试数据,分别拟合和预测 fitted_gap <- nested_gap %>% # 提取每个大洲的训练子集 mutate(train_data = map(data, ~ filter(.x, test_train == "train")), # 用训练数据拟合模型 model = map(train_data, cont_model), # 提取每个大洲的测试子集 test_data = map(data, ~ filter(.x, test_train == "test")), # 用训练好的模型给测试数据生成预测 test_pred = map2(model, test_data, add_predictions))
步骤2:合并结果(可选)
现在fitted_gap里的test_pred就是每个大洲测试数据加上预测值的结果啦。如果你想把预测结果和原始数据合并,方便后续分析,可以再加一步:
# 合并预测结果与原始数据 final_gap <- fitted_gap %>% unnest(test_pred) %>% # 把训练数据也加回来,保留所有记录 bind_rows(unnest(train_data)) %>% # 整理列顺序,方便查看 select(continent, country, year, lifeExp, test_train, pred)
为什么之前的代码不对?
你之前把包含train和test的完整数据集传入了模型训练函数,导致模型是用全部数据训练的,之后又给全部数据生成了预测——这完全没有区分训练和测试数据的作用,达不到我们想要的“用训练集拟合、测试集验证”的效果。现在的调整就严格把训练数据用于建模,测试数据用于生成预测啦。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

