本指南将根据真实项目的镜头,给出批判性意见,帮助您判断先知是否适合您的预测项目。我们从三个主要方面对其进行了测试:特征工程和建模、可解释性和维护。.
我们在一个实际项目中对先知进行了测试,主要涉及三个方面:功能工程、可解释性以及在生产和维护中的使用,以下是我们的结论:
特征工程和建模:
可解释性:
结果的稳定性/维护:
导言
最近、, 一篇文章 指出 脸书先知 在某些边缘情况下表现不佳。事实上,这个软件包是如此受欢迎,以至于它往往被认为是所有预测用例的必备工具。这在社区内引发了一场争论 甚至连创作者都做出了反应.
关于如何使用先知进行单次预测的文献很多。但在需要每天进行预测的情况下,它在生产中的表现如何,却缺乏实证反馈。我们在一个实际业务项目中对该工具进行了 6 个月的测试和验证。以下是一些收获。.
一个重要的制约因素是需要 可解释性 的结果。事实上,我们的预测结果是由人工计划人员使用的,他们的目标是维持服务水平协议(在给定时间内必须接听 X% 的电话),同时最大限度地降低成本。他们的工作包括 3 项任务:
主页 呼叫司机 因 SKU 而异。例如,商业援助驱动程序包括
我们的时间序列具有很强的季节性,并遵循经济周期。它们不是静态的。在这种情况下,先知是一个合适的选择。我们选择对它以及其他 ML 算法进行测试 经常用于这项工作.
特征工程和建模
Prophet 有许多不可否认的优势,这些优势对于以业务为导向的预测项目尤为有用,也充分证明了其受欢迎的理由。.
其中之一是 易于使用。. 只需几行代码和 几乎没有功能工程 以获得良好的基线。要进一步了解它的工作原理和使用方法,请阅读 这条 Twitter 消息 以及 这篇出色的博文 (与 代码).
时间特征、, 如趋势和季节性 是原生创建的--排除了滚动平均值、滞后值以及基于机器学习(ML)的树型模型所需的其他棘手特征。.
不过,如果有多个事件干扰信号,微调起来会很麻烦。.
趋势
与自回归模型(如 ARIMA)相比,先知的一大优势是 不需要静止时间序列趋势部分:本机生成趋势部分。.
因此,先知 对中期预测非常有效 (我们在 M+5 地平线上进行了尝试),尽管置信区间相当大。.
可正确估计趋势 无需任何外部 data (如客户数量)。这个功能非常强大,因为在预测电话到达时,您不知道 5 个月后会有多少客户,所以无法使用这个功能。.
例如,这幅图显示了光纤互联网(FIO)客户数量随时间变化的情况(对于我们电信公司来说,这是一个不断增长的市场),并与先知通过通话量了解到的趋势成分进行了对比。通话量与客户数量之间存在很强的相关性(皮尔逊系数:0.988)。因此,模型 洞悉趋势, ,而且只能来自时间序列本身。.
我们确定了一些技巧和窍门,使趋势在基于先知的预测中发挥真正的作用。.
趋势:关注您的变化点
先知的优势之一也是其结果和性能稳定性的弱点:先知 趋势部分往往能解释绝大多数预测结果。 — 在我们的案例研究中,MAPE 约为 90%。因此,如果趋势估计不准确,性能就会急剧下降,随着时间的推移,预测过高或过低都会导致 MAPE 降低 20 个点以上。您可以使用多个参数来帮助先知调整趋势,包括 "changepoint_prior_scale "和 "changepoint_range"。
找到正确的变化点_prior_scale 值至关重要, ,因为该参数设置了趋势的灵活性。它越高,趋势就越灵活。我们的策略是对该参数进行网格搜索,取值如下(以对数为单位):[0.001, 0.01, 0.1, 0.5]:[0.001, 0.01, 0.1, 0.5].一般来说,取相对较小的值会带来更好的泛化效果。.
趋势:充分利用最新的 data
下一个注意点:默认情况下,先知会考虑到只有历史上第一个 80% 至 近似趋势 指定 25 个潜在变化点。我们发现,通过改变 changepoint_range 参数来增加 80% 的值可以提高性能。事实上,这也考虑到了最新的 data,在我们的案例中,这对解释呼叫水平更为重要。例如,从图中可以看出,2021 年的 data 非常重要,因为它呈下降趋势。我们选择考虑除最后 7 天以外的整个训练集,而不是 80%。.
趋势清除异常值
另一个需要考虑的问题是 对异常值的敏感性. .官方文件 建议拆除:“先知能够处理历史数据中的异常值,但只能通过趋势变化对其进行拟合”。.
季节性
季节性因素、, 我们使用傅里叶级数估计每日和每年的时间序列。由于我们的时间序列具有很强的季节性商业周期,我们发现先知的效果相当不错。.
但当我们深入研究后发现 每周季节性模型有限. .与一周的其他时间相比,我们的时间序列中周六的数值非常低(周日没有数值)。我们花了很多时间,也遇到了很多麻烦,试图改进对一周中这一天的预测。.
最后,我们不得不采取变通方法: 堆叠两个模型,包括我们的先知模型和统计模型 根据过去 6 周周天的平均权重计算预测结果。尽管我们已经尝试过改变先知每周季节性的所有参数,但结果还是如此。.
我们的理解:在 7 天周期的季节性中(在我们的例子中为 6 天,没有星期日),增加傅立叶阶数并不是那么有用,因为 0 和 2pi 之间的间隔只分为几段(6 或 7)。而低傅立叶阶数意味着 无法适应极端值和快速变化 季节性,如上例中的周六。.
其他一些微调季节性的技巧:
事件和额外回归因子
对于 事件和外来因素 先知也会很方便。.
您可以 加回归者, 的时间序列(数值和日期)。 添加抑制因子 方法。事件作为分类回归因子进行管理(值为 0 - 事件在当天或当小时没有发生 - 或为 1 - 事件正在发生)。.
添加新事件非常简单:您只需向 Prophet 提供包含事件日期和名称的 dataframe 即可。.
它在节假日、假期和其他活动中都能很好地发挥作用。而且它往往 比基于树的模型得出更好的结果.
除此之外,先知还使用 Python 节日 软件包,使您可以只使用国家(美国或法国)的 ID 来添加相关假期的功能。.
与许多其他时间序列预测算法一样,通常 很难知道一个重复出现的事件是否已经包含在先知的季节性中 或是否需要手动标记以帮助算法。一个简单的例子是圣诞节和新年:每年的同一时期,效果大致相同。一个棘手的例子是法国春季假期。在法国,每年四月左右,学校都会放假两周,日期每年都在变化,并按地理区域划分(并非全法国都在同一时间放假)。.
虽然这一时期的全年季节性较低,但 “春节假日 ”事件对话务量预测的影响是积极的。而且模型在这一事件中的表现更好。因此,该事件的影响与其他节假日和我们观察到的季节性不一致,但对模型训练和预测有影响,并能提高性能......我们到底要不要添加该事件?
我们观察到 各种公共假日的类似问题 我们有时不得不用统计模型来堆叠 ’先知",以更好地适应节假日的影响。不过,我们没有任何一致的解决方案。.
特征交叉耗时且往往设计过度
由于 "先知 "是一个大致线性的模型,因此 处理额外功能和事件的方式,功能交叉不是自动的。. 这意味着,"先知 "无法推断不同特征值的组合会对预测产生指数级的高或低影响,而基于树的算法和深度学习却能很好地推断出这一点。.
示例:假设您的时间序列在节假日后的工作日 + 1 受到影响 (HBD+1).然后向先知提供一个事件“HBD+1”可以更好地适应这种影响。但在这里,影响主要取决于日 HBD+1 是在星期一、星期六等。它既不是线性的,也不是乘法的。因此,您必须添加所有功能“HBD+1_monday”, “HBD+1_tuesday”,…
当跨越功能时,它们的数量会成倍增加,而这将使你们双方都付出代价 计算所需的时间、可解释性的损失,以及性能的下降如果添加了太多这样的功能。.
可解释性
与其他模型相比,"先知 "的主要优势之一是其可解释性。.
将预报分解为趋势、季节性、事件和额外的回归因素,对于低技术含量的预报是非常有意义的。.
先知是一个加法模型 :每个组成部分的总和等于预测值。每个分量的重要性表示为 直接在目标单位(不像 SHAP 值).它同时提供了局部和全局的可解释性。.
因此,它确实 易于绘制各组成部分对预测的预测/影响图. .如果您选择切换到乘法模式,即每个分量都表示为趋势的百分比,您需要做的工作会更多一些,但绘制起来仍然非常容易。.
遗憾的是,所有这些组件 只能提供约 10% 的预测值、, 其余 趋势预测中的 90%......这几乎是无法解释的。您的任务是尝试使用您无法用作先知特征的外部回归因素来解释这种趋势,例如客户群增长、接触率和客户行为变化(我们的案例研究)。为此,您需要获得与这些特征中每一个特征相关联的实际值:因此,只有当您回顾过去的预测时,才有可能分析您的趋势。.
生产中的性能和可维护性
性能
先知很快就有了很好的表现、, 与开发时间相比. .换句话说,它可以快速提供一个良好的基准,因为您不必精心设计时间特征。.
预言家可以用以下方法预测时间序列 几乎没有功能工程 和一个 表现出色, 在创纪录的时间内完成。.
训练速度快在使用 M1 芯片和 8 Go 内存的 macbook Air 上,使用约 3 年的 data 设置 data 模型,每个模型的交叉验证时间不到 1 分钟。.
在生产过程中,随着新的 data 投入使用,您需要重新拟合模型。加快训练的一种方法是使用先前模型的模型参数进行热启动拟合。您还可以使用该功能加速交叉验证过程。查看 “更新拟合模型 ”部分” 文件上 更进一步。.
先知需要至少两年的 data 数据来计算年度季节性,但我们建议 至少有 3 年的历史 data 有好的表现。.
我们取得了 ~15% 的性能 MAPE 反复几次之后. 然而,对结果进行微调是一项相当具有挑战性的工作 要达到这一上限非常困难。我们不得不对输出进行一些定制修正,以实现 ~10% MAPE。.
在我们的项目中,Prophet 和 XGboost 在 M+1 和 M+2 范围内的性能指标相似。但是,与 XGboost 相比,Prophet 在 M+3 和 M+4 阶段的性能下降幅度更大。这是因为趋势没有得到正确估计。虽然这不会影响短期预测,但长期预测会受到趋势方向的严重影响,因为它会随着时间的推移不断增长或减少,从而导致预测过高或过低。使用其他方法进行长期预测可能更安全。.
有意思的是, 有时增加 data 历史数据会适得其反 导致预报精度下降。预言家不允许增加最新观测数据的权重,因此增加 data 会导致预报精度下降。.
在此,我们建议使用几种长度的 data 进行实验,然后选择效果较好的一种。.
结果的稳定性
尽管 "先知 "具有一些不可否认的优势,但它并不是一个即插即用的模型。它需要一些时间进行微调以提高性能。它的一些弱点使它很难在生产中保持稳定。.
为了评估我们需要多久重新训练一次模型,我们比较了两种策略。我们在不同的月份生成预测并测量结果:
每个月重新训练模型的效果更好。总之,尽管进行了时间交叉验证,但超参数在不同时间段并不稳定。对于 XGboost 来说,您不必经常进行这样的重新训练。不过,这些结果应该谨慎对待,因为在我们进行基准测试时,数据量受到了 COVID 危机的影响。在此,我们再次用直觉来解释这一结果,即趋势难以正确估计。.
可扩展性
这种单变量模型的缺点之一是需要 每个 SKU 一个型号, 与基于树的方法相比,您可以对许多产品使用相同的模型。.
这通常会带来更好的表现、, 正如 Pierre-Yves Mousset 指出的那样 在他的项目上。然而,拥有许多模型可能是一项工程挑战,也是维护工作的噩梦。.
结论
当时间序列很容易分解成简单的时间成分时,先知的易用性使其成为一个非常好的基准模型。但是,如果信号噪声较大,对模型性能进行微调就会很麻烦。.
得益于其将预测细分为时间部分的功能,模型的决策很容易解读。不过,它还不够精确,不能用来衡量外部事件的影响,因为你永远不知道该事件的影响是否已经在本地时间分量中得到考虑。.

博客















