前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >prophet Trend Changepoints趋势变化点

prophet Trend Changepoints趋势变化点

作者头像
lovelife110
发布2021-01-14 14:38:57
1.2K0
发布2021-01-14 14:38:57
举报
文章被收录于专栏:爱生活爱编程爱生活爱编程

一、例子代码

https://github.com/lilihongjava/prophet_demo/tree/master/trend_changepoints

代码语言:javascript
复制
# encoding: utf-8
import pandas as pd
from fbprophet import Prophet
from pandas.plotting import register_matplotlib_converters
from fbprophet.plot import add_changepoints_to_plot
from matplotlib import pyplot as plt



def main():
    df = pd.read_csv('./data/example_wp_log_peyton_manning.csv')
    m = Prophet()
    m.fit(df)
    future = m.make_future_dataframe(periods=366)
    forecast = m.predict(future)
    fig = m.plot(forecast)
    for cp in m.changepoints:
        print(cp)
        plt.axvline(cp, c='gray', ls='--', lw=2)
    plt.show()


    deltas = m.params['delta'].mean(0)
    fig = plt.figure(facecolor='w', figsize=(10, 6))
    ax = fig.add_subplot(111)
    ax.bar(range(len(deltas)), deltas, facecolor='#0072B2', edgecolor='#0072B2')
    ax.grid(True, which='major', c='gray', ls='-', lw=1, alpha=0.2)
    ax.set_ylabel('Rate change')
    ax.set_xlabel('Potential changepoint')
    fig.tight_layout()
    fig.show()


    fig = m.plot(forecast)
    a = add_changepoints_to_plot(fig.gca(), m, forecast)
    fig.show()

    m = Prophet(changepoint_prior_scale=0.5)
    forecast = m.fit(df).predict(future)
    fig = m.plot(forecast)
    fig.show()

    m = Prophet(changepoint_prior_scale=0.001)
    forecast = m.fit(df).predict(future)
    fig = m.plot(forecast)
    fig.show()

    m = Prophet(changepoints=['2014-01-01'])
    forecast = m.fit(df).predict(future)
    fig = m.plot(forecast)
    fig.show()


if __name__ == "__main__":
    main()

趋势变化点

在本系统文档的之前示例中,你可能已经注意到,时间序列经常会在其轨迹中发生突然变化。默认情况下,Prophet将自动检测这些变化点,并允许适当调整。但是,如果你希望更好地控制此过程(例如,Prophet忽略了一个趋势速率变化,或者在历史数据中的速率变化过拟合),那么你可以使用以下几个输入参数。

二、Prophet中的自动变化点检测

Prophet 首先指定大量可以更改速率的潜在变更点来检测变化点。然后它在速率变化的幅度上进行稀疏先验(相当于L1正则化) - 这实质上意味着Prophet 有大量可能发生变化的地方,但尽可能少地使用它们。以下使用快速入门中的Peyton Manning维基页面访问数预测的例子。默认情况下,Prophet指定25个潜在变化点,这些变化更点均匀放置在前80%的时间序列中。此图中的垂直线表示潜在变化点的放置位置:

尽管我们有很多地方速率可能会改变,但由于稀疏先验,大多数这些变化点都未被使用。我们可以通过绘制每个变化点的速率变化幅度来看到这一点:

可以使用参数n_changepoints设置潜在变更点的数量,但通过调整正则化可以更好地进行调整。可以通过以下方式显示表示变更点的位置:

代码语言:javascript
复制
# Python
from fbprophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)

默认情况下,只有前80%的时间序列才会推断出变化点,以便有足够的跑道来预测趋势的前进方向,并避免在时间序列结束时过度拟合波动。此默认值适用于许多情况,但不适用于所有情况,可以使用changepoint_range参数进行更改。例如,在python通过m = Prophet(changepoint_range=0.9) 或者在R语言中通过m <- prophet(changepoint.range = 0.9),来将潜在的变化点放在时间序列前90%中。

三、调整趋势灵活性

如果趋势变化过度拟合(灵活性太大)或不足(灵活性不够),可以使用输入参数changepoint_prior_scale调整稀疏先验的强度。默认情况下,此参数设置为0.05。增加它将使趋势更加灵活:

代码语言:javascript
复制
# Python
m = Prophet(changepoint_prior_scale=0.5)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

减少它会使趋势不那么灵活:

代码语言:javascript
复制
# Python
m = Prophet(changepoint_prior_scale=0.001)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

四、指定变化点的位置

如果愿意,可以使用changepoints参数手动指定潜在变化点的位置,而不是使用自动变化点检测。然后只允许在这些点上进行斜度变化,并像以前一样进行稀疏正则化。例如,可以像自动创建那样创建一个点网格,但随后用一些已知可能有变化的特定日期来扩充该网格。作为另一个例子,变化点可以完全限于一小组日期,如下所示:

代码语言:javascript
复制
# Python
m = Prophet(changepoints=['2014-01-01'])
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

参考资料:

https://facebook.github.io/prophet/docs/trend_changepoints.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、例子代码
  • 趋势变化点
  • 二、Prophet中的自动变化点检测
  • 三、调整趋势灵活性
  • 四、指定变化点的位置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档