如何使用XGBoost和InluxDB进行时间序列预测
XGBoost是一个流行的开源机器学习库,可用于解决各种预测问题。人们需要了解如何使用它与InfluxDB进行时间序列预测。
译者 | 李睿
审校 | 孙淑娟
XGBoost是一个开源的机器学习库,它实现了优化的分布式梯度增强算法。XGBoost使用并行处理实现快速性能,很好地处理缺失值,在小型数据集上执行良好,并防止过拟合。所有这些优点使XGBoost成为回归问题(例如预测)的一种流行解决方案。
预测是各种业务目标的关键任务,例如预测分析、预测维护、产品规划、预算等。许多预测或预测问题都涉及到时间序列数据。这使得XGBoost成为开源时间序列数据库InfluxDB的出色伙伴。
本教程将学习如何使用XGBoost的Python包预测来自InfluxDB时间序列数据库的数据。还将使用InfluxDB Python客户端库从InfluxDB查询数据,并将数据转换为Pandas DataFrame,以便更容易地使用时间序列数据,然后再做预测。此外,还将更详细地讨论XGBoost的优点。
一、要求
本教程是在通过Homebrew安装Python 3的macOS系统上执行的。建议设置额外的工具,如virtualenv、pyenv或conda-env,以简化Python和客户端安装。否则,其全部要求如下:
- influxdb-client=1.30.0
- pandas = 1.4.3
- xgboost>=1.7.3
- influxdb-client>=1.30.0
- pandas>=1.4.3
- matplotlib>=3.5.2
- sklearn>=1.1.1
本教程还假设有一个免费的层InfluxDB云帐户,并且已经创建了一个存储桶和一个令牌,可以将存储桶视为数据库或InfluxDB中数据组织的最高层次结构。在本教程中,将创建一个名为NOAA的存储桶。
二、决策树、随机森林和梯度增强
为了理解XGBoost是什么,必须理解决策树、随机森林和梯度增强。决策树是一种有监督的学习方法,由一系列特征测试组成。每个节点都是一个测试,所有节点都被组织在一个流程图结构中。分支表示最终决定将哪个叶标签或类标签分配给输入数据的条件。
机器学习中的决策树用于确定明天是否会下雨。经过编辑以显示决策树的组件:叶、分支和节点。
决策树、随机森林和梯度增强背后的指导原则是,多个“弱学习者”或分类器共同做出强大的预测。
随机森林包含多个决策树。决策树中的每个节点都被认为是弱学习者,随机森林中的每个决策树被认为是随机森林模型中许多弱学习者中的一个。通常情况下,所有的数据都被随机划分为子集,并通过不同的决策树进行传递。
使用决策树和随机森林的梯度增强是相似的,但它们的结构方式不同。梯度增强树也包含决策树森林,但这些决策树是额外构建的,所有数据都经过决策树集合。梯度增强树可能包含一组分类树或回归树,分类树用于离散值(例如猫或狗)。回归树用于连续值(例如0到100)。
三、什么是XGBoost?
梯度增强是一种用于分类和预测的机器学习算法。XGBoost只是一个极端类型的梯度增强。它的极端之处在于,可以通过并行处理的能力更有效地执行梯度增强。XGBoost文档中的下图说明了如何使用梯度增强来预测某人是否会喜欢一款电子游戏。
采用两棵决策树被用来决定某人是否可能喜欢一款电子游戏。将两棵树的叶子得分相加,以确定哪一个人最有可能喜欢这款电子游戏。
XGBoost的一些优点:
- 相对容易理解。
- 适用于具有很少特征的小型、结构化和规则数据。
XGBoost的一些缺点:
- 易于过拟合,对异常值敏感。在XGBoost中使用时间序列数据的物化视图进行预测可能是一个好主意。
- 在稀疏或无监督数据上表现不佳。
四、使用XGBoost进行时间序列预测
在这里使用的是空气传感器样本数据集,它是由InfluxDB提供的。该数据集包含来自多个传感器的温度数据。正在为单个传感器创建温度预测,其数据是这样的:
使用以下Flux代码导入单个时间序列的数据集和过滤器。(Flux是InfluxDB的查询语言)
import "join"
import "influxdata/influxdb/sample"
//dataset is regular time series at 10 second intervals
data = sample.data(set: "airSensor")
|> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")
随机森林和梯度增强可以用于时间序列预测,但它们需要将数据转换为监督学习。这意味着必须以滑动窗口方法或缓慢移动方法将数据向前移动,以将时间序列数据转换为监督学习集,也可以用Flux准备数据。在理想情况下,应该首先执行一些自相关分析,以确定要使用的最佳方法。为简洁起见,将使用以下Flux代码按一个常规时间间隔移动数据。
import "join"
import "influxdata/influxdb/sample"
data = sample.data(set: "airSensor")
|> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")
shiftedData = data
|> timeShift(duration: 10s , columns: ["_time"] )
join.time(left: data, right: shiftedData, as: (l, r) => ({l with data: l._value, shiftedData: r._value}))
|> drop(columns: ["_measurement", "_time", "_value", "sensor_id", "_field"])
左右滑动查看完整代码
如果想向模型输入中添加额外的滞后数据,可以改为遵循以下Flux逻辑。
import "experimental"
import "influxdata/influxdb/sample"
data = sample.data(set: "airSensor")
|> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")
shiftedData1 = data
|> timeShift(duration: 10s , columns: ["_time"] )
|> set(key: "shift" , value: "1" )
shiftedData2 = data
|> timeShift(duration: 20s , columns: ["_time"] )
|> set(key: "shift" , value: "2" )
shiftedData3 = data
|> timeShift(duration: 30s , columns: ["_time"] )
|> set(key: "shift" , value: "3")
shiftedData4 = data
|> timeShift(duration: 40s , columns: ["_time"] )
|> set(key: "shift" , value: "4")
union(tables: [shiftedData1, shiftedData2, shiftedData3, shiftedData4])
|> pivot(rowKey:["_time"], columnKey: ["shift"], valueColumn: "_value")
|> drop(columns: ["_measurement", "_time", "_value", "sensor_id", "_field"])
// remove the NaN values
|> limit(n:360)
|> tail(n: 356)
此外,我们必须使用向前验证来训练算法。这涉及到将数据集分为测试集和训练集。然后利用XGB Regressor对XGBoost模型进行训练,并用拟合方法进行预测。最后,我们使用平均绝对误差 (MAE)来确定预测的准确性。对于10秒的延迟,计算出的平均绝对误差 (MAE)为0.035。我们可以把这理解为96.5%的预测是非常正确的。下图展示了我们从XGBoost得到的预测结果与从训练/测试分割得到的期望值之间的对比。
以下是完整的脚本。这段代码主要是从这里的教程中引入的。
将 pandas 导入为 pd
from numpy import asarray
from sklearn.metrics importmean_absolute_error
from xgboost import XGBRegressor
from matplotlib import pyplot
from influxdb_client import InfluxDBClient
from influxdb_client.client.write_api import SYNCHRONOUS
# 使用 Python InfluxDB 客户端库查询数据并将数据转换为受监督的数据Flux
client = InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="NyP-HzFGkObUBI4Wwg6Rbd-_SdrTMtZzbFK921VkMQWp3bv_e9BhpBi6fCBr_0-6i0ev32_XWZcmkDPs 的学习问题耳朵TWA== ", org="0437f6d51b579000")
# write_api = client.write_api(write_optinotallow=SYNCHRONOUS)
query_api = client.query_api()
df = query_api.query_data_frame('import "join"'
'import "influxdata/influxdb/sample"'
'data = sample.data(set: "airSensor")'
'|>filter(fn: (r) => r._field == "温度" and r.sensor_id == "TLM0100")'
'shiftedData = 数据'
'|> timeShift(duration: 10s , columns: ["_time"] )'
'join.time(左:数据,右:shiftedData,如:(l, r) = > ({l 数据:l._value,shiftedData: r._value}))'
'|> drop(columns: ["_measurement", "_time", "_value", "sensor_id", "_field"])'
'|>; yield(name: "转换为监督学习数据集")'
)
df = df.drop(columns=['table', 'result'])
data = df.to_numpy()
# 将单变量数据集拆分为训练/测试集
def train_test_split(data, n_test):
return data[:-n_test:], data[-n_test:]
# 拟合 xgboost 模型并进行一步预测
def xgboost_forecast(train, testX) :
# 将列表转换为数组
train = asarray(train)
# 分成输入和输出列
trainX, trainy = train[: , :-1], train[:, -1]
# 拟合模型
model = XGBRegressor(objective='reg:squarederror', n_estimators=1000)
model.fit(trainX, trainy)
# 进行一步预测
yhat = model.predict(asarray([testX]))
return yhat[0 ]
# 单变量数据的前向验证
def walk_forward_validation(data, n_test):
Predictions = list()
# 分割数据集
train, test = train_test_split(data, n_test)
History = [x for x in train]
# 遍历每个时间步测试集
for i in range(len(test)):
# 将测试行拆分为输入和输出列
testX, testy = test[i, : -1], test[i, -1]
# 根据历史拟合模型并进行预测
yhat = xgboost_forecast(history, testX)
# 将预测存储在预测列表
predictions.append(yhat)
# 将实际观察添加到下一个循环的历史记录
history.append(test[i])
# 总结进度
print('>expected=%.1f, Predicted=%.1f' % (testy, yhat))
# 估计预测误差
error = Mean_absolute_error(test[:, -1], 预测)
返回错误, test[:, -1], 预测
# 评估
mae, y, yhat = walk_forward_validation(data, 100)
print('MAE: %.3f' % mae)
# 预期与预测的绘图
pyplot.plot(y, label='预期')
pyplot.plot(yhat, label='预测')
pyplot.legend()
pyplot.show()
五、结论
希望这篇博文能够激励人们利用XGBoost和InfluxDB进行预测。为此建议查看相关的报告,其中包括如何使用论文描述的许多算法和 InfluxDB 来进行预测和执行异常检测的示例。
原文链接:https://www.infoworld.com/article/3682070/time-series-forecasting-with- xgboost-and-influxdb.html
以上是如何使用XGBoost和InluxDB进行时间序列预测的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

如何使用C#编写时间序列预测算法时间序列预测是一种通过分析过去的数据来预测未来数据趋势的方法。它在很多领域,如金融、销售和天气预报中有广泛的应用。在本文中,我们将介绍如何使用C#编写时间序列预测算法,并附上具体的代码示例。数据准备在进行时间序列预测之前,首先需要准备好数据。一般来说,时间序列数据应该具有足够的长度,并且是按照时间顺序排列的。你可以从数据库或者

XGBoost是一个流行的开源机器学习库,可用于解决各种预测问题。人们需要了解如何使用它与InfluxDB进行时间序列预测。 译者 | 李睿审校 | 孙淑娟XGBoost是一个开源的机器学习库,它实现了优化的分布式梯度增强算法。XGBoost使用并行处理实现快速性能,很好地处理缺失值,在小型数据集上执行良好,并防止过拟合。所有这些优点使XGBoost成为回归问题(例如预测)的一种流行解决方案。预测是各种业务目标的关键任务,例如预测分析、预测维护、产品规划、预算等。许多预测或预测问题都涉及到时间序

不要改变原内容的意思,微调内容,重写内容,不要续写。“分位数回归满足这一需求,提供具有量化机会的预测区间。它是一种统计技术,用于模拟预测变量与响应变量之间的关系,特别是当响应变量的条件分布命令人感兴趣时。与传统的回归方法不同,分位数回归侧重于估计响应变量变量的条件量值,而不是条件均值。”图(A):分位数回归分位数回归概念分位数回归是估计⼀组回归变量X与被解释变量Y的分位数之间线性关系的建模⽅法。现有的回归模型实际上是研究被解释变量与解释变量之间关系的一种方法。他们关注解释变量与被解释变量之间的关

今天我想分享一个最新的研究工作,这项研究来自康涅狄格大学,提出了一种将时间序列数据与自然语言处理(NLP)大模型在隐空间上对齐的方法,以提高时间序列预测的效果。这一方法的关键在于利用隐空间提示(prompt)来增强时间序列预测的准确性。论文标题:S2IP-LLM:SemanticSpaceInformedPromptLearningwithLLMforTimeSeriesForecasting下载地址:https://arxiv.org/pdf/2403.05798v1.pdf1、问题背景大模型

MakridakisM-Competitions系列(分别称为M4和M5)分别在2018年和2020年举办(M6也在今年举办了)。对于那些不了解的人来说,m系列得比赛可以被认为是时间序列生态系统的一种现有状态的总结,为当前得预测的理论和实践提供了经验和客观的证据。2018年M4的结果表明,纯粹的“ML”方法在很大程度上胜过传统的统计方法,这在当时是出乎意料的。在两年后的M5[1]中,最的高分是仅具有“ML”方法。并且所有前50名基本上都是基于ML的(大部分是树型模型)。这场比赛看到了LightG

时间序列是数据点的序列,通常由在一段时间间隔内进行的连续测量组成。时间序列分析是使用统计技术对时间序列数据进行建模和分析,以便从中提取有意义的信息并做出预测的过程。时间序列分析是一个强大的工具,可以用来从数据中提取有价值的信息,并对未来的事件做出预测。它可以用来识别趋势、季节模式和变量之间的其他关系。时间序列分析还可以用来预测未来的事件,如销售、需求或价格变动。如果你正在使用Python处理时间序列数据,那么有许多不同的库可以选择。所以在本文中,我们将整理Python中最流行处理时间序列的库。S

Python中的ARMA模型详解ARMA模型是统计学中一类重要的时间序列模型,它可以用于对时间序列数据的预测和分析。Python中提供了丰富的库和工具箱,可以方便地运用ARMA模型进行时间序列建模。本文将详细介绍Python中的ARMA模型。一、什么是ARMA模型ARMA模型是由自回归模型(AR模型)和移动平均模型(MA模型)组成的时间序列模型。其中,AR模

这篇AAAI2024中的论文由新加坡科技研究局(A*STAR)和新加坡南洋理工大学合作发表,提出了一种利用图感知对比学习来改善多变量时间序列分类的方法。实验结果显示,该方法在提升时间序列分类效果方面取得了显着的成果。图片论文标题:Graph-AwareContrastingforMultivariateTime-SeriesClassification下载地址:https://arxiv.org/pdf/2309.05202.pdf开源代码:https://github.com/Frank-Wa
