TensorFlow结构时间序列单步预测流程与代码正确性问询
关于时间序列结合特征建模的两个疑问解答
1. sts.LinearRegression使用全量特征是否是典型工作流?
绝对不是时间序列建模的标准工作流——这种做法会导致数据泄露,严重高估模型的实际性能。
时间序列建模的核心逻辑是“用过去的已知数据预测未来”,测试集对应模型训练时“尚未发生”的时段。如果建模时提前使用测试集的特征,本质上是让模型获取了未来的信息,完全违背了真实预测场景的逻辑。
官方Notebook这么做通常是两种情况:
- 仅作为演示示例,为了简化代码流程,没有严格遵循生产级的训练规范;
- 所用特征是静态特征(比如不会随时间变化的属性,如产品类别、地区编码),这类特征不存在“未来信息泄露”的问题,全量使用是安全的。但如果是动态特征(如滞后项、滚动统计量),全量使用就绝对错误。
2. 单步预测代码正确性判断
你没有提供具体代码,无法直接判断是否正确,但可以给你单步预测的标准实现逻辑作为参考:
- 先拆分训练集
(y_train, X_train)和测试集(y_test, X_test),必须保证测试集的时间节点晚于训练集; - 用
(y_train, X_train)拟合sts.LinearRegression模型; - 初始化预测结果列表,遍历测试集:
- 第一步:用
X_test[0, :]预测y_pred_0,加入结果列表; - 后续步骤:如果模型需要用上一步的真实观测值(比如特征包含y的滞后项),则将
y_test[i-1]代入构建新的特征向量,再结合X_test[i, :]中的其他特征进行预测;如果模型仅依赖X的当前特征,直接用X_test[i, :]预测即可;
- 第一步:用
- 最后用真实的
y_test和预测结果计算评估指标(MAE、RMSE等)。
标准单步预测伪代码示例
import tensorflow_probability as tfp import numpy as np tfp = tfp.substrates.numpy # 按时间顺序拆分训练测试集 train_size = int(0.8 * len(y)) y_train, y_test = y[:train_size], y[train_size:] X_train, X_test = X[:train_size], X[train_size:] # 拟合模型 model = tfp.sts.LinearRegression(design_matrix=X_train) posterior = tfp.sts.fit(model, y_train) # 执行单步预测 y_preds = [] for i in range(len(y_test)): if i == 0: # 第一步直接用测试集第一个样本的特征 pred_dist = posterior.predict(model, X_test[i:i+1]) else: # 若特征包含上一步的y观测值,需替换为真实值(示例假设最后一列是y滞后项) modified_X = X_test[i:i+1].copy() modified_X[0, -1] = y_test[i-1] pred_dist = posterior.predict(model, modified_X) # 取预测分布的均值作为预测结果 y_pred = pred_dist.mean().item() y_preds.append(y_pred) # 计算评估指标 mae = np.mean(np.abs(y_test - y_preds)) print(f"单步预测MAE: {mae:.4f}")
内容的提问来源于stack exchange,提问作者testing_dummy
相关产品推荐
相关产品推荐

