预测未来 7 天结果怎么切验证集?按标签结束日期剔除跨界训练样本

预测未来7天累计结果时,一行训练样本的标签需要等到未来第7天才能确定。只按行日期把较早记录放进训练集,可能把验证开始之后才完成的标签带进去。下面给每条样本记录标签结束日期,并在每轮验证前剔除跨界训练行。

预测未来7天累计结果时,一行训练样本的标签需要等到未来第7天才能确定。只按行日期把较早记录放进训练集,可能把验证开始之后才完成的标签带进去。下面给每条样本记录标签结束日期,并在每轮验证前剔除跨界训练行。

准备环境与教学数据

以下代码已在 Windows 的 Python 3.11 独立环境运行。文中数据是人为构造或库自带的教学样本,不代表任何业务系统的效果;例子不调用在线大模型。

预测未来 7 天结果怎么切验证集?按标签结束日期剔除跨界训练样本

在空目录安装依赖,把完整代码保存为 demo.py,运行 python demo.py。使用现有 Python 环境时,先核对依赖版本。

python -m pip install numpy==2.4.6 scikit-learn==1.9.1

先把标签覆盖区间写出来

人为生成40天等间隔数据:第 i 天的输入只有当天已知的 signal,标签是随后7天 signal 的和,因此 label_end=i+7。可形成标签的原点是第0至32天。这里不用未来 signal 当特征,只用它构造事后才可得到的教学标签。

第20天开始验证时,原点为第19天的训练候选标签要到第26天才结束,不能在第20天用于训练。代码保守地要求 train_label_end 小于验证首日;真实业务还要把数据到达、审核和发布延迟纳入可用时点。

逐轮剔除并保留证据

演示两轮验证,起点分别为第20和26天,每轮验证4天。程序列出剔除条数、保留训练条数、最后一个保留标签结束日和验证起点,并断言边界成立。随后仅用保留行拟合一个 LinearRegression,打印教学 MAE。

这与只按时间索引做一步预测的情况不同:关键是标签本身跨越多天。若目标窗口长度改变,就按每行真实标签结束日重新计算,不能机械复用 gap=7。

完整可运行代码

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

days = np.arange(40)
signal = 10 + 0.2 * days + np.sin(days / 3)
horizon = 7
origin = np.arange(len(days) - horizon)
label_end = origin + horizon
X = signal[origin].reshape(-1, 1)
target = np.array([signal[i+1:i+horizon+1].sum()
                   for i in origin])
for valid_start in [20, 26]:
    valid = np.flatnonzero((origin >= valid_start) &
                           (origin < valid_start + 4))
    candidates = np.flatnonzero(origin < valid_start)
    train = candidates[label_end[candidates] < valid_start]
    removed = len(candidates) - len(train)
    assert len(valid) == 4 and len(train) > 0
    assert int(label_end[train].max()) < int(origin[valid].min())
    model = LinearRegression().fit(X[train], target[train])
    score = mean_absolute_error(target[valid], model.predict(X[valid]))
    print("validation_start", valid_start,
          "train_rows", len(train), "purged_rows", removed,
          "last_train_label_end", int(label_end[train].max()),
          "mae", round(float(score), 3))

运行结果与核对

下列是本文代码在上述环境的实际输出。更换运行环境时,先核对输入、代码和断言,再比较输出数值。

validation_start 20 train_rows 13 purged_rows 7 last_train_label_end 19 mae 23.3
validation_start 26 train_rows 19 purged_rows 7 last_train_label_end 25 mae 6.91

两轮的 last_train_label_end 都必须早于 validation_start,且 purged_rows 大于0。自己替换数据时,逐行保存标签开始、结束和真正可用时间,再核对训练样本的标签在预测切点前已经能看到;只有行号递增还不够。

适用边界

本例是40天人工信号和固定7天窗口,没有模拟周末、缺失日期或数据发布延迟。输出 MAE 只是教学结果;若特征计算也包含未来窗口,即使标签剔除正确仍会泄漏。

常见问题

直接设置 TimeSeriesSplit(gap=7) 足够吗?

只有在样本等间隔、每行标签跨度和可用延迟恰好符合该行数时才可能合适。按每行标签结束时间核对边界更清楚;不规则时间或可变窗口需要按日期处理。

参考资料

以下接口行为依据官方文档核对于 2026 年 10 月 1 日;本文的运行结果仅覆盖上述教学输入。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31751.html

赞 (0)
AI小管家的头像AI小管家
同一用户多条记录怎么验证模型?用 GroupKFold 保持逐折用户隔离
上一篇 2小时前
分类模型调参工具怎么选?同一搜索预算比较 GridSearchCV 与 RandomizedSearchCV
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部