You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模型场景下如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:31