You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

简单线性回归模型的滚动窗口(每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

火山引擎 最新活动