You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Facebook Prophet输出拟合时间序列数据?拟合曲线异常及数据列匹配问题求助

解决Facebook Prophet提取拟合线(深蓝色线)的问题

我来帮你理清这个问题,你遇到的核心点是Prophet自带绘图里的深蓝色线是模型对训练数据的拟合值,而你直接用整个forecast['yhat']会包含历史拟合+未来预测两部分,另外你的测试代码用了scatter(散点)而不是plot(线),所以才会出现混淆。

问题原因拆解

  1. 深蓝色线的本质:Prophet的model.plot(forecast)里的深蓝色线,是模型对你输入的训练数据df的拟合结果,对应forecast中与df的日期范围完全重合的那些行的yhat值——而forecast是包含了历史训练期+未来预测期的完整数据集,所以直接用整个forecast['yhat']会把未来预测的部分也画进去。
  2. 两条橙色线的疑惑:你的测试代码用了plt.scatter来绘制yhat,这会生成散点而非线。你看到的“两条橙色线”大概率是视觉误解:其实是原始数据的散点(df['y'])和forecast['yhat']的散点(包含历史+未来)重叠或相邻导致的,或者你可能不小心重复调用了绘制yhat的代码。

正确提取并绘制拟合线的方法

要得到和Prophet绘图中完全一致的深蓝色拟合线,你需要:

  1. 从forecast中筛选出仅属于训练期的行;
  2. 用plt.plot来绘制线(而不是散点),这样就能匹配Prophet自带的线条样式。

修改后的代码如下:

import matplotlib.pyplot as plt
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot

# 你的原有代码
model = Prophet(yearly_seasonality=4)
model.fit(df)
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)

# 提取训练期的拟合数据(对应深蓝色线)
train_forecast = forecast[forecast['ds'].isin(df['ds'])]

# 绘制对比图
fig=plt.figure(figsize=(10, 6))
# 原始数据散点
plt.scatter(df['ds'], df['y'], label='Original Data', alpha=0.5)
# 拟合线(深蓝色,和Prophet绘图一致)
plt.plot(train_forecast['ds'], train_forecast['yhat'], color='darkblue', label='Fitted Line')
plt.xlabel('Date')
plt.ylabel('Total daily sales (£)')
plt.legend()
plt.show()

额外说明

  • 如果你想同时查看未来预测的部分,只需要把整个forecast的yhat用线画出来,训练期的部分就是深蓝色线的延伸,未来部分是预测线:
plt.plot(forecast['ds'], forecast['yhat'], color='darkblue', label='Fitted + Predicted Line')
  • forecast里的yhat确实是模型的预测/拟合值,只是你之前没有筛选训练期的数据,且用了散点绘制,所以和预期的深蓝色线不匹配。

内容的提问来源于stack exchange,提问作者roudan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:19:05