Granite TimeSeries FlowState R1多步预测与滚动预测实战详解做时间序列预测比如预测接下来几个月的销售额我们经常会遇到一个选择难题是直接一口气预测未来好几个时间点还是像下棋一样走一步看一步用上一步的预测结果来推下一步这两种方法就是今天要聊的“多步预测”和“滚动预测”。听起来有点绕别担心咱们用大白话来说。多步预测就像是你站在现在直接眺望未来一周的天气一口气给出七天的预报。而滚动预测呢是你先预测明天的天气然后假设这个预测是准的再基于这个“明天的天气”去预测后天如此循环。这两种方法到底哪个好没有标准答案得看你的具体场景。今天我就用 Granite TimeSeries FlowState R1 这个模型结合一个销售预测的数据集带大家亲手实现这两种策略。我会把代码掰开揉碎了讲对比它们的优缺点帮你搞清楚在什么情况下该用哪种方法。1. 环境准备与数据初探在开始写代码之前我们得先把“厨房”收拾好把“食材”准备好。这里我们用 Python因为它生态丰富做数据分析预测特别方便。1.1 安装必要的工具包首先确保你安装了 Python建议 3.8 或以上版本。然后我们通过 pip 安装几个核心的库。打开你的终端或命令行输入以下命令pip install pandas numpy matplotlib scikit-learn简单解释一下这几个库是干嘛的pandas处理表格数据的神器读数据、清洗数据都靠它。numpy进行数学运算的基础库很多其他库都依赖它。matplotlib画图工具预测结果好不好画出来一看便知。scikit-learn机器学习常用库我们这里主要用它来拆分数据集。至于 Granite TimeSeries FlowState R1 模型我们假设它已经以本地库或 API 的形式准备好了。为了教程的通用性我们会先构建一个简单的模拟预测函数来代表这个模型的核心预测能力。在实际项目中你只需要替换成真实的模型调用即可。1.2 加载并观察销售数据假设我们有一份sales_data.csv文件记录了某产品过去几年的月度销售额。我们先用 pandas 把它读进来看看。import pandas as pd import numpy as np import matplotlib.pyplot as plt # 加载数据 df pd.read_csv(sales_data.csv, parse_dates[date], index_coldate) print(数据前5行) print(df.head()) print(\n数据信息) print(df.info())运行这段代码你会看到数据的大致样子比如有多少行、有没有缺失值、销售额的统计信息等。如果数据里日期不是索引记得用set_index方法设置一下。时间序列分析日期索引是关键。接下来我们把数据画出来直观感受一下它的趋势和波动。plt.figure(figsize(12, 6)) plt.plot(df.index, df[sales], label月度销售额) plt.title(历史销售额趋势) plt.xlabel(日期) plt.ylabel(销售额) plt.legend() plt.grid(True) plt.show()这张图能告诉你很多信息销售额整体是在增长还是下降有没有明显的季节性波动比如每年特定月份销量高有没有一些异常的尖峰或低谷理解这些模式对后续选择预测策略很有帮助。2. 理解多步预测与滚动预测在动手写代码之前我们得把这两个概念彻底弄明白。这就像学武功得先知道招式的原理。2.1 多步预测一步到位看未来多步预测也叫“直接多步预测”。它的思路非常直接模型利用过去一段时间的历史数据比如过去12个月的销售额直接输出未来多个时间点的预测值比如接下来3个月的销售额。它的工作方式是这样的你告诉模型“这是过去 X 个月的数据。”你问模型“那么未来 Y 个月的数据会是多少”模型经过计算一次性给你 Y 个预测值。优点简单直接逻辑清晰实现起来相对容易。预测独立未来每一步的预测都只依赖于真实的历史数据不会受到前面预测误差的影响。也就是说第二步预测不准不会连带导致第三步更不准。计算效率高对于很多模型只需要运行一次推理就能得到所有未来时间点的预测。缺点忽略序列依赖它假设未来各点之间的依赖关系不强或者模型有能力直接捕捉这种长期依赖。对于未来点之间关联性很强的序列比如明天的销量严重依赖今天的销量这可能是个问题。长期预测可能不准预测的时间跨度Y越大模型需要“眺望”得越远不确定性通常越高准确度可能下降。2.2 滚动预测步步为营迭代向前滚动预测也叫“递归预测”或“迭代多步预测”。它的策略更像一个“接力赛”模型用历史数据预测出下一个时间点t1的值。然后把这个预测值当作已知的真实数据和历史数据拼接在一起。用这个新的、包含了预测值的数据序列再去预测下一个时间点t2。重复这个过程直到预测出所有需要的未来点。优点符合序列逻辑它模拟了真实世界的时间推移过程下一步总是基于当前包括预测的当前状态。这对于自相关性强的序列如股票价格、气温更自然。模型要求单一你只需要一个能做好“单步预测”的模型就可以通过循环实现多步预测不需要模型本身具备复杂的多步输出结构。缺点误差累积这是最大的问题。如果第一步预测有误差这个误差会被带入第二步的输入中导致第二步的输入已经不是“真实”状态了从而可能产生新的误差。如此循环误差可能会像滚雪球一样越来越大。计算量较大需要循环调用模型 Y 次才能得到 Y 个预测值。依赖模型稳定性要求模型在接收了部分预测值作为输入后依然能保持较好的预测性能。为了更直观我们可以看下面这个对比表格特性多步预测滚动预测核心思想一次性输出所有未来点用上一步预测结果推下一步预测关系各未来点预测相对独立未来点预测相互依赖、迭代误差传播无累积效应误差会累积和放大计算次数通常1次需要循环预测步数次适用场景未来点间依赖较弱或模型能直接建模长期依赖序列自相关性强下一步高度依赖上一步3. 构建模拟预测模型由于 Granite TimeSeries FlowState R1 可能是一个特定的商业或研究模型其具体调用方式各异。为了保证教程的通用性和可复现性我们这里用一个简单的模拟函数来代表它的预测能力。这个函数基于历史数据的加权移动平均来生成预测虽然简单但足以清晰演示两种策略的代码逻辑差异。在实际应用中你只需要将granite_predict函数替换为调用真实 Granite 模型的代码即可。def granite_predict(history_sequence, forecast_horizon1): 模拟 Granite 模型的预测函数。 参数: history_sequence: 一维数组历史时间序列数据。 forecast_horizon: 整数需要预测的未来步数。 返回: 一维数组长度为 forecast_horizon 的预测值。 # 这里用一个简单的加权移动平均作为模拟逻辑 # 更近期的数据权重更高 weights np.exp(np.linspace(-1, 0, len(history_sequence))) weights / weights.sum() current_trend np.dot(history_sequence, weights) # 加入一点简单的季节性假设例如假设有轻微的月度波动 # 这里为了简化我们用一个很小的正弦波模拟季节性 seasonal_component 0.1 * np.sin(2 * np.pi * np.arange(forecast_horizon) / 12) # 生成预测趋势 季节性 一点随机噪声 base_forecast np.full(forecast_horizon, current_trend) predictions base_forecast seasonal_component np.random.normal(0, 0.05, forecast_horizon) return predictions # 测试一下模拟函数 sample_history df[sales].iloc[-12:].values # 取最后12个月作为历史数据 print(历史数据最后12个月:, sample_history) print(模拟预测未来3个月:, granite_predict(sample_history, 3))这个函数接受一段历史序列和要预测的步数返回预测值。它的内部逻辑加权平均季节性噪声只是为了演示你的真实 Granite 模型会有复杂得多的算法。4. 实现多步预测策略现在我们来实战多步预测。假设我们要用过去24个月的数据来预测未来6个月的销售额。4.1 数据准备与划分首先我们需要从完整数据中划分出训练序列用于预测的历史数据和测试序列用于验证的真实未来数据。# 定义参数 look_back 24 # 使用过去24个月的数据 forecast_steps 6 # 预测未来6个月 # 准备数据序列 full_series df[sales].values total_length len(full_series) # 划分一个用于演示的区间 # 假设我们取倒数第 (look_back forecast_steps) 个数据点之前的一段作为历史之后的一段作为待预测的真实值 split_point total_length - (look_back forecast_steps) train_series full_series[split_point: split_point look_back] true_future full_series[split_point look_back: split_point look_back forecast_steps] print(f用于预测的历史数据形状: {train_series.shape}) print(f用于验证的真实未来数据形状: {true_future.shape}) print(f历史数据最后{look_back}个月: {train_series[-5:]}...) # 看最后5个 print(f真实未来数据: {true_future})4.2 执行多步预测数据准备好了预测就是一行代码的事因为我们的granite_predict函数本身就支持多步输出。# 执行多步预测 multi_step_forecast granite_predict(train_series, forecast_horizonforecast_steps) print(多步预测结果:, multi_step_forecast) print(真实未来值:, true_future)看这就是多步预测的简洁之处。模型一次性给出了未来6个月的数值。我们把它和真实值放在一起比较一下。# 可视化对比 future_index pd.date_range(startdf.index[split_point look_back], periodsforecast_steps, freqM) plt.figure(figsize(10, 6)) plt.plot(df.index[split_point: split_point look_back], train_series, label历史数据, colorblue) plt.plot(future_index, true_future, label真实未来值, colorgreen, markero) plt.plot(future_index, multi_step_forecast, label多步预测值, colorred, linestyle--, markers) plt.title(多步预测结果对比) plt.xlabel(日期) plt.ylabel(销售额) plt.legend() plt.grid(True) plt.show()从图上你可以直观地看到预测线红色虚线和真实线绿色实线的接近程度。可以计算一些误差指标比如平均绝对误差MAE来量化预测精度。from sklearn.metrics import mean_absolute_error mae_multi_step mean_absolute_error(true_future, multi_step_forecast) print(f多步预测的平均绝对误差(MAE): {mae_multi_step:.2f})5. 实现滚动预测策略接下来我们实现滚动预测。逻辑会比多步预测稍复杂一些因为我们需要一个循环。5.1 初始化与循环预测滚动预测的关键在于每次预测后都要更新“历史数据”窗口将最新的预测值追加进去并移除最旧的一个值保持窗口长度不变。def rolling_forecast(model_func, initial_history, steps): 执行滚动预测。 参数: model_func: 预测函数接受历史序列返回下一个或几个预测值。 initial_history: 一维数组初始的历史数据窗口。 steps: 整数要滚动预测的步数。 返回: 一维数组滚动预测的结果。 forecasts [] history_window list(initial_history.copy()) # 复制初始窗口避免修改原数据 for i in range(steps): # 将当前历史窗口转换为数组供模型使用 current_input np.array(history_window) # 使用模型预测下一步。注意我们的granite_predict可以返回多步但滚动预测通常一次只取第一步。 # 这里为了通用性我们假设模型返回一个数组我们取第一个元素作为下一步预测。 next_pred model_func(current_input, forecast_horizon1)[0] forecasts.append(next_pred) # 更新历史窗口加入预测值移除最旧的值 history_window.append(next_pred) history_window.pop(0) return np.array(forecasts) # 使用相同的初始历史数据执行滚动预测 rolling_forecast_result rolling_forecast(granite_predict, train_series, forecast_steps) print(滚动预测结果:, rolling_forecast_result) print(真实未来值:, true_future)5.2 结果对比与分析现在我们把两种方法的结果放在一起比较。# 合并可视化 plt.figure(figsize(12, 7)) plt.plot(df.index[split_point: split_point look_back], train_series, label历史数据, colorblue) plt.plot(future_index, true_future, label真实未来值, colorgreen, markero, linewidth2) plt.plot(future_index, multi_step_forecast, label多步预测, colorred, linestyle--, markers) plt.plot(future_index, rolling_forecast_result, label滚动预测, colororange, linestyle-., marker^) plt.title(多步预测 vs. 滚动预测 结果对比) plt.xlabel(日期) plt.ylabel(销售额) plt.legend() plt.grid(True) plt.show() # 计算滚动预测的误差 mae_rolling mean_absolute_error(true_future, rolling_forecast_result) print(f滚动预测的平均绝对误差(MAE): {mae_rolling:.2f}) print(f多步预测的MAE: {mae_multi_step:.2f})通过对比图和误差值你可以清晰地看到两种策略在这个数据集上的表现差异。也许滚动预测的误差线更平稳但累积误差导致后期偏离更大也许多步预测整体更接近真实值。这个结果没有定论完全取决于你的数据和模型特性。6. 如何选择与实战建议跑完了代码看完了对比到底该怎么选呢我结合自己的经验给大家几点实用的建议。首先看数据本身的特性。如果你的时间序列表现出很强的“惯性”或者“记忆性”也就是今天的值高度依赖于昨天、前天的值比如能源消耗、网站日活用户数那么滚动预测可能更合适因为它模拟了这种一步步的依赖关系。反之如果序列相对独立或者具有明显的长期周期规律比如某些受年度合同影响的销售额多步预测可能更能把握整体趋势。其次考虑预测的长度。如果需要预测的未来步数很多长期预测多步预测的误差累积风险相对较小因为它的每一步预测都是基于原始真实数据。而滚动预测在长期预测中误差雪球会越滚越大可能导致后期预测完全偏离轨道。对于短期预测比如未来3-5步滚动预测有时能更好地捕捉近期动态。最后想想业务需求。有些业务场景需要未来所有时间点的预测同时做出决策比如制定季度生产计划这时候多步预测的一次性输出更方便。而有些场景是渐进式决策走一步看一步比如动态定价滚动预测的迭代过程与之更匹配。在实际项目中一个稳妥的做法是两种方法都试试。就像我们今天做的这样用历史数据中的一段做“模拟预测”然后用紧接着的真实数据去验证看看哪种方法的误差更小哪种方法预测出的曲线形态更符合你的业务直觉。很多时候没有银弹最佳方案来自于实验和对比。另外别忘了模型的特性。像 Granite TimeSeries FlowState R1 这类高级模型其内部可能已经融合了复杂的序列建模能力。你需要查阅它的文档了解它原生支持哪种预测模式。如果它原生支持高效、准确的多步输出那直接使用它的多步预测功能可能是最优解。如果它更擅长单步预测那么围绕它构建滚动预测流程就是更合理的选择。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。