码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 时间序列预测实战(十七)利用Prophet实现电力负荷长期预测(附代码+数据集+详细讲解)


    一、本文介绍 

    Prophet是一个由Facebook开发的开源工具,用于时间序列预测。这个工具特别适合于具有强季节性影响和多个历史数据季节的业务时间序列数据。Prophet的主要思想是将数据分解为如下三个部分:趋势、季节性、节假日和特殊事件。这个模型非常适合于处理具有强烈季节性和趋势变化的业务时间序列数据(这里为什么适合的是业务数据呢是因为它考虑了节假日等特殊事件,同时其面对数据中的缺失值和异常值时也能保持其性能)。Prophet通过这种方式,可以有效地预测未来的趋势和模式。需要注意的是Prophet是一种介于机器学习和传统的时间序列预测方法中间的一种方法,其中分解趋势、季节性这种属于是传统的方法,但是其又可以自动拟合属于机器学习的方法。

    回顾内容:时间序列专栏->包含上百种时间序列预测模型以及基础讲解适合各种人群

    预测类型:长期预测、单元预测。

    预测效果图如下(未知数据)->

    目录

    一、本文介绍 

    二、Prophet介绍 

    2.1 Prophet的主要思想

    2.2 Prophet的优缺点

    三、数据集介绍

    四、参数讲解

    五、模型实战

    5.1 模型完整代码块

    5.2 模型训练和输出结果 

    六、结果展示和分析

    六、全文总结 


    二、Prophet介绍 

    2.1 Prophet的主要思想

    Prophet的主要思想是:提供一个灵活且易于使用的工具,用于处理各种业务时间序列数据的预测。它基于一个加性模型,其中非线性趋势与年度、周度和日度季节性模式结合,还可以包括节假日效应。这个模型包括几个主要部分:

    1. 趋势模型:它捕捉数据的长期趋势,可以处理趋势的变化,如趋势中的拐点。

    2. 季节性模型:识别并拟合数据的季节性模式,如一周内或一年内的周期性变化。

    3. 节假日组件:用户可以指定影响模型的特定日期或事件,如公共假期或特别活动。

    Prophet的目标是将这些复杂的时间序列分析技术变得更加易于理解和使用,即使是对于非专业人士来说。

    下图为Prophet处理时间这一特征时其考虑时间的方法

     而且岂会将时间处理为不同的维度进行处理如下图所示:分别为年月周日等多个维度。

    2.2 Prophet的优缺点

    Prophet的优点

    Prophet是一个由Facebook开发的开源工具,用于时间序列预测。这个工具特别适合于具有强季节性影响和多个历史数据季节的业务时间序列数据。Prophet的主要有点包括:

    1. 易于使用:Prophet旨在为分析师和开发者提供一个简单、直观的接口,使他们能够快速做出高质量的预测。

    2. 适应性强:它可以自动检测时间序列数据的变化趋势和季节性模式,甚至在存在缺失数据或历史数据的情况下也能进行有效的预测。

    3. 可定制:用户可以调整模型来适应特定的业务需求,比如通过添加节假日效应或者考虑特定的事件。

    4. 鲁棒性:它对异常值和缺失数据具有良好的抵抗力,能够生成准确的预测。

    总结:Prophet在许多类型的时间序列数据上都表现出色,特别是在处理日常、周末和年度节假日的影响方面具有独特优势。

    Prophet的缺点

    尽管如此,Prophet也有其局限性,它可能不适用于处理非常不规则或复杂的时间序列数据。此外,Prophet在进行预测时可能需要大量的历史数据来识别模式。

    三、数据集介绍

    我们本文用到的数据集是官方的ETTh1.csv ,该数据集是一个用于时间序列预测的电力负荷数据集,它是 ETTh 数据集系列中的一个。ETTh 数据集系列通常用于测试和评估时间序列预测模型。以下是 ETTh1.csv 数据集的一些内容:

    数据内容:该数据集通常包含有关电力系统的多种变量,如电力负荷、价格、天气情况等。这些变量可以用于预测未来的电力需求或价格。

    时间范围和分辨率:数据通常按小时或天记录,涵盖了数月或数年的时间跨度。具体的时间范围和分辨率可能会根据数据集的版本而异。 

    以下是该数据集的部分截图->

    ​

    四、参数讲解

    Prophet模型提供了多个参数,大家可以根据具体的数据集和业务需求调整模型。以下是这些参数及其接受的类型:

    参数名称参数类型参数介绍
    1growth字符串指定增长模型,通常是'linear'或'logistic'大家需要注意的是如果输入logistic则需要再输入数据中多加一个cap列表明你的数据可能的最大值,否则会报错。
    2changepointsPython列表

    python列表,指明数据什么时候会变化,这个一般不用输入,类似于某个特殊时间点。

    3n_changepoints整数自动选择的潜在趋势变化点的数量,这两参数比较重要大家需要反复尝试
    4changepoint_range浮点数用于选择变化点的数据历史比例,这两参数比较重要大家需要反复尝试
    5yearly_seasonality布尔值或整数年度季节性组件,是否开启True自动计算按照一年来,否则可以输入整数2、3年等。
    6weekly_seasonality布尔值或整数周季节性组件,和上面同理
    7daily_seasonality布尔值或整数日季节性组件,和上面同理
    8holidaysDataFrame包含假期信息的数据框
    9seasonality_prior_scale浮点数季节性组件的平滑度,这个参数其实需要用一些交叉验证或者网格搜索进行求最优化。
    10holiday_prior_scale浮点数假期组件的平滑度,这个参数其实需要用一些交叉验证或者网格搜索进行求最优化。
    11changepoint_prior_scale浮点数趋势变化点的灵敏度,这个参数其实需要用一些交叉验证或者网格搜索进行求最优化。
    12mcmc_samples整数MCMC采样的数量
    13interval_width浮点数预测区间的宽度
    14uncertainty_samples整数不确定性估计的模拟抽样数量

    五、模型实战

    5.1 模型完整代码块

    下面的代码大家复制粘贴即可运行,本文的模型Prophet用法十分简单只需要调用官方的接口既可以。 

    1. import pandas as pd
    2. from matplotlib import pyplot as plt
    3. from prophet import Prophet
    4. from sklearn.metrics import mean_absolute_error, mean_squared_error
    5. pre_length = 24 # 预测未来数据的长度,我的数据是一小时一间隔24等于一天
    6. df = pd.read_csv('ETTh1.csv')[['date', 'OT']] # 因为我的数据有多列,在这里我给这两列进行的单独提取出来
    7. # 从数据的末尾提出来一部分数据用于后面的对比
    8. train_df = df[:len(df) - pre_length]
    9. test_df = df[-pre_length:]
    10. # 这里需要将你的时间列和数据列进行重命名因为Prophet需要的两列名字固定是ds 和 y
    11. train_df.rename(columns={'date': 'ds', 'OT': 'y'}, inplace=True)
    12. test_df.rename(columns={'date': 'ds', 'OT': 'y'}, inplace=True)
    13. test_df.reset_index(drop=True, inplace=True)
    14. # 初始化Prophet模型
    15. model = Prophet(
    16. yearly_seasonality=True, # 启用年度季节性
    17. weekly_seasonality=True, # 启用周季节性
    18. daily_seasonality=True, # 启用日季节性
    19. changepoint_prior_scale=0.5, # 调整趋势变化点的灵敏度
    20. seasonality_prior_scale=5.0, # 调整季节性组件的灵敏度
    21. )
    22. # 拟合模型
    23. model.fit(train_df)
    24. # 创建未来日期的数据框,这里假设我们预测未来1天
    25. future = model.make_future_dataframe(periods=pre_length)
    26. # 进行预测
    27. forecast = model.predict(future).tail(pre_length)
    28. forecast.reset_index(inplace=True, drop=True) # 将索引重新排序
    29. # 展示预测结果
    30. print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']])
    31. mae = mean_absolute_error(test_df['y'], forecast['yhat'])
    32. mse = mean_squared_error(test_df['y'], forecast['yhat'])
    33. print("预测值和真实值的MAE:", mae)
    34. print("预测值和真实值的MSE:", mse)
    35. # 设置主题
    36. plt.style.use('ggplot')
    37. # 创建图表
    38. fig, ax = plt.subplots(figsize=(10, 6))
    39. # 绘制真实值
    40. ax.plot(test_df['y'], label='Actual', color='blue')
    41. # 绘制预测值
    42. ax.plot(forecast['yhat'], label='Forecast', color='cyan')
    43. # 绘制预测的不确定性范围(上下界)
    44. ax.fill_between(range(pre_length), forecast['yhat_lower'], forecast['yhat_upper'], color='grey', alpha=0.5)
    45. # 设置标题和标签
    46. ax.set_title('Prophet Forecast with Confidence Interval', fontsize=16)
    47. ax.set_xlabel('Date', fontsize=12)
    48. ax.set_ylabel('Value', fontsize=12)
    49. # 添加图例
    50. ax.legend()
    51. # 显示图表
    52. plt.show()

    5.2 模型训练和输出结果 

    当我们将上面的代码复制到一个py文件之后输入你的文件路径和要预测的数据周期之后,我们可以进行训练,控制台的输出如下图所示,其中的前两行为模型拟合过程,下面的结果为模型的预测输出结果,其中yhat就是模型的预测值。

    ​

    六、结果展示和分析

    下面的结果就是预测值和真实值的对比图,我这里的数据是按照小时为间隔,可以看到我这里预测了未来的24个时间点的数据也就是一天的数据,效果还可以吧只能说这个模型主要就是用法简单官方以只提供接口省去了很多训练的麻烦。

    同时我们可以看到下面的MAE和MSE的结果在控制台输出如下->

    六、全文总结 

    到此本文已经全部讲解完成了,希望能够帮助到大家,在这里也给大家推荐一些我其它的博客的时间序列实战案例讲解,其中有数据分析的讲解就是我前面提到的如何设置参数的分析博客,最后希望大家订阅我的专栏,本专栏均分文章均分98,并且免费阅读。

    概念理解 

    15种时间序列预测方法总结(包含多种方法代码实现)

    数据分析

    时间序列预测中的数据分析->周期性、相关性、滞后性、趋势性、离群值等特性的分析方法

    机器学习——难度等级(⭐⭐)

    时间序列预测实战(四)(Xgboost)(Python)(机器学习)图解机制原理实现时间序列预测和分类(附一键运行代码资源下载和代码讲解)

    深度学习——难度等级(⭐⭐⭐⭐)

    时间序列预测实战(五)基于Bi-LSTM横向搭配LSTM进行回归问题解决

    时间序列预测实战(七)(TPA-LSTM)结合TPA注意力机制的LSTM实现多元预测

    时间序列预测实战(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

    时间序列预测实战(十一)用SCINet实现滚动预测功能(附代码+数据集+原理介绍)

    时间序列预测实战(十二)DLinear模型实现滚动长期预测并可视化预测结果

    时间序列预测实战(十六)PyTorch实现GRU-FCN模型长期预测并可视化结果

    Transformer——难度等级(⭐⭐⭐⭐)

    时间序列预测模型实战案例(八)(Informer)个人数据集、详细参数、代码实战讲解

    时间序列预测模型实战案例(一)深度学习华为MTS-Mixers模型

    时间序列预测实战(十三)定制化数据集FNet模型实现滚动长期预测并可视化结果

    时间序列预测实战(十四)Transformer模型实现长期预测并可视化结果(附代码+数据集+原理介绍)

    个人创新模型——难度等级(⭐⭐⭐⭐⭐)

    时间序列预测实战(十)(CNN-GRU-LSTM)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

    传统的时间序列预测模型(⭐⭐)

    时间序列预测实战(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)

    时间序列预测实战(六)深入理解ARIMA包括差分和相关性分析

    融合模型——难度等级(⭐⭐⭐)

    时间序列预测实战(九)PyTorch实现融合移动平均和LSTM-ARIMA进行长期预测

    ​​​

  • 相关阅读:
    Elasticsearch集群
    golang字符串转64位整数
    地平线 旭日X3 PI (三) 模型转换
    第28章_瑞萨MCU零基础入门系列教程之基于面向对象的工程结构
    DBCO-PEG-sulfadimethoxine 二苯并环辛炔-聚乙二醇-磺胺地索辛 DBCO-PEG-磺胺地索辛
    linux--进程通信--管道通信
    热水即开即有,沐浴更舒畅,云米AI零冷水燃气热水器Super上手
    数据库——事务
    对称(镜像)二叉树
    深入协议栈了解TCP的三次握手、四次挥手、CLOSE-WAIT、TIME-WAIT。
  • 原文地址:https://blog.csdn.net/java1314777/article/details/134470389
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号