如何使用Facebook Prophet输出拟合时间序列数据?拟合曲线异常及数据列匹配问题求助
解决Facebook Prophet提取拟合线(深蓝色线)的问题
我来帮你理清这个问题,你遇到的核心点是Prophet自带绘图里的深蓝色线是模型对训练数据的拟合值,而你直接用整个forecast['yhat']会包含历史拟合+未来预测两部分,另外你的测试代码用了scatter(散点)而不是plot(线),所以才会出现混淆。
问题原因拆解
- 深蓝色线的本质:Prophet的
model.plot(forecast)里的深蓝色线,是模型对你输入的训练数据df的拟合结果,对应forecast中与df的日期范围完全重合的那些行的yhat值——而forecast是包含了历史训练期+未来预测期的完整数据集,所以直接用整个forecast['yhat']会把未来预测的部分也画进去。 - 两条橙色线的疑惑:你的测试代码用了
plt.scatter来绘制yhat,这会生成散点而非线。你看到的“两条橙色线”大概率是视觉误解:其实是原始数据的散点(df['y'])和forecast['yhat']的散点(包含历史+未来)重叠或相邻导致的,或者你可能不小心重复调用了绘制yhat的代码。
正确提取并绘制拟合线的方法
要得到和Prophet绘图中完全一致的深蓝色拟合线,你需要:
- 从
forecast中筛选出仅属于训练期的行; - 用
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
相关产品推荐
相关产品推荐

