greykite简单时序预测

您只需几行代码即可创建和评估预测。
只要提供pandas的DataFrame,需要包含时间序列和需要预测的值。时间序列可以是任何pandas.to_datatime认识的格式
在本例中,我们将会加载一个数据集,代表的是佩顿·曼宁维基百科页面的访问量。
本数据集包含了从2007-12-10到2016-01-20期间的数据。

加载依赖

#将图表嵌入到Notebook中
%matplotlib inline

# 忽略警告 
import warnings
warnings.filterwarnings("ignore")

# 加载依赖
import pandas as pd
import plotly

from greykite.common.data_loader import DataLoader
from greykite.framework.templates.autogen.forecast_config import ForecastConfig
from greykite.framework.templates.autogen.forecast_config import MetadataParam
from greykite.framework.templates.forecaster import Forecaster
from greykite.framework.templates.model_templates import ModelTemplateEnum
from greykite.framework.utils.result_summary import summarize_grid_search_results

将数据集加载到pandas DataFrame中

dl = DataLoader()
df = dl.load_peyton_manning()
display(df.head(),df.tail())
加载数据集.png

这个df就是从2007-12-10到2016-01-20期间的数据。如果要用自己的数据集,可以pd.read_csv读取自己的数据。只要是pandas.to_datatime能认识的时间格式就可以(一般常见的格式都认识)。

指定数据集信息

metadata = MetadataParam(
    time_col="ts",  # time列的列名
    value_col="y",  # value列的列名
    freq="D"  
'''
"H" 代表小时, "D" 是天, "W" 是星期, etc.   `pandas.date_range`能接受的任何格式
'''
)

创建预测模型

你可以选择PROPHET或者SILVERKITE预测模型模板。
在本例中,我们使用SILVERKITE作为预测模型。
首先创建Forecaster()对象,然后对该实例对象应用run_forecast_config方法。
传入两个参数,df 和 config。df就是前面创建的数据集,config需要用ForecastConfig()函数创建。
ForecastConfig()里面的参数包括:

  • model_template:模型算法,这里选择使用ModelTemplateEnum.SILVERKITE.name
  • forecast_horizon:预测的步长,这里预测365步
  • coverage:置信度,0.95是95%置信度在预测的范围内。
  • metadata_param:这个就选上一步创建的那个数据集信息,时间列名、值列名、时间频率
forecaster = Forecaster()  # 创建forecaster对象,并且存储预测结果
result = forecaster.run_forecast_config(  # 结果也被存储为`forecaster.forecast_result`
    df=df,
    config=ForecastConfig(
        model_template=ModelTemplateEnum.SILVERKITE.name,
        forecast_horizon=365,  # 向前预测365步长
        coverage=0.95,         # 95%预测置信度
        metadata_param=metadata
    )
)

检查结果

run_forecast_config的输出是一个字典,包含了未来的预测,历史拟合性能评估,以及原始的时间序列。

绘制历史的时序数据

使用plotly画出可交互的图表

ts = result.timeseries
fig = ts.plot()
plotly.io.show(fig)
历史数据.png

Cross-validation交叉验证:

默认地,run_forecast_config提供了历史数据的估计,所以你可以看到这个模型对于历史数据的“预测”效果。
这个被存储在grid_search (交叉验证拆分)和backtest(holdout测试集)

让我们看一下交叉验证的结果吧。
下面展示了MAPE(Mean Absolute Percentage Error)

grid_search = result.grid_search
cv_results = summarize_grid_search_results(
    grid_search=grid_search,
    decimals=2, # 小数位
    # The below saves space in the printed output. Remove to show all available metrics and columns.
    cv_report_metrics=None,
    column_order=["rank", "mean_test", "split_test", "mean_train", "split_train", "mean_fit_time", "mean_score_time", "params"])
# Transposes to save space in the printed output
# 转置,节省打印输出的空间
cv_results["params"] = cv_results["params"].astype(str)
cv_results.set_index("params", drop=True, inplace=True)
cv_results.transpose()
交叉验证的结果

这些参数具体代表的含义,我尚不能解释清楚。埋坑,待以后用到的时候再研究吧。如果读者您知道,请不吝赐教。

使用Backtest ,画出历史数据的拟合效果吧。

backtest = result.backtest
fig = backtest.plot()
plotly.io.show(fig)
历史数据拟合效果

使用前一部分的历史数据历史数据作为训练集,来预测后一部分的历史数据。看看跟实际的数据差别。
这个预测的时间周期,是跟上面模型创建时定义的forecast_horizon=365一样。要往后预测365天,默认做模型检验的时候,backtest也时拿最后的365天做校验。
你也可以查看历史数据评估矩阵(基于历史的训练和测试集)

dict_train = {}
for i,j in backtest.train_evaluation.items():
    dict_train[i] = j
df_train = pd.DataFrame(dict_train,index=["train"])

dict_test = {}
for i,j in backtest.test_evaluation.items():
    dict_test[i] = j
df_test = pd.DataFrame(dict_train,index=["test"])

metrics = pd.concat([df_train,df_test],axis=0).T
metrics
历史数据拟合效果评估

Forecast预测

结果的forecast属性包含了预测的结果,就跟backtest类似,你可以画出结果,或者看到评估矩阵。
让我们画出预测结果吧(使用所有的数据进行训练):

forecast = result.forecast
fig = forecast.plot()
plotly.io.show(fig)

对未来的预测结果

这个预测结果的数值可以在df里面拿到。

forecast.df.tail().round(2)
预测数据.png

Model Diagnostics模型诊断:

各个组件图展示了展示了你的数据集的整体趋势、季节性影响、以及事件、节假日模式。

fig = forecast.plot_components()
plotly.io.show(fig)     # 如果使用PROPHET算法模板,就用 fig.show()

image.png

image.png

image.png

image.png

image.png

image.png

模型总结,可以了解模型如何工作以及可以进一步改进的内容。但是看不懂,先写在这下面。

summary = result.model[-1].summary()  # -1 retrieves the estimator from the pipeline
print(summary)

应用模型

这个训练的模型可以在sklearn.pipeline.Pipeline中被使用

model = result.model
model

你可以拿这个模型来预测任意时间范围,make_future_dataframe这个函数可以帮你方便地创建未来日期的dataframe。
注意传给predict函数的dataframe需要跟前面传给run_forecast_config 的df具有相同的列。包括数值列,要用np.nan来填充。

future_df = result.timeseries.make_future_dataframe(
    periods=4,
    include_history=False)
future_df
比如从历史数据往后推4天

调用.predict()函数来计算预测值。

model.predict(future_df)
预测结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容