0

0

如何使用XGBoost和InluxDB进行时间序列预测

王林

王林

发布时间:2023-04-04 12:40:07

|

2036人浏览过

|

来源于51CTO.COM

转载

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是什么,必须理解决策树、随机森林和梯度增强。决策树是一种有监督的学习方法,由一系列特征测试组成。每个节点都是一个测试,所有节点都被组织在一个流程图结构中。分支表示最终决定将哪个叶标签或类标签分配给输入数据的条件。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

图片

机器学习中的决策树用于确定明天是否会下雨。经过编辑以显示决策树的组件:叶、分支和节点。

决策树、随机森林和梯度增强背后的指导原则是,多个“弱学习者”或分类器共同做出强大的预测。

随机森林包含多个决策树。决策树中的每个节点都被认为是弱学习者,随机森林中的每个决策树被认为是随机森林模型中许多弱学习者中的一个。通常情况下,所有的数据都被随机划分为子集,并通过不同的决策树进行传递。

使用决策树和随机森林的梯度增强是相似的,但它们的结构方式不同。梯度增强树也包含决策树森林,但这些决策树是额外构建的,所有数据都经过决策树集合。梯度增强树可能包含一组分类树或回归树,分类树用于离散值(例如猫或狗)。回归树用于连续值(例如0到100)。

三、什么是XGBoost?  

梯度增强是一种用于分类和预测的机器学习算法。XGBoost只是一个极端类型的梯度增强。它的极端之处在于,可以通过并行处理的能力更有效地执行梯度增强。XGBoost文档中的下图说明了如何使用梯度增强来预测某人是否会喜欢一款电子游戏。

图片

采用两棵决策树被用来决定某人是否可能喜欢一款电子游戏。将两棵树的叶子得分相加,以确定哪一个人最有可能喜欢这款电子游戏。

XGBoost的一些优点:

  • 相对容易理解。
  • 适用于具有很少特征的小型、结构化和规则数据。

XGBoost的一些缺点:

AI封面生成器
AI封面生成器

专业的AI封面生成工具,支持小红书、公众号、小说、红包、视频封面等多种类型,一键生成高质量封面图片。

下载
  • 易于过拟合,对异常值敏感。在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得到的预测结果与从训练/测试分割得到的期望值之间的对比。

图片

以下是完整的脚本。这段代码主要是从这里的教程中引入的。

import pandas as pd

from numpy import asarray

from sklearn.metrics import mean_absolute_error

from xgboost import XGBRegressor

from matplotlib import pyplot

from influxdb_client import InfluxDBClient

from influxdb_client.client.write_api import SYNCHRONOUS



# query data with the Python InfluxDB Client Library and transform data into a supervised learning problem with Flux

client = InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="NyP-HzFGkObUBI4Wwg6Rbd-_SdrTMtZzbFK921VkMQWp3bv_e9BhpBi6fCBr_0-6i0ev32_XWZcmkDPsearTWA==", 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 == "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"])'

'|> yield(name: "converted to supervised learning dataset")'

)

df = df.drop(columns=['table', 'result'])

data = df.to_numpy()



# split a univariate dataset into train/test sets

def train_test_split(data, n_test):

return data[:-n_test:], data[-n_test:]



# fit an xgboost model and make a one step prediction

def xgboost_forecast(train, testX):

# transform list into array

train = asarray(train)

# split into input and output columns

trainX, trainy = train[:, :-1], train[:, -1]

# fit model

model = XGBRegressor(objective='reg:squarederror', n_estimators=1000)

model.fit(trainX, trainy)

# make a one-step prediction

yhat = model.predict(asarray([testX]))

return yhat[0]



# walk-forward validation for univariate data

def walk_forward_validation(data, n_test):

predictions = list()

# split dataset

train, test = train_test_split(data, n_test)

history = [x for x in train]

# step over each time-step in the test set

for i in range(len(test)):

# split test row into input and output columns

testX, testy = test[i, :-1], test[i, -1]

# fit model on history and make a prediction

yhat = xgboost_forecast(history, testX)

# store forecast in list of predictions

predictions.append(yhat)

# add actual observation to history for the next loop

history.append(test[i])

# summarize progress

print('>expected=%.1f, predicted=%.1f' % (testy, yhat))

# estimate prediction error

error = mean_absolute_error(test[:, -1], predictions)

return error, test[:, -1], predictions



# evaluate

mae, y, yhat = walk_forward_validation(data, 100)

print('MAE: %.3f' % mae)



# plot expected vs predicted

pyplot.plot(y, label='Expected')

pyplot.plot(yhat, label='Predicted')

pyplot.legend()

pyplot.show()

五、结论

希望这篇博文能够激励人们利用XGBoost和InfluxDB进行预测。为此建议查看相关的报告,其中包括如何使用本文描述的许多算法和InfluxDB来进行预测和执行异常检测的示例。

原文链接:https://www.infoworld.com/article/3682070/time-series-forecasting-with-xgboost-and-influxdb.html

如何使用XGBoost和InluxDB进行时间序列预测

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

44

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

111

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

228

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

90

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

137

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

29

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

62

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

51

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 20.5万人学习

Sass 教程
Sass 教程

共14课时 | 0.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号