先知预测数据与观测数据不符

问题描述 投票:0回答:1

背景

我正在尝试使用 python 中的 Prophet 库对办公室出勤进行建模。我的数据非常简单,每隔 15 分钟统计一次人数。如下图中的黑点所示。

每日和每周趋势看起来很准确:

我还包括了假期。

代码如下所示:

m = Prophet(holidays=holidays, weekly_seasonality=True, growth="flat")  # "logistic")
p_df = sdf[["OCCUPANCY_AVG"]].reset_index()
p_df.columns = ["ds", "y"]
p_df["cap"] = 180
df["floor"] = 0
m.fit(p_df)

future = m.make_future_dataframe(periods=24 * 60, freq="H")
future["cap"] = 180
future["floor"] = 0
# future.tail()

forecast = m.predict(future)
# forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail()

fig1 = m.plot(forecast, xlabel="Date", ylabel="Headcount", include_legend=True)
# %%
fig2 = m.plot_components(forecast)

问题

这里有几件事我并不感到兴奋:

  • 在现实生活中,预测数据不会出现负数
  • 观察到的数据峰值甚至远高于不确定性区间

如何使模型尊重其预测的数量不能为负数,并使其适合输入数据?

python facebook-prophet
1个回答
1
投票

本,

根据我的经验,先知不能很好地处理少于几年的数据(因为先知模型方程设计)。这可以从模型文档中看出,在所有示例中,他们都试图预测多年趋势和季节性。

回到你的问题。您的数据处于正域(从零到

inf
),但是先知使用正态分布的线性模型(理论上从[
-inf
inf
]分布)。在很多情况下,这不会影响模型性能。但在您的数据集中,模型尝试预测有很多零。为此,需要将正态分布的均值向下移动很多(这也会导致峰值的错误预测)。基本上这就是错误预测的原因。

我建议转换您的数据以更好地适应先知模型定义。尝试对出勤率进行对数转换:log(1 + cnt_attendances)。然后对出勤日志进行建模。理论上,这种转变应该可以解决您的两个错误。

© www.soinside.com 2019 - 2024. All rights reserved.