如何使用Tidymodels为响应变量多层级(如各城市)分别构建模型
Tidymodels多城市批量建房价预测模型方案
你想要的按分组批量建模的需求可以通过嵌套数据框+map函数的组合实现,完全不需要手动拆分数据框,是tidymodels生态下的标准实现方式,逻辑和你设想的group_by后批量运行模型一致。
实现步骤
- 加载依赖包
library(tidyverse) library(tidymodels)
- 按城市分组嵌套数据
将你的多城市数据集按City字段分组后,把每个城市对应的子数据集存入列表列中:
- 按城市分组嵌套数据
nested_data <- your_multi_city_data %>% group_by(City) %>% nest()
运行后得到的nested_data每行对应一个城市,data列存储该城市的全部住房数据。
- 定义模型规格
和你之前写的单个模型定义逻辑完全一致:
- 定义模型规格
rf_spec <- rand_forest(mode = "regression", mtry = 3, trees = 1000) %>% set_engine("ranger")
- 批量拟合每个城市的模型
通过purrr::map遍历每个城市的子数据集,批量运行拟合逻辑:
- 批量拟合每个城市的模型
city_models <- nested_data %>% mutate( # 对每个城市的子数据集拟合模型 model = map(data, ~ fit( object = rf_spec, formula = log10(Sale_Price) ~ Longitude + Latitude + Lot_Area + Neighborhood + Year_Sold, data = .x )), # 可扩展:批量生成预测结果 predictions = map2(model, data, ~ predict(.x, new_data = .y)), # 可扩展:批量计算模型指标 metrics = map2(predictions, data, ~ metrics(.y, truth = log10(Sale_Price), estimate = .pred)) )
运行后你得到的city_models数据框每行对应一个城市,会包含该城市的原始数据、拟合好的独立模型、预测结果、模型评估指标,完全满足你每个城市单独建模的需求。
额外说明
如果你有数据预处理需求,也可以先定义好workflow(把预处理步骤和模型都封装进去),再按上面的逻辑批量fit即可,用法和单个模型完全一致。如果需要给不同城市配置不同的模型参数,也可以在嵌套数据框中新增参数列,用map2/pmap传递参数即可,灵活性很高。
内容的提问来源于stack exchange,提问作者HITHERE
相关产品推荐
相关产品推荐

