首页 > 其他分享 >【视频讲解】Xgboost、ARIMA 和 Prophet对国际牛肉市场市场份额数据、比特币价格时间序列预测-CSDN博客

【视频讲解】Xgboost、ARIMA 和 Prophet对国际牛肉市场市场份额数据、比特币价格时间序列预测-CSDN博客

时间:2024-08-05 23:50:04浏览次数:7  
标签:plt 预测 Prophet 模型 Xgboost ARIMA 01 数据

原文链接https://tecdat.cn/?p=37228

原文出处:拓端数据部落公众号

分析师:Kechen Zhao

本文将通过视频讲解,展示如何用Xgboost、ARIMA 和 Prophet对国际牛肉市场市场份额数据时间序列预测,并结合一个Python# ARIMA、XGBOOST、PROPHET和LSTM预测比特币价格实例的代码数据,为读者提供一套完整的实践数据分析流程。

摘要

国际贸易市场的波动受多种因素影响。本项目旨在通过历史数据识别最具影响力的因素,并利用这些因素预测国际市场的未来走势,特别关注澳洲牛肉在美国市场的份额。面对数据收集和模型选择的挑战,本研究将采用数学建模和分析方法。

任务/目标

本项目的目标是根据客户要求,整合多种数据源,实现对澳洲出口牛肉在美国市场份额未来半年至一年的预测,并进行深入分析。

数据源准备

客户已提供澳洲国内牛肉产业的统计数据和美国牛肉进口市场的部分分析。本研究进一步调查发现,澳洲的人口统计指标、气候条件、自然灾害、货币汇率、美国国内人口统计数据、居民平均收入以及素食主义者比例等因素,可能对澳洲牛肉出口量在美国市场的占比产生影响。政治事件和主要竞争者的特征也被纳入考虑。

特征转换和处理

由于数据多来源于年度报告,需将其转换为月度数据以满足预测需求。具体方法如下:

  • 生产总量数据:年产量除以12得到月平均产量。

  • 有趋势的数据(如人口增长):使用线性回归模型预测月度数据。

  • 图片形式的数据(如天气和自然灾害):手动输入以供模型使用。

  • 政治事件等非量化特征:采用虚拟变量方法,事件发生月份设为1,未发生设为0。

对于数据丢失的处理:

  1. 大量数据丢失:选择删除并寻找替代特征。

  2. 小部分数据丢失:缺失部分记录为0。

模型构建

基于上述特征收集和处理,构建预测模型。以下为部分特征示例,其中Import_ratio作为预测目标。

数据划分与模型构建

数据划分

为确保模型的准确性和泛化能力,我们将数据集分为训练集、测试集和验证集。具体划分如下:

12个月预测

  • 训练集:2008-01-01 至 2018-12-31

  • 测试集:2019-01-01 至 2019-12-31

  • 验证集:2014-01-01 至 2014-12-31 和 2016-01-01 至 2016-12-31

6个月预测

  • 训练集:2008-01-01 至 2019-06-30

  • 测试集:2019-07-01 至 2019-12-31

  • 验证集:2014-04-01 至 2014-09-30、2016-01-01 至 2016-06-30 和 2016-05-01 至 2016-10-31

模型选择

本项目共采用三种模型:Xgboost、ARIMA 和 Prophet。

ARIMA模型概述

ARIMA是一个广泛应用于时间序列预测的模型,它能够在不使用外部回归特征的情况下,仅利用历史数据进行预测。模型由以下三部分组成:

  1. 自回归(Autoregressive):使用变量本身的历史数据对未来进行预测。

  2. 差分(Integrated):将目标变量在某个时间点的数值用当前数值与上一个时间点数值的差所取代。

  3. 滑动平均(Moving Average):回归将以目标变量及其滞后误差的线性组合形式呈现。

基础模型建设

在选定模型后,首先进行基础模型的构建,即不包括任何特征,仅使用市场份额的历史数据进行预测,并记录三个模型的预测精度(RMSE, MAE, MAPE)。

基础模型表现

以下是基础模型在不同情况下的表现:

特征筛选与模型优化

季节性特征的影响

去除数据的季节性特征后,无论是6个月还是12个月的预测精度都得到了显著提升。

特征重要性评估

为了保证模型使用的一致性,并优化模型性能,我们采用了以下步骤对特征进行筛选:

  1. 特征重要性评估:使用Xgboost模型和SHAP值(一种Wrapper方法)对特征进行重要性评估和排序。

  2. 特征选择:基于评估结果,选择对预测结果影响最大的特征进行建模。

特征选择示例

以下是根据SHAP值针对12个月预测所选出的重要特征

模型训练与优化

特征集选择与季节性数据的影响

选定特征后,我们将使用不同的特征集对ARIMA模型进行训练,并考虑是否包含季节性数据。模型将对测试集进行预测,并计算模型的准确度。此外,模型在验证集上的表现也将被评估。

模型对比与优化

  • 将得到的数据与基础模型进行对比,以衡量所选特征和季节性特征对未来预测结果的影响。

  • 对于未来6个月和12个月的预测,将根据测试集和验证集的表现,筛选出两个准确度最高的ARIMA模型。

  • 在不引起过度拟合的前提下,根据客户要求加入额外的竞争者特征,进一步提高模型准确性。

  • 将ARIMA模型与最好的Xgboost和Prophet模型进行比较,以选出最终模型。

模型表现评估

在本项目中,针对未来12个月的预测,根据SHAP值与Wrapper方法选出的特征集,在三个不同的模型上都展现出了最佳效果。

模型表现与可视化

以下是使用选定特征集的三个模型的最佳准确度和可视化图:

Xgboost

With RMSE = 0.006415, MAE = 0.005216, MAPE = 2.480094.

ARIMA:

With RMSE = 0.02502, MAE = 0.01905, MAPE = 9.12969.

Prophet:

With RMSE = 0.0231, MAE = 0.0174, MAPE = 7.513.

模型选择与预测应用

模型比较与最终决策

经过比较,尽管三种模型都能够对过去和未来12个月的市场份额进行预测,但Xgboost模型在准确度上明显优于ARIMAProphet模型。因此,我们决定采用Xgboost模型,结合通过SHAP值和Wrapper方法选出的特征集,作为我们的最终模型。

模型应用

使用2008至2019年的完整数据集作为训练集,我们将利用最终模型对未来澳洲出口牛肉在美国市场所占份额进行预测。

预测的局限性与实际应用

虽然模型提供了一个参考值,但澳洲牛肉生产商和政府应根据此预测为未来做好相应的准备。然而,需要注意的是,不可预见的因素,如自2020年开始流行的新冠病毒,可能对国际牛肉市场和澳洲国内牛肉生产造成重大影响。具体应对策略需要根据实际情况灵活调整。因此,预测结果应被视为一个参考权重值,而非绝对的指导方针。

通过ARIMA、XGBOOST、PROPHET和LSTM预测比特币价格

比特币作为一种持续占据世界头条并日益流行的加密货币,随着越来越多的人和组织开始采用它。在本文中,我将测试4种不同的Python机器学习模型对比特币预测能力:ARIMA、Prophet、XGBoost和LSTM。通过将数据划分为测试集和训练集,我将比较每个模型的性能,并得出哪个模型表现最佳。

测试模型的标准程序

每个模型将在数据的前70%上进行训练,并在最后30%上进行测试。比特币数据将被重新采样为天,并仅限于过去4年的数据(从2021年3月31日起)。

每个模型的均方根误差(RMSE)将决定哪个模型最佳。RMSE是残差的标差——或者更简单地说,是残差分布的分散程度。

1. 探索性数据分析(EDA)

导入库:

 
  1.   python# 导入所需的库
  2.   import numpy as np
  3.   import pandas as pd
  4.   import datetime as dt
  5.   import seaborn as sns
  6.   import matplotlib.pyplot as plt
  7.   from sklearn.metrics import mean_squared_error
  8.   from math import sqrt
  9.   from pandas.plotting import autocorrelation_plot
 

读取数据集到数据框:

 
  1.   python# 将数据集读取到数据框中
  2.    
  3.    
  4.   df.head()
 

绘制比特币价格随时间变化的图表:

 
  1.   python复制# 绘制比特币价格随时间变化的图表
  2.    
  3.   plt.tight_layout()
  4.    
  5.    
 

正如图表所示,2017-2021年的价格行为与2012-2017年有显著不同

绘制自相关图,查看时间序列中是否存在大量的滞后:

 
  1.   python复制# 绘制自相关图,查看时间序列中是否存在大量的滞后
  2.   autocorrelation_plot(df)
  3.   plt.show()
 

查看过去200天的数据,可能需要调整数据以适应这个时间段:

 
  1.   python复制# 查看过去200天的数据,可能需要调整数据以适应这个时间段
  2.   df.Weighted_Price.iloc[-200:].
  3.   figsize=(14,6))
  4.   plt.tight_layout()
  5.    
  6.    
  7.   plt.show()
 

 
  1.   df2.Weighted_Price.plot(title = "Bitcoin Price", figsize=(14,6))
  2.   plt.tight_layout()
  3.   plt.xlabel('Dates')
  4.   plt.ylabel('$ Price')
  5.   plt.show()
  6.    
 

数据看起来对于训练模型更为相关。然而,最近的峰值将涉及测试数据分割 - 这是一个艰难的预测。

1. ARIMA滚动预测

首先,我创建了一个ARIMA滚动预测模型,以获得一个优秀的RMSE基线。然而,由于这个模型是按滚动的日增量进行预测的,与其他模型进行比较并不公平。如图所示,预测值以红色显示,实际价格以蓝色显示。然而,我们必须放大更多才能区分两者。
评估预测:

 
  1.   # 评估预测 rmse = sqrt(mean_squared_error(test, predictions)) print(
  2.   # 绘制预测与实际结果的对比图 plt.plot(test) plt.plot(predictions, color='red') plt.show()
 

 
  1.   plt.plot(predictions, color='red')
  2.   plt.xlabel('Days')
  3.   plt.ylabel('$ Price')
  4.   plt.title('Predicted vs. Actual BTC Price')
  5.   plt.show()
 
Test RMSE: 914.737

 
  1.   plt.plot(predictions[-50:], color='red')
  2.   plt.xlabel('Days')
  3.   plt.ylabel('$ Price')
  4.   plt.title('Predicted vs. Expected BTC Price Forecast')
  5.   plt.show()
 

2. PROPHET模型

Prophet库是由Facebook开发的开源库,专为时间序列数据的自动预测而设计。该模型主要关注趋势和季节性的预测。但由于其易用性,我决定首先使用默认设置来实现这个模型。如图所示,先知模型预测比特币价格将会下跌。此外,该模型还提供了上限和下限的估计值(阴影区域的边缘)。虽然上限估计的斜率方向准确,但与测试数据相比,这个模型表现不佳。

频率为天,周期为测试数据的长度:

# 频率为天,周期为测试数据的长度 future = model.make_future_dataframe(periods=len(test), freq='D') forecasting = model.predict(future) # 存储预测结果并返回RMSE y_true = test['y'].values y_pred = forecasting.yhat.values[-len(test):]

 
  1.   # 绘制预测图 model.plot(forecasting)
  2.   plt.ylabel('$ Price')
  3.   plt.xlabel('Date')
  4.   plt.show()
 

3. ARIMA模型

接下来是ARIMA模型,它是自回归积分滑动平均(AutoRegressive Integrated Moving Average)的缩写。ARIMA是一种广泛使用的统计方法,用于分析和预测时间序列数据。它由一组时间序列数据的标准结构组成,并提供了一种简单而强大的方法来进行熟练的时间序列预测。ARIMA模型有3个参数(p, d, q),这些参数指示正在使用的特定ARIMA模型。我只是应用了我以前在不同的时间序列数据上使用过的参数,这可能导致模型不利。

 
  1.   # 按照常规方法将数据分为70%的训练集和30%的测试集
  2.   price = df2.Weighted_Price # 获取比特币加权价格数据
  3.   X = price.values # 将价格数据转换为数值数组
  4.   datesX = price.index # 获取价格数据的索引(日期)
  5.   size = int(len(X) * 0.70) # 计算训练集的大小
  6.   train, test = X[0:size], X[size:len(X)] # 分割数据为训练集和测试集
  7.   days_in_year = 365 # 定义一年中的天数
  8.   plotDates = datesX[size:len(X)] # 获取测试集的日期索引,用于后续绘图
  9.    
  10.   # 使用ARIMA模型进行预测,参数设置为(5,1,0)
  11.   differenced = difference(train, days_in_year) # 对训练数据进行差分处理,以满足ARIMA模型的平稳性要求
  12.   model = ARIMA(differenced, order=(5, 1, 0)) # 初始化ARIMA模型,参数p=5, d=1, q=0
  13.   model_fit = model.fit() # 拟合模型
  14.   start_index = len(differenced) # 预测的起始索引
  15.   end_index = start_index + 438 # 预测的结束索引,这里选择了438步进行预测
  16.   forecast = model_fit.predict(start=start_index, end=end_index) # 进行预测
  17.    
  18.   history = [x for x in train] # 初始化历史数据列表,用于存储训练数据
  19.   day = 1 # 初始化天数计数器
  20.   predicted_results = list() # 初始化预测结果列表
 

4. LSTM模型

长短期记忆(LSTM)模型是一种能够学习观察序列的循环神经网络。这使它们成为适合时间序列预测的深度学习网络。然而,通常LSTM在处理像比特币这样波动大且难以预测的时间序列数据集时会遇到困难。经过艰苦的过程尝试应用我的数据后,我终于训练了模型。在最后的拟合中,我使用了50个周期和“adam”优化器。

model.compile(loss="mean_squared_error",optimizer="adam")
 
  1.   # fit the model to the training data
  2.   model.fit(x_train,y_train,epochs=50,batch_size=32)
 

 
  1.   plt.xticks(x, labels, rotation = 'vertical')
  2.   plt.xlabel('Time')
  3.   plt.ylabel('$ Price')
  4.   plt.legend(loc=4, prop={'size': 14})
  5.   plt.show()
 

5. XGBOOST模型

XGBoost是目前最流行的机器学习算法之一。无论手头的预测任务是回归还是分类。XGBoost以其比其他机器学习算法提供更好的解决方案而闻名。事实上,自从它诞生以来,它已经成为处理结构化数据的“最新技术”机器学习算法。然而,在这种情况下,我们将在时间序列数据上使用它。因此,模型需要从日期时间索引创建时间序列特征 - 用于在预测时与其目标价格标签一起使用。不幸的是,最终模型表现不佳。

6. 结论

最终结果如下所示。长短期记忆模型在处理像比特币价格这样波动大且难以预测的数据时,被证明是最有效的。这个比特币数据集包含了极其波动和异常的时间序列数据。因此,我发现模型在预测最近439天的价格时遇到了困难,我并不感到惊讶。此外,我承认我本可以选择更好、更明智的参数,以便让这些模型和库的结果更公平。然而,我认为LSTM模型的低RMSE证明了神经网络在机器学习中的强大能力。我期待在未来更深入地探索RNN在金融时间序列数据中的应用!

 
  1.    
  2.   ax.bar(modelz,nums)
  3.   plt.xlabel('Models')
  4.   plt.ylabel('RMSE')
  5.   plt.title('RMSE of the Models')
  6.   plt.show()
  7.   plt.show()
 

关于分析师

在此对Kechen Zhao对本文所作的贡献表示诚挚感谢。她在墨尔本大学完成了学业,获得应用数学与统计本科学位,并进一步深造获得数据科学研究生学历。Kechen Zhao在软件方面有着深厚的技能,特别擅长使用R 语言PythonJava。在专业领域,他尤其擅长机器学习数据采集分析和处理以及数学建模和预测

标签:plt,预测,Prophet,模型,Xgboost,ARIMA,01,数据
From: https://www.cnblogs.com/tecdat/p/18344267

相关文章

  • 时间序列分析——指数平滑和ARIMA模型
    个人学习笔记,课程为数学建模清风付费课程目录一、时间序列分析1.1时间序列数据1.2时间序列的基本概念1.3区分时期和时点时间序列1.4时间序列分解1.4.1长期趋势:T1.4.2季节趋势:S1.4.3循环变动:C1.4.4不规则变动:I1.5叠加模型和乘积模型1.6Spss处理时间序列中的缺失值1......
  • 基于随机森林、XGBoost、lightGBM的大气污染预测可视化系统【前后端交互】
    文章目录==有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主==数据介绍系统界面展示系统登陆展示系统主界面可视化展示机器学习模型预测展示框架界面功能每文一语有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主数据介绍使用的大气......
  • train_test_split 导致 xgboost 忽略“enable_categorical”
    我正在使用xgboost版本2.1.0当使用xgboost.DMatrix()和'enable_categorical'=True将包含类别列的pandas数据帧转换为DMatrix时,所有行为均按预期运行,除非数据帧是sklearntrain_test_split()返回的数据帧,尽管所有列的数据类型仍属于类别。以下代码产生预期的......
  • xgboost的作用与库的安装
    XGBoost是一个非常强大的Boosting算法工具包,‌以其优秀的性能(‌效果与速度)‌在数据科学比赛中长期占据领先地位,‌并且在许多大厂的机器学习方案中也是首选模型。‌ XGBoost在并行计算效率、‌缺失值处理、‌控制过拟合、‌预测泛化能力等方面表现出色。‌它的主要特点和优势包括:......
  • Coggle数据科学 | Kaggle 知识点:时序模型 Prophet
    本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。原文链接:Kaggle知识点:时序模型ProphetProphet 算法在时间序列中Prophet是Facebook开源的时间序列预测算法,可以有效处理节假日信息,并按周、月、年对时间序列数据的变化趋势进行拟合。https://facebook.g......
  • 过采样SMOTE逻辑回归、SVM、随机森林、AdaBoost和XGBoost对不平衡数据分析预测
    全文链接:https://tecdat.cn/?p=37115原文出处:拓端数据部落公众号分析师:YimengLi近几年,伴随着互联网的发展,在线食品配送业务成为了新潮流。在此背景下,我们帮助客户对“在线食品交付偏好-班加罗尔地区”数据开展研究,建立印度在线食品配送平台消费者的用户画像,研究影响顾客购买意......
  • XGBoostError:参数详细程度的值为 -1 超出界限 [0,3]
    错误信息如标题所示。根据我下面的代码,这对我来说没有意义:clf=xgboost.XGBClassifier(verbosity=1)print(clf.__class__,clf.verbosity)#prints<class'xgboost.sklearn.XGBClassifier'>1clf.fit(X=train_data_iter[features].fillna(0),y=train_data_iter['y'......
  • XGBoost、RF随机森林算法MATLAB实现
    %加载并预处理训练数据opts1=detectImportOptions('附件一AE.xlsx','PreserveVariableNames',true);train_data=readtable('附件一AE.xlsx',opts1);train_data.Time=datetime(train_data.time,'InputFormat','yyyy-MM-ddHH:mm:s......
  • 【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列预测|
    全文链接:tecdat.cn/?p=37019分析师:HaopengLi随着我国股票市场规模的不断扩大、制度的不断完善,它在金融市场中也成为了越来越不可或缺的一部分。基于此,选择合适的模型对股票价格进行精准、可靠的预测变得愈加重要。因为股票市场容易受到经济、政策、心理等多种相关因素的影响......
  • XGBoost模型构建+SHAP解析-Python代码——用XGBoost模型实现机器学习并进行黑箱过程解
    一、XGBoost模型简介1.1适用范围XGBoost(ExtremeGradientBoosting)是一个基于梯度提升(GradientBoosting)框架的增强算法,广泛应用于分类、回归、排序等任务。常见的应用包括:信用风险评估销售预测病毒检测图像识别1.2原理XGBoost是梯度提升树(GradientBoostedDecisionTree......