简单线性回归模型的滚动窗口(每50天)迭代训练、预测及变量重要性留存方案咨询
刚好帮你搞定这个滚动窗口训练+预测的需求,还能同步保存每个窗口的变量重要性,一步步来哈:
实现步骤与代码
1. 数据准备(保留日期列)
首先我们先保留原始数据的date列(后续要用来划分窗口),不用提前删除:
library(data.table) set.seed(123) days <- 50 # 创建示例数据 dt.data <- data.table( date = seq(as.Date('2020-01-01'), by = '1 day', length.out = 366), "DE" = rnorm(366, 35, 1), "Wind" = rnorm(366, 5000, 2), "Solar" = rnorm(366, 3, 2), "Nuclear" = rnorm(366, 100, 5), "ResLoad" = rnorm(366, 200, 3), check.names = FALSE )
2. 划分滚动窗口
我们把整个数据集分成连续的50天块(最后一块如果不足50天也会自动覆盖到年末),并给每行标记所属的窗口ID:
# 计算每个窗口的起始索引 window_starts <- seq(1, nrow(dt.data), by = days) window_ends <- c(window_starts[-1] - 1, nrow(dt.data)) # 给每行分配窗口ID dt.data[, window_id := findInterval(date, dt.data$date[window_starts]) + 1]
3. 定义窗口处理函数
这个函数会处理单个窗口的:模型训练、预测、变量重要性计算(重点解决特征量纲差异问题):
process_window <- function(window_data) { # 分离日期列和建模数据 date_list <- window_data$date model_df <- window_data[, !c("date", "window_id")] # 训练线性模型 lm_model <- lm(DE ~ . - 1, data = model_df) # 生成当前窗口的预测值 preds <- predict(lm_model, newdata = model_df) # 计算标准化变量重要性(解决特征量纲差异问题) # 原始系数受特征量纲影响大,标准化后才能公平比较重要性 coef_raw <- coef(lm_model) feature_sds <- apply(model_df[, !"DE"], 2, sd) target_sd <- sd(model_df$DE) coef_std <- coef_raw * (feature_sds / target_sd) # 整理变量重要性表格 var_imp <- data.table( window_start = min(date_list), window_end = max(date_list), feature = names(coef_raw), raw_coefficient = coef_raw, standardized_coefficient = coef_std, importance_score = abs(coef_std) )[order(-importance_score)] # 按重要性降序排列 # 返回当前窗口的结果 list( predictions = data.table(date = date_list, prediction = preds), var_importance = var_imp ) }
4. 批量处理所有窗口并合并结果
用data.table的分组功能批量处理每个窗口,最后合并预测结果和变量重要性:
# 按窗口ID分组处理 window_results <- dt.data[, process_window(.SD), by = window_id] # 合并所有预测结果到原数据 all_preds <- rbindlist(window_results$predictions) dt.data <- merge(dt.data, all_preds, by = "date", all.x = TRUE) # 整理所有窗口的变量重要性 all_var_imp <- rbindlist(window_results$var_importance)
5. 结果验证与扩展
- 查看原数据的预测列:
head(dt.data[, .(date, DE, prediction)])
- 查看第一个窗口的变量重要性:
all_var_imp[window_start == as.Date("2020-01-01")]
- 如果需要保存每个窗口的模型,可以在
process_window函数里添加:
saveRDS(lm_model, paste0("lm_model_", min(date_list), ".rds"))
关键说明
- 窗口划分:采用块滚动窗口(每50天为一个独立块),完全符合你“用该时段数据训练并预测该时段”的需求;如果需要滑动窗口(比如每次滑动1天用过去50天预测下一天),可以调整窗口划分逻辑。
- 变量重要性:使用标准化系数而非原始系数,因为你的特征量纲差异极大(比如Wind均值5000,Solar均值3),原始系数无法公平反映特征对DE的影响程度。
内容的提问来源于stack exchange,提问作者Miko




