首页 > 编程问答 >如何使用随机森林计算预测的置信区间?

如何使用随机森林计算预测的置信区间?

时间:2024-06-04 15:08:25浏览次数:16  
标签:python machine-learning scikit-learn time-series arima

我正在计算名为 "spot" 的变量的预测(数据的未来结果)。我正在使用随机森林和一个名为 "DTCI" 的自变量来帮助预测 "spot" 。预测以每月一次的频率进行,这与数据的频率相同。我想根据每个月的上限和下限,获得每个预测月份的置信区间。这与附图中的绿色限值类似。

限值

我尝试使用 GradientBoostingRegressor 构建区间,具体如下:

# 设置下量值和上量值
inf = 0.1
sup = 0.9

# 每个模型必须是独立的
lower_model = GradientBoostingRegressor(loss="quantile", alpha=inf)
upper_model = GradientBoostingRegressor(loss="quantile", alpha=sup)

lower_model.fit(X_train, y_train)
upper_model.fit(X_train, y_train)

predictions = pd.DataFrame(y_hat_forecast_spot)

predictions["inf"] = lower_model.predict(X_fore)
predictions["sup"] = upper_model.predict(X_fore)

然而,结果并没有我预期的趋势。由于这是一个时间序列,我认为(从上图中也可以观察到)极限的增长方式应该是置信区域变大。换句话说,日期越靠后,预测难度就越大,因此与之相关的误差或区间也就越大。

我使用 GradientBoostingRegressor 发现的结果如下所示,其区间随时间变化而变化,而不是增长。

结果

GradientBoostingRegressor 适合时间序列吗?还是有其他函数可以更好地理解时间序列?


GradientBoostingRegressor 本身并不具备时间序列数据的概念。虽然它可以用于时间序列预测,并且你使用的分位数回归方法对于构建预测区间是有效的,但它没有考虑数据中的时间依赖性,这会导致你看到的预测区间不符合预期。

导致你的预测区间没有随时间增加的几个可能原因:

  1. 缺乏时间特征: 你的模型可能只使用了 DTCI 作为预测 spot 的特征,而没有明确包含任何时间信息。如果 DTCI 本身没有捕捉到时间趋势,模型将无法学习时间依赖性,导致预测区间在时间上保持相对稳定。

  2. 数据平稳性: 如果你的时间序列数据具有很强的季节性或趋势, GradientBoostingRegressor 可能无法有效地捕捉到这些模式。这可能导致对未来的预测过于依赖最近的数据点,从而导致预测区间过窄。

为了改进你的模型并获得更符合预期的预测区间,你可以尝试以下方法:

1. 添加时间特征:

  • 滞后特征: 包含 spot 的过去值作为模型的特征。例如,你可以添加 spot 在前一个月、前一季度或前一年的值。
  • 时间趋势特征: 创建一个表示时间推移的特征,例如从第一个数据点开始的天数或月份。
  • 周期性特征: 如果你的数据具有季节性模式,请添加表示这些模式的特征,例如月份的正弦和余弦变换。

2. 时间序列分解:

  • 在将数据输入模型之前,使用时间序列分解技术(例如 STL 分解)来分离趋势、季节性和残差成分。
  • 你可以使用 statsmodels 库中的 seasonal_decompose 函数执行此操作。
  • 然后,你可以分别对每个成分进行建模,并组合预测以获得最终预测区间。

3. 使用专门针对时间序列的模型:

  • 考虑使用专门为时间序列数据设计的模型,例如 ARIMA、SARIMA 或 Prophet。
  • 这些模型可以更好地捕捉时间依赖性,并可能产生更准确的预测区间。

4. 交叉验证:

  • 使用时间序列交叉验证来评估你的模型性能并微调超参数。
  • 这将确保你的模型不会过度拟合训练数据,并能更好地泛化到未来数据。

以下是一些代码示例,说明如何添加滞后特征和时间趋势特征:

import pandas as pd

# 创建一个时间索引
predictions['date'] = pd.to_datetime(predictions.index)

# 添加时间趋势特征
predictions['time_trend'] = (predictions['date'] - predictions['date'].min()).dt.days

# 添加滞后特征
predictions['spot_lag1'] = predictions['spot'].shift(1)
predictions['spot_lag12'] = predictions['spot'].shift(12)

# 选择特征进行建模
features = ['DTCI', 'time_trend', 'spot_lag1', 'spot_lag12']
X_fore = predictions[features]

请记住,在实施这些更改后重新训练你的 GradientBoostingRegressor 模型,并评估预测区间的改进。

此外,选择最佳方法取决于你的数据的具体特征和你的预测目标。 建议你尝试不同的方法并比较它们的表现,以确定最适合你的用例的方法。

标签:python,machine-learning,scikit-learn,time-series,arima
From: 78572538

相关文章

  • 如何解决 Python 中的 AttributeError: module 'serial' has no attribute 'Serial'
    解决Python中的AttributeError:module'serial'hasnoattribute'Serial'错误最近在使用Python进行串口通信时,我遇到了一个常见的错误:AttributeError:module'serial'hasnoattribute'Serial'。这个错误让我很困惑,但通过一番搜索和尝试,我终于解决了这个问题。问题......
  • 深入理解Python的包管理器:pip
    深入理解Python的包管理器:pip引言Python作为一门流行的编程语言,拥有强大的生态系统,其中pip扮演着至关重要的角色。pip是Python的包管理工具,它允许用户安装、升级和管理Python包。本专栏旨在帮助读者深入了解pip的各个方面,从基础使用到高级技巧,再到安全特性和未来展望。第......
  • 【Python数据分析--Numpy库】Python数据分析Numpy库学习笔记,Python数据分析教程,Python
    一,Numpy教程给大家推荐一个很不错的笔记,个人长期学习过程中整理的Python超详细的学习笔记共21W字点我获取1-1安装1-1-1使用已有的发行版本对于许多用户,尤其是在Windows上,最简单的方法是下载以下的Python发行版,它们包含了所有的关键包(包括NumPy,SciPy,matplotlib,I......
  • python宠物店管理系统的设计与实现
    随着时代的飞速发展,人们消费水平逐渐提高,相对宠物的生活水平也不断提高,甚至很多视频网站上,up主都已经给家里的主子吃起了战斧牛排。因此,很多创业者都将目光转移到了宠物市场。然而,开一家宠物店绝非那么简单。商品销售,宠物寄养,会员管理,库存预警,出入库明细等等等等。若是传统的......
  • 基于Python语言的图书馆信息管理系统的设计与实现
    随着信息技术和我国教育产业的飞速发展,各高校的学生数量日益增多并且在这种全新的信息化时代下,传统的管理技术已经无法为我们带来高效、便捷的管理模式。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,图书馆管理系统就是信息时代变革中......
  • python基于flask的羽毛球场地管理系统django
    该系统分为用户的预约场地前台、管理员的系统管理后台两部分。预约场地前台功能模块:登录、注册、修改密码、选择时间、选择场地、支付费用、生成支付凭证等。系统管理后台功能模块:场地的增删查改,完善用户信息数据,统计场地信息,管理用户等。整个系统各个模块的具体功能有:预约......
  • mac 安装和管理多个Python版本
    更新brewbrewupdatebrewinstallpyenv 安装pyenv报错==>Downloadinghttps://raw.githubusercontent.com/Homebrew/homebrew-core/c1c28c143f4e28fc0059e66baa904104da25a41d/Formula/o/[email protected]:(7)Failedtoconnecttoraw.githubusercontent.comport......
  • Python应用开发——Streamlit 创建多页面应用程序进行APP的构建
    创建多页面应用程序在附加功能中,我们介绍了多页面应用程序,包括如何定义页面、构建和运行多页面应用程序,以及如何在用户界面的页面间导航。更多详情,请参阅多页面应用程序指南Multipageapps-StreamlitDocs在本指南中,让我们通过将上一版本的streamlithello应用程序转换为......
  • 用 python 绘制不同时间序列数据的图表
    我有两个不同的时间序列数据,如下所示。我希望将这两组不同的时间序列值放在一个图表中。代码如下,不幸的是,这并不是我想要的效果。第二张图片就是我想要的效果......
  • Python编程学习第一篇——Python零基础快速入门(五)-列表(List)
    今天我们来一起学习Python的列表(list),Python中的列表(List)是一种有序、可变的数据结构,可以用来存储多个值。列表可以包含不同类型的数据,例如整数、浮点数、字符串等。以下是关于Python列表定义、语法和基本操作的详细示例:1.定义列表:   可以使用方括号[]来定义一个列表。......