Prophet(先知):非死book大规模预报框架

dbpy5819 7年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/0e5c608576c75c83487e86502351873b.jpg"></p>    <p>日前,非死book 开源了Prophet,一个可用于 Python 和 R 编程语言的预测工具。预测是一个数据科学任务,是组织内许多活动的核心。例如,像非死book这样的大型组织必须进行能力规划,以有效地分配稀缺的资源和目标设置,以便相对于基线测量性能。产生高质量的预测对于机器或大多数分析师来说并不是一个容易的问题。我们在创建各种业务预测的实践中观察到两个主要主题:</p>    <ul>     <li> <p>完全自动的预测技术可能很脆弱,并且往往太不灵活而无法纳入有用的假设或启发。</p> </li>     <li> <p>能够产生高质量预报的分析师是相当罕见的,因为预测是专业数据科学技能,需要大量经验积累。</p> </li>    </ul>    <p>这些主题的结果是对高质量预测的需求通常远远超过了分析师可以生成它们的速度。这个观察是我们建设Prophet的动机:我们希望让专家和非专家更容易做出与需求保持一致的高质量预测。</p>    <p>“规模”暗示的典型考虑,计算和存储,不仅仅关注预测。我们发现,预测大量时间序列的计算和基础设施问题相对简单 - 通常这些拟合过程很容易并行化,预测不难存储在关系数据库(如MySQL)或数据仓库(如Hive)中。</p>    <p>我们在实践中观察到的规模问题涉及由各种预测问题引入的复杂性,并且一旦已经产生,就在大量预测中建立信任。Prophet一直是提高非死book的能力、建立用于决策、甚至在产品功能大量可信预测的关键。</p>    <p><strong>Prophet 的亮点 </strong></p>    <p>不是所有的预测问题都可以通过相同的过程来解决。Prophet 针对我们在非死book上遇到的业务预测任务进行了优化,这些任务通常具有以下特征:</p>    <ul>     <li> <p>每小时,每天或每周观察至少几个月(优选一年)的历史</p> </li>     <li> <p>强化的多重“人类规模”季节性:工作日和一年的时间</p> </li>     <li> <p>以预先知道的不规则间隔发生(例如超级碗)重要的节假日</p> </li>     <li> <p>合理数量的缺失观测值或大的异常值</p> </li>     <li> <p>历史趋势变化,例如由于产品启动或记录更改</p> </li>     <li> <p>趋势是非线性增长曲线,其中趋势达到自然极限或饱和</p> </li>    </ul>    <p>我们发现Prophet的默认设置产生的预测往往是准确的,如熟练的预报员所产生的预测那样,但所做的代价更少。使用 Prophet ,如果预测不令人满意,那么你不会在一个完全自动过程的结果面前止步不前- 没有经过时间序列方法训练的分析师可以使用各种易于解释的参数改进或调整预测。我们发现,针对特殊情况通过将自动预测与环路预测分析( analyst-in-the-loop ) 相结合,可以覆盖各种各样的业务用例。下图说明了我们发现大规模工作的预测过程:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b8fe3b451638671bb6ba465bfd4504c0.png"></p>    <p>对于预测过程的建模阶段,目前只有有限数量的工具可用。 Rob Hyndman 出色的 R 语言预测包可能是最受欢迎的选项,Google 和 推ter 都发布了更具体的时间序列功能的包 - CausalImpac t和 AnomalyDetection。据我们所知,在 Python 中用于预测的开源软件包很少。</p>    <p>我们经常使用 Prophet 作为 <strong>forecast</strong> 包在许多设置中的替代,这是因为下面两个主要优点:</p>    <p>1.Prophet让创造一个合理、准确的预测更直截了当。预测包包括许多不同的预测技术(ARIMA,指数平滑等),每个都有自己的优势、弱点和调整参数。我们已经发现,选择错误的模型或参数通常可能产生不良结果,并且即使经验丰富的分析人员也不可能有效地选择正确的模型和参数。</p>    <p>2.Prophet预测可以对非专家来说直观的方式进行定制。有季节性的平滑参数,允许您调整适合历史周期的紧密程度,以及平滑趋势的参数,允许您调整如何主动跟踪历史趋势更改。对于增长曲线,您可以手动指定“容量”或增长曲线的上限,从而允许您注入自己的关于预测将如何增长(或下降)的先前信息。最后,您可以指定不规则的假日,如超级碗、感恩节和黑色星期五的日期。</p>    <p><strong>Prophet</strong> <strong> 的工作原理 </strong></p>    <p>在其核心,Prophet程序是一个加性回归模型(additive regression model),包含四个主要部分:</p>    <ul>     <li> <p>分段线性或逻辑增长曲线趋势。 Prophet通过从数据中选择变化点来自动检测趋势变化。</p> </li>     <li> <p>使用傅里叶级数建模的年度季节分量。</p> </li>     <li> <p>使用虚拟变量的每周季节分量。</p> </li>     <li> <p>用户提供的重要节日列表。</p> </li>    </ul>    <p>例如,这里有一个特征预测:我们使用wikipediatrend包下载的Peyton Manning的Wikipedia页面的log-scale页面视图。由于 Peyton Manning是一个美式足球运动员,你可以看到每年的季节性比赛和重要的角色,而每周的周期性也明显存在。最后,你看到某些事件(如他出现的季后赛)也可以建模。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b454da8bfe832c23f20c64112533dc47.png"></p>    <p>Prophet 将提供一个组件图,用图形描述它适合的模型:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/52e84cf1aebbf4c5998c0c0b931aac17.png"></p>    <p>这个图更清楚地显示了与浏览Peyton Manning的页面(足球赛季和季后赛)以及每周季节性相关的年度季节性:比赛日(星期日和星期一)和之后的访问增多。也可以注意到趋势组件自他最近退役以来的向下调整。</p>    <p>Prophet 的重要思想是,通过更灵活地配合趋势组件,我们更准确地模拟季节性,结果是预测更加准确。我们更喜欢使用非常灵活的回归模型(有点像曲线拟合),而不是传统的时间序列模型,因为它给我们更多的建模灵活性,更容易拟合模型,更加优雅地处理丢失的数据或离群值。</p>    <p>默认情况下,Prophet 将通过模拟您的时间序列的未来趋势变化为趋势组件提供不确定性区间。如果你想模拟未来季节性或假期效应的不确定性,你可以运行几百个HMC迭代(需要几分钟),你的预测将包括季节不确定性估计。</p>    <p>我们使用 Stan 匹配Prophet模型,并以Stan概率编程语言中实现了Prophet 过程的核心。 Stan对参数执行MAP优化非常快(<1秒),给出了使用哈密尔顿蒙特卡洛算法(Hamiltonian Monte Carlo algorithm)估计参数不确定性的选项,并允许我们在多种接口语言中重复使用拟合过程。目前,我们提供了Prophet 的Python 和 R 语言的实现。它们具有完全相同的功能,通过提供这两个实现,我们希望让我们的预测方法在数据科学社区更广泛使用。</p>    <p><strong>如何使用Prophet</strong></p>    <p>使用Prophet的最简单的方法是从PyPI(Python)或CRAN(R)安装软件包。您可以阅读我们的快速入门指南,并深入了解我们的全面文档。如果您正在寻找一个有趣的时间序列数据源,建议尝试wikipediatrend包,它可在维基百科页面的下载历史页面视图提供下载。</p>    <p><strong>帮助我们改进 Prophet</strong></p>    <p>有两个主要方法来帮助我们改进Prophet。首先,你可以自己试试使用,告诉我们你的结果。我们一直在寻找更多的用例,以便了解当Prophet表现是否良好。第二,有大量的功能需要构建!我们欢迎拉取请求(pullrequest)、修复错误和增加新的功能。看看如何贡献的指南,我们期待与社区互动,使 Prophet更广泛地有用。</p>    <p> </p>    <p> </p>    <p>来自:https://mp.weixin.qq.com/s?__biz=MzI4NjYwMjcxOQ==&mid=2247483929&idx=1&sn=144406c86ad8e5c897adff8e8103b864&chksm=ebdb26a9dcacafbf3840e8f3d7a1765311a650385ae23f9ee4525ca06d82cdfcd9abb08f2a8f#rd</p>    <p> </p>