我正在尝试使用 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)
这里有几件事我并不感到兴奋:
如何使模型尊重其预测的数量不能为负数,并使其适合输入数据?
本,
根据我的经验,先知不能很好地处理少于几年的数据(因为先知模型方程设计)。这可以从模型文档中看出,在所有示例中,他们都试图预测多年趋势和季节性。
回到你的问题。您的数据处于正域(从零到
inf
),但是先知使用正态分布的线性模型(理论上从[-inf
,inf
]分布)。在很多情况下,这不会影响模型性能。但在您的数据集中,模型尝试预测有很多零。为此,需要将正态分布的均值向下移动很多(这也会导致峰值的错误预测)。基本上这就是错误预测的原因。
我建议转换您的数据以更好地适应先知模型定义。尝试对出勤率进行对数转换:log(1 + cnt_attendances)。然后对出勤日志进行建模。理论上,这种转变应该可以解决您的两个错误。