工具系列:PyCaret介绍_用外生变量单变量时间序列预测

2023-12-22 07:44

本文主要是介绍工具系列:PyCaret介绍_用外生变量单变量时间序列预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工具系列:PyCaret介绍_用外生变量单变量时间序列预测

在这组笔记本中,我们将介绍使用外生变量进行建模。我们的行动计划如下:

  1. 对数据集进行探索性数据分析,以提取关于生成时间序列的过程的有价值的见解。

  2. 构建一个基准模型(不包含外生变量的单变量模型)用于基准测试。

  3. 构建一个包含所有外生变量的单变量模型,以检查最佳性能。

  4. 评估带有外生变量的模型,并讨论任何潜在问题。

  5. 克服上述识别出的问题。

  6. 使用最佳模型进行未来预测。

  7. 使用自动化时间序列建模(AutoML)复制流程。

环境准备和数据预处理

# 导入os模块
import os
# 设置环境变量PYCARET_CUSTOM_LOGGING_LEVEL为"CRITICAL",仅启用关键日志记录(可选)
os.environ["PYCARET_CUSTOM_LOGGING_LEVEL"] = "CRITICAL"
# 定义一个函数what_is_installed,用于检查pycaret库是否已安装
def what_is_installed():# 导入pycaret库中的show_versions函数from pycaret import show_versions# 调用show_versions函数,显示pycaret库的版本信息show_versions()try:# 尝试调用what_is_installed函数what_is_installed()
except ModuleNotFoundError:# 如果出现ModuleNotFoundError异常,说明pycaret库未安装# 使用pip命令安装pycaret库!pip install pycaret# 再次调用what_is_installed函数,确认pycaret库已安装成功what_is_installed()
System:python: 3.9.16 (main, Jan 11 2023, 16:16:36) [MSC v.1916 64 bit (AMD64)]
executable: C:\Users\Nikhil\.conda\envs\pycaret_dev_sktime_16p1\python.exemachine: Windows-10-10.0.19044-SP0PyCaret required dependencies:pip: 22.3.1setuptools: 65.6.3pycaret: 3.0.0rc9IPython: 8.10.0ipywidgets: 8.0.4tqdm: 4.64.1numpy: 1.23.5pandas: 1.5.3jinja2: 3.1.2scipy: 1.10.0joblib: 1.2.0sklearn: 1.2.1pyod: 1.0.8imblearn: 0.10.1category_encoders: 2.6.0lightgbm: 3.3.5numba: 0.56.4requests: 2.28.2matplotlib: 3.7.0scikitplot: 0.3.7yellowbrick: 1.5plotly: 5.13.0kaleido: 0.2.1statsmodels: 0.13.5sktime: 0.16.1tbats: 1.1.2pmdarima: 2.0.2psutil: 5.9.4PyCaret optional dependencies:shap: 0.41.0interpret: Not installedumap: Not installedpandas_profiling: Not installedexplainerdashboard: Not installedautoviz: Not installedfairlearn: Not installedxgboost: Not installedcatboost: Not installedkmodes: Not installedmlxtend: Not installedstatsforecast: Not installedtune_sklearn: Not installedray: Not installedhyperopt: Not installedoptuna: Not installedskopt: Not installedmlflow: 2.1.1gradio: Not installedfastapi: Not installeduvicorn: Not installedm2cgen: Not installedevidently: Not installedfugue: 0.8.0streamlit: Not installedprophet: 1.1.2
# 导入所需的库
import numpy as np
import pandas as pd
from pycaret.datasets import get_data
from pycaret.time_series import TSForecastingExperiment
# 全局图形设置用于笔记本 ----
# 根据您使用的是jupyter notebook、jupyter lab还是Google Colab,您可能需要适当设置渲染器
# 注意:在这里设置为静态渲染器,以减小笔记本的保存大小。
global_fig_settings = {# "renderer": "notebook","renderer": "png",  # 设置渲染器为png格式"width": 1000,  # 设置图形宽度为1000"height": 600,  # 设置图形高度为600
}
# 调用get_data函数,获取名为"airquality"的数据,并将结果赋值给变量data
data = get_data("airquality")# 将"Date"和"Time"两列的数据合并为一个新的列"index",并将其转换为日期时间格式
data["index"] = pd.to_datetime(data["Date"] + " " + data["Time"])# 删除原始数据中的"Date"和"Time"两列
data.drop(columns=["Date", "Time"], inplace=True)# 定义目标变量为"CO(GT)"
target = "CO(GT)"

在这里插入图片描述

数据集中的缺失值被标记为-200。参考。我们应该删除这些值(用NaN替换),并让pycaret适当处理插补(防止训练过程中的数据泄漏)。

# 查找目标列中值为-200的行,并显示前几行
data[data[target] == -200].head()

在这里插入图片描述

# 将data中的-200替换为np.nan(缺失值),并直接在原地进行替换
data.replace(-200, np.nan, inplace=True)# 选取data中目标变量(target)为-200的行
data[data[target] == -200]

在这里插入图片描述

现在,让我们继续进行探索性数据分析(EDA)和建模。

第一步 探索性分析

# 创建一个时间序列预测实验对象 
eda = TSForecastingExperiment()
# 设置EDA的参数
eda.setup(data=data,  # 数据集target=target,  # 目标变量index="index",  # 索引列fh=48,  # 预测未来的时间步长numeric_imputation_target="ffill",  # 数值型目标变量的缺失值填充方法numeric_imputation_exogenous="ffill",  # 数值型外生变量的缺失值填充方法fig_kwargs=global_fig_settings,  # 图形参数设置session_id=42,  # 设置随机种子
)

在这里插入图片描述

<pycaret.time_series.forecasting.oop.TSForecastingExperiment at 0x203109abac0>

即使在继续之前,我们可以在这里观察到一些有用的信息。

  1. 数据是一个每小时的数据集,因此测试了一个季节周期为24。在这个时间周期内检测到了季节性。
  2. 在建模过程中,建议对数据进行差分(d=1),由于数据的性质。我们将在EDA过程中进一步评估这一点。
# 绘制目标变量和外生变量的图形
# 由于数据量很大,绘制交互式图形可能会使笔记本变慢。
# 因此,我们将在此图形中使用静态渲染器
eda.plot_model(fig_kwargs={"renderer": "png", "width": 1000, "height": 1200})

在这里插入图片描述


# 绘制目标变量和外生变量的图形
# 由于数据量很大,绘制交互式图形可能会使笔记本变慢。
# 因此,我们将在此图形中使用静态渲染器
eda.plot_model(fig_kwargs={"renderer": "png", "width": 1000, "height": 1200})

在这里插入图片描述

虽然在缩小的图中可能很难看到细节,但是pycaret提供了使用交互式plotly图表放大的功能。放大后,可以清楚地看到一个24小时的循环,高峰出现在19:00和8:00左右。

另外,看起来NMHC(GT)列中有缺失值。对于我们将来开发的任何多变量模型,我们将删除这一列。

接下来,设置建议对数据进行差分处理。让我们看看差分后的数据是什么样子,以及是否有必要进行差分处理。除了差分后的数据,我们还将绘制一些诊断图,如ACF、PACF和周期图。虽然许多读者可能已经了解ACF和PACF,但对于周期图可能需要更多的解释。周期图是一个根据频率绘制时间序列的谱密度的图。在这种情况下,频率范围从0到0.5(测量频率所需的最小点数为2,对应于最大频率0.5)。不同频率上的幅度可以用来推导时间序列的重要特征。我们将在下面看到这一点。

exclude = ["NMHC(GT)"]
# 绘制原始数据和一阶差分数据的图表,默认为一阶差分
# 注意:取消注释display_format以使用“plotly-widget”。
eda.plot_model(plot="diff",  # 绘制一阶差分图表fig_kwargs={"height": 900,  # 图表高度为900# 使用plotly-widget时不需要传递show_dash参数"resampler_kwargs": {"default_n_shown_samples": 1500}  # 重采样参数,显示1500个样本},data_kwargs={"acf": True, "pacf": True, "periodogram": True},  # 数据参数,包括自相关函数、偏自相关函数和周期图# display_format="plotly-widget",  # 使用plotly-widget显示格式,取消注释以启用
)

在这里插入图片描述

图表分析:

  1. 我们需要进行差分吗?
  • 数据集显示了延长的自相关(ACF - 第1行,第2列),远高于显著性水平。这表明需要进行差分。
  • 通过查看PACF图(第1行,第3列),也可以得出同样的观察结果,它显示在滞后1(即前一个时间点)上有非常高的相关性。
  • 这个特征也可以在周期图(第1行,第4列)中看到,它在f = 0附近有一个峰值(放大以查看细节)。在f = 0附近出现峰值意味着时间周期非常长(没有重复),并且表明了可以通过差分来建模的“随机游走”类型的行为。
  1. 我们需要建模季节性吗?
  • ACF还显示在滞后24处有峰值,表明存在24小时的季节性(这也在设置阶段中指示出来)。
  • 这也可以在周期图中看到(在基频f = 0.0417处有峰值,以及它的谐波0.0834、0.1249…)。f = 0.0417对应于T = 1/0.0417 = 24,表示季节周期为24小时。

一阶差分

  1. 一阶差分显示已经处理了许多延长的自相关(第2行,第2列的幅度比之前小得多)。在周期图中也可以看到同样的情况(第2行,第4列),在f = 0附近的幅度比之前小得多。
  2. ACF仍然显示在滞后24处有峰值,周期图也是如此,表明我们仍然需要处理这个问题以适当地建模行为。接下来,让我们绘制包括季节性在内的差分。这次,我们将明确指定滞后,因为我们希望对分析有更精细的控制。

注意:lags = 1与order = 1相同,意味着进行一阶差分,而lags = [1, 24]意味着先进行一阶差分,然后再进行24的季节性差分。

# 使用plot_model函数进行绘图
eda.plot_model(# 绘图类型为diffplot="diff",# 设置绘图的参数fig_kwargs={# 设置绘图的高度为900"height": 900,# 设置重采样的参数"resampler_kwargs": {# 设置默认显示的样本数为1500"default_n_shown_samples": 1500,# 设置显示的模式为inline,端口号为8056"show_dash": {"mode": "inline", "port": 8056},},},# 设置数据的参数data_kwargs={# 设置滞后列表为[1, [1, 24]]"lags_list": [1, [1, 24]],# 设置是否显示自相关函数图像为True"acf": True,# 设置是否显示偏自相关函数图像为True"pacf": True,# 设置是否显示周期图像为True"periodogram": True,},# 设置显示格式为plotly-dash# display_format='plotly-dash',
)

在这里插入图片描述

我们将把注意力集中在第三行,因为前两行是最后一个图的重复。第三行表示一阶差分,后面是一个周期为24的季节性差分。从自相关图(第3行,第2列)可以看出,所有的扩展自相关已经得到了处理。我们仍然可以看到在滞后=24时有一个峰值(现在是负的),但是仔细检查周期图后,我们意识到泄漏的谱密度非常低。因此,我们可以得出结论,采用一阶差分和周期为24的季节性差分可以相当合理地建模这个时间序列。然而

注意:读者可以选择进一步研究以确定AR和MA分量。例如,偏自相关图(第3行,第3列)显示在滞后=2时有一个负峰(显著),进一步表明至少有一个二阶AR分量。为了简单起见,我们在这个练习中不使用它,但是它肯定应该被探索以进行更完整的评估。

接下来,让我们探索外生变量对目标的影响以及它们之间的相关性。这可以通过交叉相关图来实现。

# 使用plot_model函数绘制ccf图
# 参数plot指定绘制的图类型为ccf
# 参数fig_kwargs用于设置图的大小,这里设置高度为1000,宽度为1500
eda.plot_model(plot="ccf", fig_kwargs={"height": 1000, "width": 1500})

在这里插入图片描述

第一个图(第1行,第1列)显示了目标变量的自相关性(与其ACF相同),而其余的图显示了目标变量与滞后值的外生变量的相关性。例如,第1行,第2列显示CO浓度与滞后0和滞后24的PT08.S1(CO)强相关。其他变量(如NOx(GT)C6H6(GT)PT08.S2(NMHC))也呈现类似的模式,这些变量在建模CO浓度时可能会有用。

另一个观察结果是绝对湿度AH似乎与CO浓度没有很强的相关性。这个变量在建模中可能不重要。


# 将字符串"AH"添加到exclude列表中,表示需要排除的元素是"AH"
exclude.append("AH")
exclude
['NMHC(GT)', 'AH']

第二步:基准模型 - 不使用外生变量的单变量预测

# 将数据复制一份并命名为data_uni
data_uni = data.copy()# 将data_uni的索引设置为"index"
data_uni.set_index("index", inplace=True)# 将data_uni的目标列设置为target
data_uni = data_uni[target]# 创建一个时间序列预测实验对象exp_uni
exp_uni = TSForecastingExperiment()# 设置exp_uni的参数
exp_uni.setup(data=data_uni,  # 使用data_uni作为数据fh=48,  # 预测未来48个时间步长numeric_imputation_target="ffill",  # 使用前向填充法对目标列进行数值插补numeric_imputation_exogenous="ffill",  # 使用前向填充法对外部变量进行数值插补fig_kwargs=global_fig_settings,  # 设置图形参数为global_fig_settingssession_id=42  # 设置会话ID为42
)

在这里插入图片描述

<pycaret.time_series.forecasting.oop.TSForecastingExperiment at 0x1d7cd3dac20>
# 创建一个ARIMA模型
# 参数说明:
# - "arima":表示使用ARIMA模型
# - order=(0,1,0):表示ARIMA模型的阶数,这里是(0,1,0),即p=0, d=1, q=0
# - seasonal_order=(0,1,0,24):表示ARIMA模型的季节性阶数,这里是(0,1,0,24),即P=0, D=1, Q=0, S=24
model = exp_uni.create_model("arima", order=(0,1,0), seasonal_order=(0,1,0,24))

在这里插入图片描述

Processing:   0%|          | 0/4 [00:00<?, ?it/s]
# 调用plot_model函数,传入model参数
exp_uni.plot_model(model)# 该代码用于绘制模型的图形化表示
# exp_uni模块中的plot_model函数可以将给定的模型绘制成图形化的形式
# model参数是要绘制的模型对象
# 通过调用exp_uni模块中的plot_model函数,可以方便地查看模型的结构和层次关系

在这里插入图片描述

在放大预测结果后,我们可以看到模型能够捕捉到数据集中的一些趋势(峰值),但并非全部。基准模型的表现表明,交叉验证折叠中的平均MASE为1.52,这并不是很好的结果。任何大于1的值都表明该模型的表现甚至比一个简单的一步预测的天真模型还要差。这个模型需要进一步改进。让我们看看是否添加外部变量可以帮助改善模型的性能。

步骤3:改进模型 - 单变量预测与外生变量

# 创建一个时间序列预测实验对象
exp_exo = TSForecastingExperiment()# 设置实验参数
exp_exo.setup(data=data,  # 数据集target=target,  # 目标变量index="index",  # 时间索引列名fh=48,  # 预测的未来时间步数numeric_imputation_target="ffill",  # 目标变量的数值缺失值填充方法numeric_imputation_exogenous="ffill",  # 外部变量的数值缺失值填充方法fig_kwargs=global_fig_settings,  # 图形参数设置session_id=42  # 实验的会话ID
)

在这里插入图片描述

<pycaret.time_series.forecasting.oop.TSForecastingExperiment at 0x1d7d7a938b0>
# 创建一个ARIMA模型
# 参数说明:
# - "arima":表示使用ARIMA模型
# - order=(0,1,0):表示ARIMA模型的阶数,这里是(0,1,0),即p=0, d=1, q=0
# - seasonal_order=(0,1,0,24):表示季节性ARIMA模型的阶数,这里是(0,1,0,24),即P=0, D=1, Q=0, S=24
model_exo = exp_exo.create_model("arima", order=(0,1,0), seasonal_order=(0,1,0,24))

在这里插入图片描述

Processing:   0%|          | 0/4 [00:00<?, ?it/s]
# 调用plot_model函数,并传入model_exo作为参数
exp_exo.plot_model(model_exo)

在这里插入图片描述

第四步:评估模型

不错,我们成功地显著改进了MASE,这比单变量模型要好得多,也比朴素模型有了很大的改进。我们应该对这个改进感到满意。让我们通过在整个数据集上训练模型来最终确定它,这样我们就可以进行真正的未来预测了。

# 将模型训练结果进行最终处理
final_model_exo = exp_exo.finalize_model(model_exo)
# 定义一个函数safe_predict,用于对模型进行预测的包装器,以便于演示目的。
def safe_predict(exp, model):try: exp.predict_model(model)  # 调用exp对象的predict_model方法进行模型预测except ValueError as exception:  # 如果出现ValueError异常print(exception)  # 打印异常信息exo_vars = exp.exogenous_variables  # 获取exp对象的外生变量print(f"{len(exo_vars)} exogenous variables (X) needed in order to make future predictions:\n{exo_vars}")  # 打印需要外生变量的数量和具体的外生变量名称# 调用safe_predict函数,传入exp_exo和final_model_exo作为参数
safe_predict(exp_exo, final_model_exo)
Model was trained with exogenous variables but you have not passed any for predictions. Please pass exogenous variables to make predictions.
10 exogenous variables (X) needed in order to make future predictions:
['PT08.S1(CO)', 'C6H6(GT)', 'PT08.S2(NMHC)', 'NOx(GT)', 'PT08.S3(NOx)', 'NO2(GT)', 'PT08.S4(NO2)', 'PT08.S5(O3)', 'T', 'RH']

正如我们所看到的,这种方法并非没有副作用。问题在于我们有10个外生变量。因此,为了获得CO浓度的任何未知未来值,我们将需要所有这些外生变量的未来值。通常,这是通过某种预测过程本身来获得的。但是每个预测都会有误差,当有很多外生变量时,这些误差可能会累积。让我们看看是否可以减少这些外生变量,只保留一些有用的变量,而不会影响预测性能。

第五步:简约模型 - 有限外生变量的单变量预测

从CCF分析中,我们发现许多外生变量与CO浓度具有非常相似的相关结构。例如,24小时前(滞后=24)的PT08.S1(CO)NOx(GT)C6H6(GT)PT08.S2(NMHC)的值与CO浓度呈高正相关。我们不需要保留所有这些变量,只需选择在滞后24时具有最高正相关性的变量,即NOx(GT)

同样,24小时前的PT08.S3(NOx)值与CO浓度呈最高负相关。我们也会保留这个变量。

最后,在每日周期中,过去12小时发生的事情也会影响当前值(例如,昨晚的值可能会影响到第二天,反之亦然)。在滞后=12时,与CO浓度相关性最高的变量是RH。我们也会保留这个变量。

# 创建一个TSForecastingExperiment对象
exp_slim = TSForecastingExperiment()# 选择需要保留的特征列
keep = [target, "index", 'NOx(GT)', "PT08.S3(NOx)", "RH"]# 从原始数据中提取需要保留的特征列
data_slim = data[keep]# 设置实验参数
exp_slim.setup(data=data_slim,  # 数据集target=target,  # 目标变量index="index",  # 索引列fh=48,  # 预测步长numeric_imputation_target="ffill",  # 目标变量的数值填充方法numeric_imputation_exogenous="ffill",  # 外生变量的数值填充方法fig_kwargs=global_fig_settings,  # 图形参数session_id=42  # 随机种子
)

在这里插入图片描述

<pycaret.time_series.forecasting.oop.TSForecastingExperiment at 0x1d7d799d300>

# 使用exp_slim库的create_model函数创建一个ARIMA模型
# 参数说明:
# - "arima":表示使用ARIMA模型
# - order=(0,1,0):表示ARIMA模型的阶数,这里是(0,1,0),即p=0, d=1, q=0
# - seasonal_order=(0,1,0,24):表示ARIMA模型的季节性阶数,这里是(0,1,0,24),即P=0, D=1, Q=0, S=24
model_slim = exp_slim.create_model("arima", order=(0,1,0), seasonal_order=(0,1,0,24))

在这里插入图片描述

Processing:   0%|          | 0/4 [00:00<?, ?it/s]

# 调用plot_model函数,将model_slim作为参数传入
exp_slim.plot_model(model_slim)

在这里插入图片描述

不错。MASE只有轻微增加,但我们成功地大幅减少了外生变量。这将有助于我们在进行“真正”的未知未来预测时,因为我们将需要这些外生变量的“未知”未来值来进行CO浓度的预测。

完善模型

  • 在整个数据集上训练精简模型,以便进行真正的未来预测
  • 将模型保存为pickle文件以供部署使用
# 将经过剪枝的模型进行最终的模型定型
final_slim_model = exp_slim.finalize_model(model_slim)
# 调用exp_slim模块中的save_model函数,将final_slim_model保存到指定路径
_ = exp_slim.save_model(final_slim_model, "final_slim_model")
Transformation Pipeline and Model Successfully Saved
safe_predict(exp_slim, final_slim_model)
Model was trained with exogenous variables but you have not passed any for predictions. Please pass exogenous variables to make predictions.
3 exogenous variables (X) needed in order to make future predictions:
['NOx(GT)', 'PT08.S3(NOx)', 'RH']

所以我们仍然需要3个外生变量的未来值。我们将在下一部分使用预测技术来获取这些值。

# 定义一个列表,包含需要使用的外生变量
exog_vars = ['NOx(GT)', 'PT08.S3(NOx)', 'RH']# 从数据中选择需要的列,并将其存储在一个新的数据框中
data = data[["index"] + exog_vars]# 打印数据框的前几行,以便查看结果
data.head()

在这里插入图片描述

第六步:进行未来预测

第六步A:使用预测获取未来外生变量的值

# 创建一个空列表,用于存储每个外生变量的实验
exog_exps = []# 创建一个空列表,用于存储每个外生变量的模型
exog_models = []# 遍历每个外生变量
for exog_var in exog_vars:# 创建一个时间序列预测实验对象exog_exp = TSForecastingExperiment()# 设置实验参数exog_exp.setup(data=data[["index", exog_var]], target=exog_var, index="index", fh=48,numeric_imputation_target="ffill", numeric_imputation_exogenous="ffill",fig_kwargs=global_fig_settings, session_id=42)# 用户可以自定义如何建模未来的外生变量,例如添加更多的步骤和模型,以获取更好的模型,但建模时间会增加。# 比较不同模型的性能,并选择最佳模型best = exog_exp.compare_models(sort="mase", include=["arima", "ets", "exp_smooth", "theta", "lightgbm_cds_dt",]        )# 完成模型的训练和调优final_exog_model = exog_exp.finalize_model(best)# 将实验对象和最终模型添加到列表中exog_exps.append(exog_exp)exog_models.append(final_exog_model)# 第二步:获取外生变量的未来预测值 ----
# 对于每个外生变量的实验和模型,进行预测
future_exog = [exog_exp.predict_model(exog_model)for exog_exp, exog_model in zip(exog_exps, exog_models)
]# 将预测结果合并为一个DataFrame
future_exog = pd.concat(future_exog, axis=1)# 设置列名为外生变量的名称
future_exog.columns = exog_vars

在这里插入图片描述

在这里插入图片描述

Processing:   0%|          | 0/25 [00:00<?, ?it/s]

在这里插入图片描述

在这里插入图片描述

Processing:   0%|          | 0/25 [00:00<?, ?it/s]

在这里插入图片描述

在这里插入图片描述

Processing:   0%|          | 0/25 [00:00<?, ?it/s]
future_exog

在这里插入图片描述

第6B步:加载模型并对目标变量进行未来预测

exp_future = TSForecastingExperiment()
# 加载模型
final_slim_model = exp_future.load_model("final_slim_model")
Transformation Pipeline and Model Successfully Loaded

# 使用final_slim_model对future_exog进行预测
future_preds = exp_future.predict_model(final_slim_model, X=future_exog)# 绘制预测结果的图表
future_preds.plot()
<Axes: >

在这里插入图片描述

第七步:自动机器学习

# 设置一个变量FH,表示预测的时间步长为48
FH = 48# 设置一个变量metric,表示评估模型的指标为mase
metric = "mase"# 设置一个列表exclude,包含了不需要使用的模型名称
exclude = ["auto_arima", "bats", "tbats", "lar_cds_dt", "par_cds_dt"]

第7A步:使用内生变量和外生变量进行单变量自动机器学习

# 创建一个时间序列预测实验对象
exp_auto = TSForecastingExperiment()# 设置实验参数
exp_auto.setup(data=data,  # 数据集target=target,  # 目标变量fh=FH,  # 预测步长enforce_exogenous=False,  # 是否使用外生变量,如果模型支持多变量预测,则使用多变量预测,否则使用单变量预测numeric_imputation_target="ffill",  # 目标变量的数值缺失值填充方法,使用前向填充numeric_imputation_exogenous="ffill",  # 外生变量的数值缺失值填充方法,使用前向填充fig_kwargs=global_fig_settings,  # 图形参数设置session_id=42  # 随机种子
)

在这里插入图片描述

<pycaret.time_series.forecasting.oop.TSForecastingExperiment at 0x27849347c40>
# 调用models()函数,查看可用的模型
exp_auto_noexo.models()
# 导入需要的模块和函数
from pycaret.regression import *# 使用exp_auto对象的compare_models方法来比较不同模型的性能
# sort参数指定了排序的指标,即根据哪个指标来排序模型的性能
# turbo参数设置为False,表示使用较慢的模型,如Prophet模型
# exclude参数用于排除一些特定的模型
best = exp_auto.compare_models(sort=metric, turbo=False, exclude=exclude)

在这里插入图片描述


# 使用plot_model函数绘制模型
# 参数best是要绘制的模型
exp_auto.plot_model(best)

在这里插入图片描述

# 将最佳模型保存为最终模型
final_auto_model = exp_auto.finalize_model(best)
# 安全预测函数def safe_predict(exp, model):"""用于演示目的的预测包装函数。"""try: # 尝试进行未来预测future_preds = exp.predict_model(model)except ValueError as exception:# 如果出现异常,打印异常信息print(exception)# 获取外生变量exo_vars = exp.exogenous_variablesprint(f"需要{len(exo_vars)}个外生变量(X)才能进行未来预测:\n{exo_vars}")# 创建空列表以存储外生变量的实验和模型exog_exps = []exog_models = []# 对于每个外生变量,进行以下操作for exog_var in exog_vars:# 创建时间序列预测实验对象exog_exp = TSForecastingExperiment()# 设置实验参数exog_exp.setup(data=data[exog_var], fh=FH,numeric_imputation_target="ffill", numeric_imputation_exogenous="ffill",fig_kwargs=global_fig_settings, session_id=42)# 用户可以自定义如何对未来的外生变量建模,例如添加更多步骤和模型以获取更好的模型,但建模时间会增加。# 比较不同模型的性能,并选择最佳模型best = exog_exp.compare_models(sort=metric, include=["arima", "ets", "exp_smooth", "theta", "lightgbm_cds_dt",]        )final_exog_model = exog_exp.finalize_model(best)# 将实验和模型添加到列表中exog_exps.append(exog_exp)exog_models.append(final_exog_model)# 第二步:获取外生变量的未来预测 ----# 对于每个外生变量的实验和模型,进行未来预测future_exog = [exog_exp.predict_model(exog_model)for exog_exp, exog_model in zip(exog_exps, exog_models)]# 将未来预测的结果合并为一个DataFramefuture_exog = pd.concat(future_exog, axis=1)future_exog.columns = exog_vars# 使用未来的外生变量进行最终的未来预测future_preds = exp.predict_model(model, X=future_exog)# 返回未来预测结果return future_preds
# 调用safe_predict函数,对模型进行预测,并将结果保存在future_preds变量中
future_preds = safe_predict(exp_auto, final_auto_model)# 使用matplotlib库中的plot函数,绘制future_preds的图形
future_preds.plot()
Model was trained with exogenous variables but you have not passed any for predictions. Please pass exogenous variables to make predictions.
3 exogenous variables (X) needed in order to make future predictions:
['NOx(GT)', 'PT08.S3(NOx)', 'RH']

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<Axes: >

在这里插入图片描述

这篇关于工具系列:PyCaret介绍_用外生变量单变量时间序列预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/523132

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言