首页 > 其他分享 >Coggle数据科学 | Kaggle 知识点:时序模型 Prophet

Coggle数据科学 | Kaggle 知识点:时序模型 Prophet

时间:2024-07-27 20:29:17浏览次数:16  
标签:知识点 01 季节性 df Prophet 模型 Kaggle pd

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。

原文链接:Kaggle 知识点:时序模型 Prophet

Prophet 算法

在时间序列中Prophet是Facebook开源的时间序列预测算法,可以有效处理节假日信息,并按周、月、年对时间序列数据的变化趋势进行拟合。

https://facebook.github.io/prophet/

# pip
python -m pip install prophet

# conda
conda install -c conda-forge prophet

截至2023年1月,这个Python包通过PyPI已被下载超过1600万次,每月下载量仍保持在100万次。

Prophet对具有强烈周期性特征的历史数据拟合效果很好,不仅可以处理时间序列存在一些异常值的情况,也可以处理部分缺失值的情形。

模型定义

Prophet使用了可分解的时间序列模型,模型包含三个主要组件:趋势、季节性和假日。它们通过以下方程组合在一起:

  • 是趋势函数,用于模拟时间序列值的非周期性变化

  • 表示周期性变化(例如每周和每年的季节性变化)

  • 表示假日效应,这些假日在一个或多个不规则时间安排的日子内发生

  • 误差项表示模型未能捕捉的变化

Prophet适用场景

  • 有至少几个月(最好是一年)的每小时、每天或每周观察的历史数据;

  • 有多种人类规模级别的较强的季节性趋势:每周的一些天和每年的一些时间;

  • 有事先知道的以不定期的间隔发生的重要节假日(比如国庆节);

  • 缺失的历史数据或较大的异常数据的数量在合理范围内;

  • 有历史趋势的变化(比如因为产品发布);

Prophet出发点

Prophet 的出发点是提供一种灵活的、可解释的回归模型,该模型可以直观地由具有时间序列知识的分析师调整。这种模型的设计考虑了以下几个关键点:

  1. 易于使用Prophet 旨在使没有时间序列方法训练的大量人员也能进行预测。

  2. 灵活性:它能够适应具有潜在特殊特征的多种预测问题。

  3. 自动化与人工干预相结合Prophet 通过自动化的方式进行预测,同时在模型性能不佳或需要人工干预时,允许分析师进行调整。

  4. 大规模评估:在创建大量预测时,需要有效、自动化的方法来评估和比较预测结果,并检测可能表现不佳的情况。

  5. 可解释性Prophet 的参数具有直观的解释,使得即使非专家也能根据领域知识进行模型配置。

Prophet 模型的设计允许它捕捉时间序列数据中的多种特征,如趋势、季节性、假日效应等,同时提供了一种机制来评估预测性能并根据需要进行调整。

Prophet使用案例

案例 1:拟合基础模型

import pandas as pd
from prophet import Prophet

# 需要有两列,ds 列和 y 列
df = pd.read_csv('https://mirror.coggle.club/prophet/example_wp_log_peyton_manning.csv')

# 定义模型,并训练
m = Prophet()
m.fit(df)

# 推理未来的日期,并镜像预测
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)
  • 模型预测结果

  • 模型分解结果

案例2:自动识别趋势变化

实际的时间序列经常会在轨迹上发生突然变化。默认情况下,Prophet 会自动检测这些变化点,并允许趋势适当调整。

Prophet 通过首先指定大量潜在的变化点来检测变化点,在这些点上允许速率变化。默认情况下,Prophet 指定了 25 个潜在的变化点,这些变化点均匀地分布在时间序列的前 80% 部分。

import pandas as pd
from prophet import Prophet

df = pd.read_csv('https://mirror.coggle.club/prophet/example_wp_log_peyton_manning.csv')
m = Prophet()

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

案例 3:自定义节假日

如果你有假期或其他重复出现的事件需要建模,必须为它们创建一个数据框。数据框包含两列(holiday 和 ds),每行对应一次假期的发生。数据框必须包括假期的所有发生时间,既包括过去的(从历史数据开始)也包括未来的(预测范围内)。如果假期在未来不会重复,Prophet 会对其进行建模,但不会将其纳入预测中。

playoffs = pd.DataFrame({
  'holiday': 'playoff',
  'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16',
                        '2010-01-24', '2010-02-07', '2011-01-08',
                        '2013-01-12', '2014-01-12', '2014-01-19',
                        '2014-02-02', '2015-01-11', '2016-01-17',
                        '2016-01-24', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})

superbowls = pd.DataFrame({
  'holiday': 'superbowl',
  'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})

special_days = pd.DataFrame({
    'holiday': ['Christmas', 'Christmas Eve', 'Black Friday'],
    'ds': ['2023-12-25', '2023-12-24', '2023-11-24'],
    'lower_window': [0, -1, 0],
    'upper_window': [0, 0, 1],
    'prior_scale': [10, 5, 3]
})

holidays = pd.concat((playoffs, superbowls, special_days))

m = Prophet(holidays=holidays)
forecast = m.fit(df).predict(future)

案例4:多元回归

Prophet使用 add_regressor 方法或函数将额外的回归变量添加到模型的线性部分。需要在拟合和预测的数据框中都包含一个带有回归变量值的列。

添加的额外回归因子必须对于历史数据和未来日期都是已知的。这意味着它要么是已知未来值的变量(,要么是在其他地方已经预测过的变量。

def nfl_sunday(ds):
    date = pd.to_datetime(ds)
    if date.weekday() == 6 and (date.month > 8 or date.month < 2):
        return 1
    else:
        return 0
df['nfl_sunday'] = df['ds'].apply(nfl_sunday)

m = Prophet()
m.add_regressor('nfl_sunday')
m.fit(df)

future['nfl_sunday'] = future['ds'].apply(nfl_sunday)

forecast = m.predict(future)
fig = m.plot_components(forecast)

案例5:兼容缺失值

df = pd.read_csv('https://mirror.coggle.club/prophet/example_wp_log_R_outliers1.csv')
m = Prophet()
m.fit(df)

future = m.make_future_dataframe(periods=1096)
forecast = m.predict(future)
fig = m.plot(forecast)

处理异常值的最佳方法是将其从数据中移除。Prophet 可以很好地处理缺失数据。 Prophet 能够通过拟合趋势变化来处理历史数据中的异常值。不确定性模型可能会预期未来也会出现类似幅度的趋势变化,这可能导致预测区间变宽。

df.loc[(df['ds'] > '2010-01-01') & (df['ds'] < '2011-01-01'), 'y'] = None
model = Prophet().fit(df)
fig = model.plot(model.predict(future))

案例6:模型调参

import itertools
import numpy as np
import pandas as pd

param_grid = {  
    'changepoint_prior_scale': [0.001, 0.01, 0.1, 0.5],
    'seasonality_prior_scale': [0.01, 0.1, 1.0, 10.0],
}

# Generate all combinations of parameters
all_params = [dict(zip(param_grid.keys(), v)) for v in itertools.product(*param_grid.values())]
rmses = []  # Store the RMSEs for each params here

df = pd.read_csv('https://mirror.coggle.club/prophet/example_retail_sales.csv')
# Use cross validation to evaluate all parameters
for params in all_params:
    m = Prophet(**params).fit(df)  # Fit model with given params
    df_cv = cross_validation(m, cutoffs=cutoffs, horizon='30 days', parallel="processes")
    df_p = performance_metrics(df_cv, rolling_window=1)
    rmses.append(df_p['rmse'].values[0])

# Find the best parameters
tuning_results = pd.DataFrame(all_params)
tuning_results['rmse'] = rmses
print(tuning_results)

案例 7:模型微调

使用热启动技术可以在添加新数据时显著加快模型的拟合速度。热启动对于数据的小幅度更新(如例子中一天的数据)效果很好,但如果数据发生了较大变化(例如,添加了很多天的数据),热启动可能不如从头开始拟合模型来得有效。

def warm_start_params(m):
    res = {}
    for pname in ['k', 'm', 'sigma_obs']:
        if m.mcmc_samples == 0:
            res[pname] = m.params[pname][0][0]
        else:
            res[pname] = np.mean(m.params[pname])
    for pname in ['delta', 'beta']:
        if m.mcmc_samples == 0:
            res[pname] = m.params[pname][0]
        else:
            res[pname] = np.mean(m.params[pname], axis=0)
    return res

df = pd.read_csv('https://mirror.coggle.club/prophet/example_wp_log_peyton_manning.csv')
df1 = df.loc[df['ds'] < '2016-01-19', :]  # All data except the last day
m1 = Prophet().fit(df1) # A model fit to all data except the last day

%timeit m2 = Prophet().fit(df)  # Adding the last day, fitting from scratch
%timeit m2 = Prophet().fit(df, init=warm_start_params(m1))  # Adding the last day, warm-starting from m1

Prophet参数含义与调参

参数含义

参数名称说明
growth趋势类型,可选值有 'linear', 'logistic', 或 'flat'。
changepoints变化点日期列表。如果未指定,将自动选择潜在变化点。
n_changepoints潜在变化点的数量。如果未指定 changepoints,则在历史数据的前 changepoint_range 比例内均匀选择
changepoint_range用于估计趋势变化点的历史比例。
yearly_seasonality是否拟合年度季节性。可以是 'auto', True, False,或傅里叶项的数量。
weekly_seasonality是否拟合每周季节性。可以是 'auto', True, False,或傅里叶项的数量。
daily_seasonality是否拟合每日季节性。可以是 'auto', True, False,或傅里叶项的数量。
holidays包含假期数据的 pd.DataFrame
seasonality_mode季节性模式,可选值为 'additive'(加性)或 'multiplicative'(乘性)。
seasonality_prior_scale调节季节性模型强度的参数。值越大,模型可以拟合的季节性波动越大;值越小,季节性波动幅度越小。
holidays_prior_scale调节假期组件模型强度的参数,除非在假期输入中被覆盖。
changepoint_prior_scale调节自动变化点选择灵活性的参数。值越大,允许的变化点越多;值越小,允许的变化点越少。
interval_width预测的不确定区间的宽度。
uncertainty_samples用于估计不确定区间的模拟抽样数量。将此值设置为 0 或 False 将禁用不确定性估计并加快计算速度。

超参数调优

主要可调参数
  1. changepoint_prior_scale

    • 作用:确定趋势的灵活性,特别是趋势在变化点的变化幅度。

    • 默认值:0.05

    • 调优范围:[0.001, 0.5]

    • 说明:值越大,趋势变化越灵活,过大可能导致过拟合,过小可能导致欠拟合。

  2. seasonality_prior_scale

    • 作用:控制季节性的灵活性。

    • 默认值:10

    • 调优范围:[0.01, 10]

    • 说明:值越大,季节性变化越大,值越小,季节性幅度越小。

  3. holidays_prior_scale

    • 作用:控制假期效应的灵活性。

    • 默认值:10

    • 调优范围:[0.01, 10]

    • 说明:与季节性灵活性类似,调整假期效应的幅度。

  4. seasonality_mode

    • 作用:季节性的模式,可以选择加性('additive')或乘性('multiplicative')。

    • 默认值:'additive'

    • 说明:商业时间序列中,季节性变化随时间序列幅度变化的情况适合乘性模式。

可能需要调优的参数
  1. changepoint_range

    • 作用:确定趋势变化的历史比例。

    • 默认值:0.8(80% 的历史数据)

    • 调优范围:[0.8, 0.95]

    • 说明:增加该参数可能有助于避免在时间序列末尾过拟合。

一般不需要调优的参数
  1. growth:选择增长模式('linear' 或 'logistic')。

  2. changepoints:手动指定变化点位置。

  3. n_changepoints:自动放置的变化点数量,默认 25。

  4. yearly_seasonality:是否启用年度季节性(默认 'auto')。

  5. weekly_seasonality:是否启用每周季节性(默认 'auto')。

  6. daily_seasonality:是否启用每日季节性(默认 'auto')。

  7. holidays:传入指定假期的数据框。

  8. mcmc_samples:是否使用 MCMC,取决于时间序列的长度和参数不确定性的重要性。

  9. interval_width:指定预测区间的宽度(默认 0.8,对应 80% 置信区间)。

  10. uncertainty_samples:用于计算不确定性区间的样本数量,默认 1000。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

标签:知识点,01,季节性,df,Prophet,模型,Kaggle,pd
From: https://blog.csdn.net/csdn_xmj/article/details/140668650

相关文章

  • 「Vue2+Vue3」 的 62 个知识点
    1、Vue2和Vue3的区别?vue3对于typescript的支持更加的好vue3的CompositionAPI,vue2的OptionAPIvue3打包使用tree-shaking策略,体积更小vue3在模板编译的阶段会有静态节点提升,运行时性能更好vue3使用Proxy进行响应式处理,而vue2使用了definePropert......
  • Java知识点----万类之祖(Object)以及 抽象类
    1.万类之祖---Object1.1finalize()    在对象即将销毁的时候,JVM自动调用的方法    例如:publicclassObjectA(这个是自己创建的文件名)extendsObject(默认加上的)1.2hashCode这个知识点我们用一幅图来帮助大家更好的理解:2.抽象类抽象类作为父类的作......
  • Python基础知识点(1)基本语句
    基本语句1.if语句if表达式:语句块其中,表达式是一个返回True或False的表达式。如果表达式为True,则执行if下面的语句块;如果为False,则跳过语句块执行下面的语句。2.if…else语句if表达式:语句块1else:语句块2其中,表达式是一个返回True或False的表达式。如果......
  • 软考-软件设计师(1)-计算机基础知识点:进制转换、数据编码、内存编址、串并联可靠性、
    场景软考-软件设计师-计算机基础模块高频考点整理。以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。注:博客:霸道流氓气质-CSDN博客实现知识点进制转换十进制转二进制除以2,反向取余数,直到商为0终止,转换成其他进制同理二进制转十进制其......
  • Redis知识点总结
    目录1.基本概念2.内存与持久化3.数据结构4.高级功能5.性能优化6.应用场景7.安装与配置1.在Linux系统上通过源码编译安装2.在CentOS上通过包管理器安装3.在MacOS上通过Homebrew安装4.在Windows环境下通过预编译二进制文件安装结论Redis(RemoteDiction......
  • 量化基本知识点梳理-三种量化方式和量化框架以及trt
    这一文档介绍些基础概念吧,权当做一个阶段整理,后面也会慢慢完善。1.量化分类:根据谷歌量化白皮书中定义,分为PTQ和QAT两种,而PTQ又包括两种。3种量化方式:QAT,PTQDynamic,PTQStatic。1)量化感知训练(QuantAwareTraining,QAT):量化训练让模型感知量化运算对模型精度带来的......
  • Python知识点—math函数,方法全解,细致易懂
    代码中已标明函数的方法以及操作importmathformathsindir(math):ifnotmaths.startswith("__"):#打印math函数的方法,不显示以"__"开头的print(maths)print(math.pi)#π值3.141592653589793#无穷大print(math.inf>99999999999999999999999......
  • Docker的一些知识点
    1.Docker中容器和镜像的区别镜像(Image):镜像是一个只读模板,包含了运行一个应用所需的所有内容:代码、运行时、库、环境变量和配置文件。镜像是构建容器的基础。你可以将它想象成是一个应用的“蓝图”。镜像通常是通过Dockerfile定义的,Dockerfile是一个文本文件,包含了一系列......
  • C语言【面试】常用知识点总结之常用易错易混点解析
    第二部分:程序代码评价或者找错有符号整型和无符号整型混合运算时,有符号型自动转换成无符号型,运算的结果是无符号的。如果参与运算的数据类型不同,会自动转化为同一类再运算,这就是自动转换自动转换的规则如下:1.当参与运算的数据的类型不同时,编译系统会自动先将他们转换成......
  • Makefile知识点总结(Linux下开发Risc-V单片机实例)
    Makefile会不会写makefile,从一个侧面决定一个人是否具备完成大型工程的能力。Makefile和make命令一起配合使用,为什么要使用makefile,原因以及优点在下文解释。简单辨析一下建立工程的三种方式Makefile使用非常广泛,通用性强,可跨平台但是语法比较严格,写一个通用,便于管理......