赞
踩
原文链接:https://tecdat.cn/?p=37228
原文出处:拓端数据部落公众号
分析师:Kechen Zhao
本文将通过视频讲解,展示如何用Xgboost、ARIMA 和 Prophet对国际牛肉市场市场份额数据时间序列预测,并结合一个Python# ARIMA、XGBOOST、PROPHET和LSTM预测比特币价格实例的代码数据,为读者提供一套完整的实践数据分析流程。
国际贸易市场的波动受多种因素影响。本项目旨在通过历史数据识别最具影响力的因素,并利用这些因素预测国际市场的未来走势,特别关注澳洲牛肉在美国市场的份额。面对数据收集和模型选择的挑战,本研究将采用数学建模和分析方法。
本项目的目标是根据客户要求,整合多种数据源,实现对澳洲出口牛肉在美国市场份额未来半年至一年的预测,并进行深入分析。
客户已提供澳洲国内牛肉产业的统计数据和美国牛肉进口市场的部分分析。本研究进一步调查发现,澳洲的人口统计指标、气候条件、自然灾害、货币汇率、美国国内人口统计数据、居民平均收入以及素食主义者比例等因素,可能对澳洲牛肉出口量在美国市场的占比产生影响。政治事件和主要竞争者的特征也被纳入考虑。
由于数据多来源于年度报告,需将其转换为月度数据以满足预测需求。具体方法如下:
生产总量数据:年产量除以12得到月平均产量。
有趋势的数据(如人口增长):使用线性回归模型预测月度数据。
图片形式的数据(如天气和自然灾害):手动输入以供模型使用。
政治事件等非量化特征:采用虚拟变量方法,事件发生月份设为1,未发生设为0。
对于数据丢失的处理:
大量数据丢失:选择删除并寻找替代特征。
小部分数据丢失:缺失部分记录为0。
基于上述特征收集和处理,构建预测模型。以下为部分特征示例,其中Import_ratio
作为预测目标。
为确保模型的准确性和泛化能力,我们将数据集分为训练集、测试集和验证集。具体划分如下:
训练集:2008-01-01 至 2018-12-31
测试集:2019-01-01 至 2019-12-31
验证集:2014-01-01 至 2014-12-31 和 2016-01-01 至 2016-12-31
训练集: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是一个广泛应用于时间序列预测的模型,它能够在不使用外部回归特征的情况下,仅利用历史数据进行预测。模型由以下三部分组成:
自回归(Autoregressive):使用变量本身的历史数据对未来进行预测。
差分(Integrated):将目标变量在某个时间点的数值用当前数值与上一个时间点数值的差所取代。
滑动平均(Moving Average):回归将以目标变量及其滞后误差的线性组合形式呈现。
在选定模型后,首先进行基础模型的构建,即不包括任何特征,仅使用市场份额的历史数据进行预测,并记录三个模型的预测精度(RMSE, MAE, MAPE)。
以下是基础模型在不同情况下的表现:
去除数据的季节性特征后,无论是6个月还是12个月的预测精度都得到了显著提升。
为了保证模型使用的一致性,并优化模型性能,我们采用了以下步骤对特征进行筛选:
特征重要性评估:使用Xgboost模型和SHAP值(一种Wrapper方法)对特征进行重要性评估和排序。
特征选择:基于评估结果,选择对预测结果影响最大的特征进行建模。
以下是根据SHAP值针对12个月预测所选出的重要特征
选定特征后,我们将使用不同的特征集对ARIMA模型进行训练,并考虑是否包含季节性数据。模型将对测试集进行预测,并计算模型的准确度。此外,模型在验证集上的表现也将被评估。
将得到的数据与基础模型进行对比,以衡量所选特征和季节性特征对未来预测结果的影响。
对于未来6个月和12个月的预测,将根据测试集和验证集的表现,筛选出两个准确度最高的ARIMA模型。
在不引起过度拟合的前提下,根据客户要求加入额外的竞争者特征,进一步提高模型准确性。
将ARIMA模型与最好的Xgboost和Prophet模型进行比较,以选出最终模型。
在本项目中,针对未来12个月的预测,根据SHAP值与Wrapper方法选出的特征集,在三个不同的模型上都展现出了最佳效果。
以下是使用选定特征集的三个模型的最佳准确度和可视化图:
With RMSE = 0.006415, MAE = 0.005216, MAPE = 2.480094.
With RMSE = 0.02502, MAE = 0.01905, MAPE = 9.12969.
With RMSE = 0.0231, MAE = 0.0174, MAPE = 7.513.
经过比较,尽管三种模型都能够对过去和未来12个月的市场份额进行预测,但Xgboost模型在准确度上明显优于ARIMA和Prophet模型。因此,我们决定采用Xgboost模型,结合通过SHAP值和Wrapper方法选出的特征集,作为我们的最终模型。
使用2008至2019年的完整数据集作为训练集,我们将利用最终模型对未来澳洲出口牛肉在美国市场所占份额进行预测。
虽然模型提供了一个参考值,但澳洲牛肉生产商和政府应根据此预测为未来做好相应的准备。然而,需要注意的是,不可预见的因素,如自2020年开始流行的新冠病毒,可能对国际牛肉市场和澳洲国内牛肉生产造成重大影响。具体应对策略需要根据实际情况灵活调整。因此,预测结果应被视为一个参考权重值,而非绝对的指导方针。
比特币作为一种持续占据世界头条并日益流行的加密货币,随着越来越多的人和组织开始采用它。在本文中,我将测试4种不同的Python机器学习模型对比特币预测能力:ARIMA、Prophet、XGBoost和LSTM。通过将数据划分为测试集和训练集,我将比较每个模型的性能,并得出哪个模型表现最佳。
每个模型将在数据的前70%上进行训练,并在最后30%上进行测试。比特币数据将被重新采样为天,并仅限于过去4年的数据(从2021年3月31日起)。
每个模型的均方根误差(RMSE)将决定哪个模型最佳。RMSE是残差的标差——或者更简单地说,是残差分布的分散程度。
导入库:
- python# 导入所需的库
- import numpy as np
- import pandas as pd
- import datetime as dt
- import seaborn as sns
- import matplotlib.pyplot as plt
- from sklearn.metrics import mean_squared_error
- from math import sqrt
- from pandas.plotting import autocorrelation_plot
读取数据集到数据框:
- python# 将数据集读取到数据框中
-
-
- df.head()
绘制比特币价格随时间变化的图表:
- python复制# 绘制比特币价格随时间变化的图表
-
- plt.tight_layout()
-
-
正如图表所示,2017-2021年的价格行为与2012-2017年有显著不同
绘制自相关图,查看时间序列中是否存在大量的滞后:
- python复制# 绘制自相关图,查看时间序列中是否存在大量的滞后
- autocorrelation_plot(df)
- plt.show()
查看过去200天的数据,可能需要调整数据以适应这个时间段:
- python复制# 查看过去200天的数据,可能需要调整数据以适应这个时间段
- df.Weighted_Price.iloc[-200:].
- figsize=(14,6))
- plt.tight_layout()
-
-
- plt.show()
- df2.Weighted_Price.plot(title = "Bitcoin Price", figsize=(14,6))
- plt.tight_layout()
- plt.xlabel('Dates')
- plt.ylabel('$ Price')
- plt.show()
-
数据看起来对于训练模型更为相关。然而,最近的峰值将涉及测试数据分割 - 这是一个艰难的预测。
首先,我创建了一个ARIMA滚动预测模型,以获得一个优秀的RMSE基线。然而,由于这个模型是按滚动的日增量进行预测的,与其他模型进行比较并不公平。如图所示,预测值以红色显示,实际价格以蓝色显示。然而,我们必须放大更多才能区分两者。
评估预测:
- # 评估预测 rmse = sqrt(mean_squared_error(test, predictions)) print(
- # 绘制预测与实际结果的对比图 plt.plot(test) plt.plot(predictions, color='red') plt.show()
- plt.plot(predictions, color='red')
- plt.xlabel('Days')
- plt.ylabel('$ Price')
- plt.title('Predicted vs. Actual BTC Price')
- plt.show()
Test RMSE: 914.737
- plt.plot(predictions[-50:], color='red')
- plt.xlabel('Days')
- plt.ylabel('$ Price')
- plt.title('Predicted vs. Expected BTC Price Forecast')
- plt.show()
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):]
- # 绘制预测图 model.plot(forecasting)
- plt.ylabel('$ Price')
- plt.xlabel('Date')
- plt.show()
接下来是ARIMA模型,它是自回归积分滑动平均(AutoRegressive Integrated Moving Average)的缩写。ARIMA是一种广泛使用的统计方法,用于分析和预测时间序列数据。它由一组时间序列数据的标准结构组成,并提供了一种简单而强大的方法来进行熟练的时间序列预测。ARIMA模型有3个参数(p, d, q),这些参数指示正在使用的特定ARIMA模型。我只是应用了我以前在不同的时间序列数据上使用过的参数,这可能导致模型不利。
- # 按照常规方法将数据分为70%的训练集和30%的测试集
- price = df2.Weighted_Price # 获取比特币加权价格数据
- X = price.values # 将价格数据转换为数值数组
- datesX = price.index # 获取价格数据的索引(日期)
- size = int(len(X) * 0.70) # 计算训练集的大小
- train, test = X[0:size], X[size:len(X)] # 分割数据为训练集和测试集
- days_in_year = 365 # 定义一年中的天数
- plotDates = datesX[size:len(X)] # 获取测试集的日期索引,用于后续绘图
-
- # 使用ARIMA模型进行预测,参数设置为(5,1,0)
- differenced = difference(train, days_in_year) # 对训练数据进行差分处理,以满足ARIMA模型的平稳性要求
- model = ARIMA(differenced, order=(5, 1, 0)) # 初始化ARIMA模型,参数p=5, d=1, q=0
- model_fit = model.fit() # 拟合模型
- start_index = len(differenced) # 预测的起始索引
- end_index = start_index + 438 # 预测的结束索引,这里选择了438步进行预测
- forecast = model_fit.predict(start=start_index, end=end_index) # 进行预测
-
- history = [x for x in train] # 初始化历史数据列表,用于存储训练数据
- day = 1 # 初始化天数计数器
- predicted_results = list() # 初始化预测结果列表
长短期记忆(LSTM)模型是一种能够学习观察序列的循环神经网络。这使它们成为适合时间序列预测的深度学习网络。然而,通常LSTM在处理像比特币这样波动大且难以预测的时间序列数据集时会遇到困难。经过艰苦的过程尝试应用我的数据后,我终于训练了模型。在最后的拟合中,我使用了50个周期和“adam”优化器。
model.compile(loss="mean_squared_error",optimizer="adam")
- # fit the model to the training data
- model.fit(x_train,y_train,epochs=50,batch_size=32)
- plt.xticks(x, labels, rotation = 'vertical')
- plt.xlabel('Time')
- plt.ylabel('$ Price')
- plt.legend(loc=4, prop={'size': 14})
- plt.show()
XGBoost是目前最流行的机器学习算法之一。无论手头的预测任务是回归还是分类。XGBoost以其比其他机器学习算法提供更好的解决方案而闻名。事实上,自从它诞生以来,它已经成为处理结构化数据的“最新技术”机器学习算法。然而,在这种情况下,我们将在时间序列数据上使用它。因此,模型需要从日期时间索引创建时间序列特征 - 用于在预测时与其目标价格标签一起使用。不幸的是,最终模型表现不佳。
最终结果如下所示。长短期记忆模型在处理像比特币价格这样波动大且难以预测的数据时,被证明是最有效的。这个比特币数据集包含了极其波动和异常的时间序列数据。因此,我发现模型在预测最近439天的价格时遇到了困难,我并不感到惊讶。此外,我承认我本可以选择更好、更明智的参数,以便让这些模型和库的结果更公平。然而,我认为LSTM模型的低RMSE证明了神经网络在机器学习中的强大能力。我期待在未来更深入地探索RNN在金融时间序列数据中的应用!
-
- ax.bar(modelz,nums)
- plt.xlabel('Models')
- plt.ylabel('RMSE')
- plt.title('RMSE of the Models')
- plt.show()
- plt.show()
在此对Kechen Zhao对本文所作的贡献表示诚挚感谢。她在墨尔本大学完成了学业,获得应用数学与统计本科学位,并进一步深造获得数据科学研究生学历。Kechen Zhao在软件方面有着深厚的技能,特别擅长使用R 语言、Python和Java。在专业领域,他尤其擅长机器学习、数据采集、分析和处理以及数学建模和预测。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。