news 2026/2/27 18:11:11

使用 Python 进行 XGBoost 单调时间序列预测的实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 Python 进行 XGBoost 单调时间序列预测的实战

原文:towardsdatascience.com/hands-on-monotonic-time-series-forecasting-with-xgboost-using-python-ebcd2c27f9e6

几个月前,我参与了一个研究项目,遇到了一个涉及时间序列的问题需要解决。

问题相当直接:

“从具有 t时间步长的此时间序列开始,预测接下来的 k

对于那些机器学习爱好者来说,这就像编写“Hello World”,因为这个问题对于社区来说极其知名,被称为“预测”。

机器学习社区开发了多种技术,可用于预测时间序列的下一个值。一些传统方法涉及**ARIMA/SARIMA傅里叶变换分析等算法,而更复杂的算法包括卷积/循环神经网络或超级著名的“Transformer**”(ChatGPT 中的 T 代表 transformers)。

虽然预测问题非常知名,但解决带有约束的预测问题可能更为罕见。让我解释一下我的意思。

您有一个时间序列,包含一组参数X和时间步长t。标准的时间预测问题如下:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7d1988a29945668d534f6234016e798b.png

由作者制作的照片

我们面临的问题是以下:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/648b44b087670f9b27258f4468fdcfe3.png

由作者制作的照片

因此,如果我们考虑输入参数有d个维度,我想函数对于第 1 个维度(例如)是单调的。那么我们如何处理这个问题?我们如何预测一个“单调”的时间序列?我们将在这个问题中描述的方法是XGBoost

本博客文章的结构如下:

  1. 关于 XGBoost:在几行内,我们将描述XGBoost 是什么,其基本思想是什么,以及其优缺点。

  2. XGBoost 示例:以下将描述 XGBoost 的代码,从 Python 描述到玩具示例。

  3. XGBoost 单调性示例:XGBoost 将在一个真实世界的例子上进行测试。

  4. 结论:本博客文章所讨论的内容将进行总结。

1. 关于 XGBoost

1.1 XGBoost 理念

XGBoost 中的“XG”代表极端梯度(提升)。梯度提升算法旨在使用“预测器链”。给定输入矩阵X和相应的输出y,我们的想法是有许多预测器。第一个预测器的目标是直接从输入X中找到相应的输出y。故事结束。不,我在开玩笑 🤣

第一个预测器的目标是成为一个所谓的“弱预测器”,这意味着预测的y与实际输出y之间有一个不可忽略的差异。第二个预测器的目标是纠正第一个预测的错误,因此它不是训练从Xy,而是训练从y2=y-y1。这会重复 N 次,其中 N 是预测器的数量,如下面的图像所示:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ffca26088e4bd5474463aa19fd5b64a3.png

XGBoost 想法的描述

这些预测器中的每一个都是一个决策树。每次我解释决策树时,我都会将其与游戏“猜猜我是谁”进行比较。在那个游戏中,它的工作方式有点像这样。

想象你正在玩经典的“猜猜我是谁”游戏,每个玩家都有一个填满一些角色面孔的板,每个角色都有独特的特征,如发色、眼色、眼镜、帽子等等。目标是通过对这些特征的是或否问题来猜测对手的秘密角色。每个问题都会帮助你排除不符合答案的候选人,缩小可能性,直到你可以自信地猜出秘密角色是谁。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/abfae245236c51e057d703c73d5df41f.png

由作者制作,使用 DALL·E-3 制作的图像

因此,结构,正如我们所看到的,就像一个倒置的树,从叶子底部)到顶部)。

每个预测器都是你看到的那棵树之一。如果你在思考分类和回归之间的区别,你是正确的。我展示的例子,为了简单起见,是一个分类问题。然而,如果你将“Kristen”替换为实数,例如“0.47462”,你会发现你面临的是一个回归问题。就这么简单。

因此,XGBoost 算法以智能的方式使用所有这些决策树来“提升”前一棵树的预测。它之所以被称为“极端”,是因为为了做到这一点,算法的开发者——一群非常优秀的科学家——已经进行了大量的中间优化步骤,这些步骤你可以在这里找到:这里。

训练部分,一如既往,是损失函数的最小化加上正则化项以防止过拟合。参数包括叶子的数量、树的深度以及树的分割点。我所说的“树的分割点”是指以下内容:在上面的例子中,我们有“这个人是不是孩子?”。在现实生活中,我们可能会有连续特征,所以它更像是“x_1 是否大于分割点”?这意味着分割点成为一个参数。

1.1 XGBoost 单调性

现在,XGBoost 算法提供了许多优点:

  • 它通常对过拟合非常稳健。决策树有一个众所周知的问题,就是过拟合,而这些集成方法擅长克服它。

  • 它能够处理合理的计算复杂度,这一点并不明显,尤其是如果我们防止过拟合的同时做到这一点

  • 它仍然可以通过特征的重要性提供可解释性。这使我们能够理解哪些X的参数对我们的预测至关重要。

  • 你可以决定让响应对特定特征是单调的

例如,让我们假设我们有以下函数:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/edeebdd8e146c44d29edd03bdd88daa5.png

作者制作的图像

这个函数相对于 x2 是单调的。想象一下,如果我们想使用 XGBoost 来预测,给定 x1 和 x2 的结果 f(x1,x2)。在现实生活中,f(x1,x2)是未知的(否则我们就不做机器学习了,我们会乘飞机去佛罗里达度假),但我们现在(或希望)我们的函数相对于 x2 是单调的。这在我现实生活中发生过,我有一个物理量,我知道它相对于另一个量是单调的。XGBoost 的结构可以被修改以满足这个特定特征的要求。在我们的例子中,我们可以在 x2 上施加单调行为来进行预测。

好了。希望你没有被吓到。现在让我们跳到有趣的部分。😅

2. 编码

2.1 玩具数据集

我必须说,决策树让我想起了很多往事,因为它们是我最早写的机器学习代码之一,听起来可能有些荒谬,但我确实有点情感上的波动 ❤️

虽然要 100%诚实地说,代码非常简单。所以无需多言,让我们直接进入正题。我想给你展示两个例子。第一个例子我将其简化为一维的,以便解释整个机制是如何工作的。这是我们想要使用 XGBoost 预测的目标函数f

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/66d64ffc2a22c61fde8d4f2cba9173a2.png

这是这个图:

Jovian

现在。XGBoost 的实际实现在文档中有详细的描述,字斟句酌。我不会逐字逐句地讲解,但我希望你能展示它在这一案例中的功能。它与你在网上找到的任何 SkLearn 模型没有区别。

Jovian

就这么简单。现在让我们进行真正的测试。

2.2 实际世界数据集

上面的例子为我们提供了 xgboost 代码的结构。尽管如此,我们构建的玩具数据集有几个局限性:

  • 它太简单了(一维)且完全是虚构的

  • 我们没有以预测方式使用它,因为我们已经打乱了数据集

  • 我们没有使用任何单调约束(这正是我承诺的)

那么,让我们从一些真正的业务开始,好吗?我使用了这个数据集,这是德里城市的数据库。该数据集由两个 csv 表格组成(DailyDelhiClimateTrain.csvDailyDelhiClimateTest.csv)。

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D7&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D7&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2F20b060f308fb4604b5c91d5f336ef8ab%2Fpreview%2F76f438de4ea54450a3d7f87b1e8d6a3f%3Fts%3D1711597080325&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

我们已经用pandas导入并显示了 5 行。我们有 5 列:date, humidity, wind_speed, meanpressure,和meantemp。一个合理的问题可能是这个:

“假设拥有所有其他列,我们想知道meantemp的温度是什么。”

并且有一篇博客文章,它很好地涵盖了这一点。我们希望更进一步。我们将添加另一列,命名为“City_Index”。这个City_Index将模拟另一个城市,我们知道它比德里更温暖或更寒冷。所以就像我们按世界不同地区分组城市索引一样*:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1be286236775d5c4614ee5c5cf3e078c.png

图片由作者制作

*不要遵循地图上的实际城市索引,请尝试理解它的工作原理,这只是给你一个想法。

现在,我们将使其成为这样的方式,即 CityIndex=1 具有mean_temp的默认值,CityIndex = 2 具有,作为目标值,2mean_temp,…,CityIndex=9 具有,作为目标值,9*mean_temp。_ 这意味着如果我们固定所有其他变量,City_Index 可以成为我们的单调变量**:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1d1e125c24beeb013c9ee21a9112ad9e.png

实际上,这意味着我们正在强制,例如,洛杉矶,加利福尼亚的温度始终比阿拉斯加安克雷奇的温度温暖(我必须承认我查了谷歌,因为我不知道阿拉斯加的任何城市)。

我们将通过“City_Index”变量和这两个函数来实现这一点:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D5&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D5&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2F20b060f308fb4604b5c91d5f336ef8ab%2Fpreview%2F76f438de4ea54450a3d7f87b1e8d6a3f%3Fts%3D1711597080325&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

现在我们将:

  • 创建一个包含新的 City_Index 变量的增强数据集

  • 将数据分为训练集和验证集

  • 使用训练数据来训练对 City_Index 进行单调性约束的时间序列 XGBoost 预测器,并使用训练好的模型预测下一个值

这是我们的测试方法:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F12%26cellId%3D8&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F12%26cellId%3D8&image=https%3A%2F%2Fapi.jovian.com%2Fapi%2Fgist%2F20b060f308fb4604b5c91d5f336ef8ab%2Fpreview%2F76f438de4ea54450a3d7f87b1e8d6a3f%3Fts%3D1711680215666&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

(点击这里查看完整代码,如果加载时间过长)

这是我们的预测结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/335647d211d62501d32887118763209e.png

单调性可以在params_constraints中看到。参数约束向量是一个除了我们想要保持单调性的特征之外都是0的向量。现在,正如我们所看到的,如果我们固定所有其他特征,只改变 City_Index,我们将看到单调行为:

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fviewer%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D10%26hideOutput%3Dtrue&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fviewer%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D10%26hideOutput%3Dtrue&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fjovian.com%2Fembed%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fviewer%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D11&dntp=1&display_name=Jovian&url=https%3A%2F%2Fjovian.ml%2Fviewer%3Furl%3Dhttps%3A%2F%2Fjovian.ml%2Fpiero-paialunga%2Fxgb-notebook%2Fv%2F10%26cellId%3D11&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&scroll=auto&schema=jovian

完全单调。几乎线性(这是我们事先施加的)。这显示了使用 XGBoost 与 ARIMA、SARIMA 或多项式回归之间的区别:使用 XGBoost,您可以强制执行显式的单调行为

3. 结论

让我占用您几分钟时间来总结一下我们在这里所做的工作:

  1. 我们引入了具有预测任务有一些我们希望保留的单调特征的难题。在这些情况下,像 ARIMA 或 RNN 这样的花哨方法可能会破坏单调性。

  2. 简而言之,我们通过“猜猜我是谁?”示例介绍了 XGBoost 的概念,并看到它可以通过修改提升算法可以选择的决策树来强制执行单调性。

  3. 我们在一个玩具示例中使用了XGBoost,以基本了解其语法的工作方式

  4. 我们使用了气候变化数据,并应用了预测研究,但我们做的不仅仅是基本的预测。通过在新的特征‘City_Index’上施加单调递增的值,我们基于预测温度相对于 City_Index 特征的单调性假设来预测温度。

4. 关于我!

再次感谢您抽出宝贵时间。这对您来说意义重大 ❤

我的名字是 Piero Paialunga,就是我这里这位:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4037376f60a7f790706cb2704368de34.png

我是辛辛那提大学航空航天工程系的博士候选人,也是 Gen Nine 的机器学习工程师。我在博客文章和领英上谈论人工智能和机器学习。如果您喜欢这篇文章,并想了解更多关于机器学习的内容,以及跟随我的研究,您可以:

A. 关注我的**领英,我在那里发布所有故事 B. 订阅我的通讯。这将让您了解新故事,并有机会给我发信息,以便接收所有更正或疑问。C. 成为推荐会员**,这样您就不会有“每月故事最大数量”的限制,您可以阅读我(以及成千上万的机器学习和数据科学顶级作家)关于最新技术的所有文章。

如果您想向我提问或开始合作,请在这里留言:

[email protected]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/9 5:14:52

AI Agent的可解释性设计原则

AI Agent的可解释性设计原则关键词:AI Agent、可解释性、设计原则、透明度、责任性摘要:本文聚焦于AI Agent的可解释性设计原则。随着AI Agent在各个领域的广泛应用,其决策过程的可解释性变得至关重要。文章首先介绍了相关背景,包…

作者头像 李华
网站建设 2026/2/20 5:25:05

LobeChat监控指标采集方案:Prometheus+Grafana集成

LobeChat监控指标采集方案:PrometheusGrafana集成 在AI应用日益深入日常的今天,像LobeChat这样的智能对话平台已不再只是“能聊几句”的玩具,而是承载着真实业务逻辑的关键入口——从企业客服到个人助手,用户对响应速度、稳定性与…

作者头像 李华
网站建设 2026/2/21 18:51:12

[PM]十种项目管理方法详细介绍

十种项目管理方法详细介绍1. 瀑布模型 (Waterfall)方法概述瀑布模型是最传统的项目管理方法,由Winston Royce于1970年首次提出。该方法采用线性顺序的方式推进项目,将项目划分为多个不可重叠的阶段,每个阶段必须完成后才能进入下一阶段。典型…

作者头像 李华
网站建设 2026/2/25 0:02:03

森林生态系统藏着哪些秘密?R 语言带你分析结构、功能与稳定性,还有超炫可视化

森林作为地球上最重要的生态系统之一,其结构、功能与稳定性一直是生态学研究的核心议题。森林生态系统的物种组成、空间分布与多样性不仅决定了能量流动和物质循环的效率,也直接影响其抵御干扰和恢复平衡的能力。在全球气候变化与人类活动加剧的背景下&a…

作者头像 李华
网站建设 2026/2/27 12:39:30

云屋音视频 SDK 国产化适配:兼容自主系统、芯片,符合信创标准

云屋音视频 SDK:信创浪潮下的国产化适配先锋在当今时代,信创产业正呈现出蓬勃发展的态势,它已然成为推动我国科技自主创新、保障国家信息安全的核心力量。在这股信创浪潮中,云屋音视频 SDK 凭借其出色的国产化适配能力&#xff0c…

作者头像 李华
网站建设 2026/2/28 5:02:03

污水里重金属超标怎么办

在工业生产飞速发展的当下,污水排放问题日益严峻,其中重金属超标尤为令人担忧。重金属一旦进入水体,不仅会破坏生态平衡,还会通过食物链积累,后会威胁人类健康。那么,当污水里重金属超标时,我们…

作者头像 李华