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

news2024/9/21 18:57:37

本文来源公众号“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 !

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS学习笔记[Web开发]

CSS学习 本文为学习笔记&#xff0c;参考菜鸟和w3c 文章目录 CSS 简介CSS 插入外部 CSS内部 CSS行内 CSS多个样式表层叠顺序 CSS 语法例子解释 CSS 选择器CSS 元素选择器CSS id 选择器实例CSS 类选择器实例CSS 通用选择器实例CSS 分组选择器CSS 后代选择器CSS 子元素选择器CSS …

Java初级之集合(Map可变参数集合工具类)

目录 1、Map集合 1.1 Map集合的概述和特点 1.2 Map集合的基本功能 1.3 Map集合的获取功能 1.4 Map集合的遍历&#xff08;一&#xff09; 1.4 Map集合的遍历&#xff08;二&#xff09; 2、HashMap 2.1HashMap集合概述和特点 2.2HashMap集合应用案例 3、TreeMap集合 …

.Net Core 微服务之Consul(三)-KV存储分布式锁

引言: 集合上两期.Net Core 微服务之Consul(一)(.Net Core 微服务之Consul(一)-CSDN博客) 。.Net Core 微服务之Consul(二)-集群搭建)(.Net Core 微服务之Consul(二)-集群搭建-CSDN博客) 目录 一. Consul KV 存储 1. KV 存储介绍 1.1 数据模型 1.2 一致性和…

react18+

主要是围绕函数式组件讲&#xff0c;18主要用就是函数式组件&#xff0c;学习前先熟悉下原生js的基本使用&#xff0c;主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则&#xff0c;只是放在一个方法里面返回而已&#xff0c;我们称这样的写法为函数式组件…

牛客JS题(三)文件扩展名

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 正则表达式可选链操作符 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><script>/*** 可能…

Vue前端页面嵌入mermaid图表--流程图

一、安装Mermaid 首先&#xff0c;你需要在你的项目中安装Mermaid。可以通过npm或yarn来安装&#xff1a; npm install mermaid --save # 或者 yarn add mermaid结果如图&#xff1a; 二、Vue 方法一&#xff1a;使用pre标签 使用ref属性可以帮助你在Vue组件中访问DOM元素 …

JAVA同城服务场馆门店预约系统支持H5小程序APP源码程序

&#x1f525;同城服务场馆门店预约系统&#xff1a;一键预约&#xff0c;便捷生活新体验&#xff01;&#x1f389; &#x1f31f;告别排队等待&#xff0c;预约新风尚&#x1f31f; 你还在为去游泳馆、健身房或是瑜伽馆排队等待而烦恼吗&#xff1f;同城服务场馆门店预约系统…

渲染技术如何帮助设计内容实现从平面到立体的转换

随着数字艺术和视觉特效的飞速发展&#xff0c;三维建模与渲染技术在影视、游戏、广告、工业设计、建筑可视化等多个领域展现出了其不可或缺的重要性。这一技术不仅实现了从平面到立体的跨越&#xff0c;还极大地丰富了视觉表达的层次感和真实感。 三维建模&#xff1a;构建虚…

模拟电子技术-实验四 二极管电路仿真

实验四 二极管电路仿真 一&#xff0e;实验类型 验证性实验 二&#xff0e;实验目的 1、验证二极管的单向导电性 2、验证二极管的稳压特性。 三&#xff0e;实验原理 二极管的单向导电性&#xff1a; 四、实验内容 1、二极管参数测试仿真实验 1&#xff09;仪表仿真…

【Linux】线程互斥和同步

目录 线程互斥 相关概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁/解锁 可重入VS线程安全 概念 可重入与线程安全的联系 可重入与线程安全的区别 死锁 死锁的四个必要条件 避免死锁 避免死锁的算法 线程同步 条件变量 条件变量函数 初始…

【已解决】ModuleNotFoundError: No module named ‘numpy’

【已解决】ModuleNotFoundError: No module named ‘numpy’ 在Python编程中&#xff0c;遇到“ModuleNotFoundError: No module named ‘numpy’”这样的错误提示并不罕见。这个错误意味着Python解释器无法在你的环境中找到名为numpy的模块。numpy是Python中一个非常重要的库…

ElasticSearch(四)— 数据检索与查询

一、基本查询语法 所有的 REST 搜索请求使用_search 接口&#xff0c;既可以是 GET 请求&#xff0c;也可以是 POST请求&#xff0c;也可以通过在搜索 URL 中指定索引来限制范围。 _search 接口有两种请求方法&#xff0c;一种是基于 URI 的请求方式&#xff0c;另一种是基于…

JavaScript第一天

变量的基本使用 更新变量 let age 18age 19 用户名输入案例&#xff1a; let uname prompt(请输入姓名) document.write(uname) 这样在提示框中输入姓名之后&#xff0c;就会在网页中显示出来 当输入之后不在网页中显示的时候&#xff0c;可能是变量名写错了&#xf…

C++笔记---缺省参数和函数重载

1. 缺省参数 1.1 定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值&#xff08;默认值&#xff09;。在调用该函数时&#xff0c;如果没有指定实参 则采用该形参的缺省值&#xff0c;否则使用指定的实参&#xff0c;缺省参数分为全缺省和半缺省参数。 void Func(…

Linux源码阅读笔记14-IO体系结构与访问设备

IO体系结构 与外设通信通常称为输入输出&#xff0c;一般缩写为I/O。在实现外设IO的时候&#xff0c;内核必须处理三个可能出现的问题&#xff1a; 必须根据具体的设备类型和模型&#xff0c;使用各种方法对硬件寻址。内核必须向用户应用程序和系统工具提供访问各种设备的方法…

【Git多人协作开发】同一分支下的多人协作开发模式

目录 0.前言场景 1.开发者1☞完成准备工作&协作开发 1.1创建dev分支开发 1.2拉取远程dev分支至本地 1.3查看分支情况和分支联系情况 1.4创建本地dev分支且与远程dev分支建立联系 1.5在本地dev分支上开发file.txt 1.6推送push至远程仓库 2.开发者2☞完成准备工作&…

性能测试工具、负载测试工具、缺陷跟踪工具推荐

负载测试工具 - 有助于对站点或应用程序进行性能/负载测试 1&#xff09;WebLOAD WebLOAD 是一款出色的测试工具&#xff0c;提供了许多强大的脚本功能&#xff0c;有助于测试复杂场景。该工具支持从 Selenium 到移动端、从企业应用到网络协议的数百种技术。使用这款工具可以…

Java | Leetcode Java题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution {public int numSquares(int n) {if (isPerfectSquare(n)) {return 1;}if (checkAnswer4(n)) {return 4;}for (int i 1; i * i < n; i) {int j n - i * i;if (isPerfectSquare(j)) {return 2;}}return 3;}// 判断是否为…

nVisual综合布线预标签解决方案

1 跳线变更前编制标签编码、打印标签、粘贴标签费时费力&#xff1b; 2 无标签、假标签、标签错误问题造成后期无法查询线缆连接关系&#xff1b; 1 跳线出厂时在跳线两端预粘贴条码标签&#xff0c;为每条跳线设置唯一ID&#xff1b; 2 跳线变更完成后&…

MySQL练手 --- 1251. 平均售价

题目链接&#xff1a;1251. 平均售价 思路&#xff1a; 由题意可知&#xff0c;Prices表和UnitsSold表&#xff0c;表的连接关系为一对一&#xff0c;连接字段&#xff08;匹配字段&#xff09;为product_id 要求&#xff1a;查找每种产品的平均售价。而Prices表含有价格还有…