前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「经验」时间序列预测神器-Prophet『实现篇』

「经验」时间序列预测神器-Prophet『实现篇』

作者头像
小火龙说数据
发布2022-06-30 16:24:34
1.1K0
发布2022-06-30 16:24:34
举报
文章被收录于专栏:小火龙说数据小火龙说数据

预计阅读时间:8min

阅读建议:本文为Prophet代码实现篇,如对模型原理有疑惑的同学,建议先看完「原理篇」后,再开始此篇的学习。

解决痛点:Prophet如何通过Python实现?此篇文章,帮助你上手实现。

01

如何安装Prophet

首先,要安装包,fbprophet包依赖于pystan。由于包的安装有很多依赖,因此强烈建议用conda装。

代码语言:javascript
复制
conda install pystan
pip install fbprophet

02

导入数据SIMPLE TITLE

在码代码之前,要先引入pandas、numpy、matplotlib等常规数据科学库,以及主角fbprophet。由于文件是通过excel存储的,因此还需先将excel导入,日期变更为date类型,并且将字段命名为“ds”和“y”(Prophet默认应用这两个字段)。

代码语言:javascript
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet

data = pd.read_excel('./xxx.xlsx')
data['date'] = pd.to_datetime(data['date'], format='%Y%m%d')
data = data.rename(columns = {"date":"ds", "y":"y"})[["ds","y"]]
data.head(5) #查看前五条记录
data.tail(5) #查看后五条记录

导入数据前后五条记录

03

绘制原始趋势图

在模型搭建之前,需要先对数据历史趋势有一个宏观了解,绘制数据趋势图。

代码语言:javascript
复制
import plotly.express as px

fig = px.line(data, x="date", y="y")
fig.show()

数据历史趋势图

04

模型训练

Prophet的模型训练及预测,类似Sklearn的方法,训练fit()、预测predict()。这里由于我们了解数据的变动会受到季节、周、天的影响,存在一定的规律性,因此我们将这三个参数设置成True,并且采用中国的假期模式,其余参数均保持默认,代码如下:

代码语言:javascript
复制
model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=True)
model.add_country_holidays(country_name="CN")
model.fit(data)

Prophet参数及默认值介绍,内容理论可参考「原理篇」

• growth:趋势函数设置,默认线性“linear”,可选非线性“logistic”。

• changepoints:选择突变点,默认自动选择“None”。例如:双十一订单突增,指定突变点。

• n_changepoints:突变点个数,默认“25个”。如果changepoints指定,则这个参数就废弃了;如果changepoints没指定,则会从输入的历史数据前80%中自动选取25个突变点。

• changepoint_range:突变点数据范围,默认“80%”。同样,如果changepoints指定,则这个参数就废弃了。

• changepoint_prior_scale: 调节“changepoints”发现强度,默认“0.05”。值越大对历史数据拟合程度越强,但会增加过拟合的风险。

• yearly_seasonality: 数据是否有年季节性,默认“自动检测”。

• weekly_seasonality: 数据是否有周季节性,默认“自动检测”。

• daily_seasonality: 数据是否有天季节性,默认“自动检测”。

• holidays:指定节假日,默认“None”,支持手动输入指定节假日。以DataFrame格式输入,涵盖:必须列【holiday(string)、ds(date)】、可选列【lower_window(int)、upper_window(int),指定影响的前后窗口期】。

• seasonality_mode: 季节性效应模式,默认加法模式“additive”,可选“multiplicative”乘法模式。

• seasonality_prior_scale: 调节季节性效应模式强度,默认“10”。值越大,季节性对模型影响越大。

• holidays_prior_scale: 调节节假日模式强度,默认“10”。值越大,节假日对模型影响越大。

05

模型预测

模型预测输出预测值、预测上限、预测下限等字段。

代码语言:javascript
复制
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)

06

绘制分解图

模型提供预测输出的可视化展示,通过fbprophet自带的可视化组件完成。

代码语言:javascript
复制
from fbprophet.plot import plot_plotly, plot_components_plotly
fig1 = model.plot(forecast)
fig1.savefig('temp1.png')

预测可视化输出

同时支持趋势模型、周期模型、节假日模型的解耦。

代码语言:javascript
复制
fig2 = model.plot_components(forecast)
fig2.savefig('temp2.png')

预测解耦可视化输出

07

模型评估

评估模型的准确程度,通过RMSE(均方根误差)来度量y与y_predict的差异程度,值越小,拟合越好。

代码语言:javascript
复制
train_len = len(data["y"])
rmse = np.sqrt(sum((data["y"] - forecast["yhat"].head(train_len)) ** 2) / train_len)
print('RMSE Error in forecasts = {}'.format(round(rmse, 2)))

RMSE值输出

08

模型存储

以上流程实现了Prophet模型搭建,但考虑到未来我们还要复用通过此历史数据训练的模型,因此我们要将模型存储到本地,并在需要的时候将其导入。

代码语言:javascript
复制
# 模型保存
with open('prophet_model.json', 'w') as md:
    json.dump(model_to_json(model), md)

# 模型读取
with open('prophet_model.json', 'r') as md:
    model = model_from_json(json.load(md))

09

经验建议

  • Prophet对缺失值友好,但对异常值敏感。异常值可设置成None,防止影响模型的拟合。
  • 模型默认线性趋势,但如果数据按照log方式增长的,可调节为growth=”logistic”逻辑回归模型。
  • 当我们预先知道某天会影响数据的整体走势,可以提前将此天设置成转折点(changepoint)。
  • 在设定周期性时,模型默认按照年、星期、天设定,月和小时如需要自行设定。
  • 针对节假日,可通过holiday来进行调节,针对不同的假期,可调整不同的前后窗口期,例如:春节7日,但是春运影响近30日。

以上就是本期的内容分享,希望能帮你实现Prophet模型。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小火龙说数据 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档