首页 > 其他分享 >利用 XGBoost 进行时间序列预测

利用 XGBoost 进行时间序列预测

时间:2023-08-23 16:48:09浏览次数:122  
标签:meantemp 预测 df XGBoost test train 序列

推荐:使用NSDT场景编辑器助你快速搭建3D应用场景

XGBoost 应用程序的常见情况是分类预测(如欺诈检测)或回归预测(如房价预测)。但是,也可以扩展 XGBoost 算法以预测时间序列数据。它是如何工作的?让我们进一步探讨这一点。

时间序列预测

数据科学和机器学习中的预测是一种技术,用于根据一段时间内收集的历史数据(以定期或不定期间隔)预测未来的数值。

与每个观测值都独立于另一个观测值的常见机器学习训练数据不同,时序预测的数据必须按连续顺序排列并与每个数据点相关。例如,时间序列数据可以包括月度库存、每周天气、每日销售额等。

让我们看一下来自 Kaggle 的示例时间序列数据每日气候数据。

import pandas as pd

train = pd.read_csv('DailyDelhiClimateTrain.csv')
test = pd.read_csv('DailyDelhiClimateTest.csv')

train.head()
利用 XGBoost 进行时间序列预测

如果我们看一下上面的数据帧,每个特征都是每天记录的。日期列表示观测数据的时间,并且每个观测值都是相关的。

时间序列预测通常包含数据中的趋势、季节性和其他模式来创建预测。查看模式的一种简单方法是可视化它们。例如,我将可视化示例数据集中的平均温度数据。

train["date"] = pd.to_datetime(train["date"])
test["date"] = pd.to_datetime(test["date"])

train = train.set_index("date")
test = test.set_index("date")

train["meantemp"].plot(style="k", figsize=(10, 5), label="train")
test["meantemp"].plot(style="b", figsize=(10, 5), label="test")
plt.title("Mean Temperature Dehli Data")
plt.legend()
利用 XGBoost 进行时间序列预测

在上图中,我们很容易看到,每年都有一个共同的季节性模式。通过整合这些信息,我们可以了解数据的工作原理,并确定哪个模型可能适合我们的预测模型。

典型的预测模型包括 ARIMA、向量自回归、指数平滑和先知。但是,我们也可以利用XGBoost来提供预测。

XGBoost Forecasting

在准备使用 XGBoost 进行预测之前,我们必须先安装软件包。

pip install xgboost

安装后,我们将为模型训练准备数据。理论上,XGBoost Forecasting将实现基于单个或多个特征的回归模型来预测未来的数值。这就是为什么数据训练也必须在数值中。此外,为了将时间运动纳入我们的XGBoost模型中,我们将时间数据转换为多个数值特征。

让我们首先创建一个函数来从日期创建数字特征。

def create_time_feature(df):
    df['dayofmonth'] = df['date'].dt.day
    df['dayofweek'] = df['date'].dt.dayofweek
    df['quarter'] = df['date'].dt.quarter
    df['month'] = df['date'].dt.month
    df['year'] = df['date'].dt.year
    df['dayofyear'] = df['date'].dt.dayofyear
    df['weekofyear'] = df['date'].dt.weekofyear
    return df

接下来,我们将此函数应用于训练和测试数据。

train = create_time_feature(train)
test = create_time_feature(test)

train.head()
Leveraging XGBoost for Time-Series Forecasting

所需信息现已全部可用。接下来,我们将定义我们想要预测的内容。在此示例中,我们将预测平均温度并根据上述数据制作训练数据。

X_train = train.drop('meantemp', axis =1)
y_train = train['meantemp']

X_test = test.drop('meantemp', axis =1)
y_test = test['meantemp']

我仍然会使用其他信息(例如湿度)来表明XGBoost也可以使用多变量方法预测值。但是,在实践中,我们只纳入我们在尝试预测时知道存在的数据。

让我们通过将数据拟合到模型中来开始训练过程。对于当前示例,除了树的数量之外,我们不会进行太多的超参数优化。

import xgboost as xgb

reg = xgb.XGBRegressor(n_estimators=1000)
reg.fit(X_train, y_train, verbose = False)

在训练过程之后,让我们看看模型的特征重要性。

xgb.plot_importance(reg)
Leveraging XGBoost for Time-Series Forecasting

这三个初始特征对预测的帮助并不大,但时间特征也有助于预测。让我们尝试对测试数据进行预测并可视化它们。

test['meantemp_Prediction'] = reg.predict(X_test)

train['meantemp'].plot(style='k', figsize=(10,5), label = 'train')
test['meantemp'].plot(style='b', figsize=(10,5), label = 'test')
test['meantemp_Prediction'].plot(style='r', figsize=(10,5), label = 'prediction')
plt.title('Mean Temperature Dehli Data')
plt.legend()
利用 XGBoost 进行时间序列预测

从上图可以看出,预测可能看起来略有偏差,但仍遵循整体趋势。让我们尝试根据错误指标评估模型。

from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error

print('RMSE: ', round(mean_squared_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAE: ', round(mean_absolute_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAPE: ', round(mean_absolute_percentage_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))

RMSE: 11.514

前:2.655

MAPE: 0.133

结果表明,我们的预测可能有13%左右的误差,RMSE在预测中也显示出轻微的误差。可以使用超参数优化来改进模型,但我们已经了解了如何将 XGBoost 用于预测。

结论

XGBoost是一种开源算法,通常用于许多数据科学案例和Kaggle竞赛。通常用例是常见的分类案例,如欺诈检测或回归案例,如房价预测,但XGBoost也可以扩展到时间序列预测。通过使用 XGBoost 回归器,我们可以创建一个可以预测未来数值的模型。

3D建模学习工作室 整理翻译,转载请注明出处!

标签:meantemp,预测,df,XGBoost,test,train,序列
From: https://www.cnblogs.com/mvrlink/p/17652065.html

相关文章

  • hdu 1003 最大最长上升子序列 贪心
    要想找到符合条件的序列,我们应该有以下条件 一个数重头开始遍历相加,如果这个数大于0的话,继续加后面的数,如果小于0的话,重后面的数开始重新遍历;这个过程中保证了大数一定会出现,所以应该找出大数;sum大于0的话,与后面的数相加有可能是最大数;如果小于0,则,重新开始会比以前的数更大;一下是......
  • hdu 1003 最大最长子序列 dp
    我的dp思路是记b[j]表示到到j位,最大最长的子序列的和则可得状态转移方程b[j]=max(b[j-1]+a[j],a[j]);因为每个数都有两种状态,要么和前面相连,要么自己相连;让后再比较出来最大值;一下是我的代码#include<stdio.h>#include<stdlib.h>#include<stdlib.h>#include<math.h>#includ......
  • Python基础入门学习笔记 016 序列!序列!
    •列表、元组和字符串的共同点–都可以通过索引得到每一个元素–默认索引值总是从0开始–可以通过分片的方法得到一个范围内的元素的集合–有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)使用list方法 元组转换为列表 max()返回序列或者参数集合中的最大......
  • 最新的windows xp sp3序列号 xp序列号
    xp系统:链接:https://pan.baidu.com/s/1tIytK1XCyKFZXeR89RdTxA?pwd=sx9j提取码:sx9j最新的windowsxpsp3序列号(绝对可通过正版验证)MRX3F-47B9T-2487J-KWKMF-RPWBY(工行版)可用(强推此号)QC986-27D34-6M3TY-JJXP9-TBGMD(台湾交大学生版)可用CM3HY-26VYW-6JRYC-X66GX-JVY......
  • [算法学习笔记] O(nlogn)求最长上升子序列
    朴素dp求最长上升子序列大家应该都会朴素dp求最长上升子序列,简单回忆一下。我们令\(f_i\)表示以第\(i\)位元素为结尾的最长上升子序列长度。满足\(\forallj<i\),则有:\(f_i=max(f_i,f_j+1)[a_j<a_i]\)Explanation:\(a_i\)前面若有多个可以拼接的序列,则拼一个......
  • 【译】未来预测:远程办公或将引领下一个十年的工作趋势!
    在21世纪的背景下,就业前景的不确定性日益加剧。鉴于科技进步的脚步迅速和社会经济环境的变动,预测未来十年的职业趋势无疑是一项充满挑战的任务。另一方面,依据现行模式和预期,我们也有能力构建出一些趋势和预测。以下,我将针对其中的部分趋势进行探讨,并对近期的就业情况做出预测。自......
  • P2572 序列操作 题解
    link。对平衡树的懒标记的应用题,其实和线段树也差不多。如果不考虑取反操作,那维护操作\(5\)就需要知道当前区间答案,当前区间前缀和后缀,因为在push_up时我们当前区间的答案肯定等于左区间的答案,右区间的答案以及左区间的后缀加上右区间的前缀这三者间的最大值。但与线段树不......
  • 2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序
    2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K,返回有多少子序列的最大公约数为K。结果可能很大,对1000000007取模。1<=N<=10^5,1<=arr[i]<=10^5。来自腾讯笔试。来自左程云。答案2023-08-22:算法过程分步描述如下:1.初始化数组dp、cnt和pow2,长度为MAX......
  • 论文解读:《采用预训练蛋白嵌入贝叶斯神经网络,提高了药物蛋白的预测精度
    期刊:Bioinformatics中科院分区:1Q影像因子:6.937一、摘要动机:表征药物-蛋白质相互作用对于药物发现的高通量筛选至关重要。基于深度学习的方法引起了人们的关注,因为它们无需人工试错即可预测药物蛋白质相互作用。然而,由于数据标记需要大量资源,可用的蛋白质数据量相对较小,从而降低了模......
  • R语言神经网络模型预测多元时间序列数据可视化|附代码数据
    全文链接:http://tecdat.cn/?p=32198最近我们被客户要求撰写关于神经网络的研究报告,包括一些图形和统计输出。多元时间序列建模一直是吸引了来自经济,金融和交通等各个领域的研究人员的主题 ( 点击文末“阅读原文”获取完整代码数据******** )。多元时间序列预测的一个基本假设......