如何用Python的Nixtla NeuralForecast建模不含目标变量输入的多变量时间序列
解决方案:用Nixtla工具链构建无目标输入的多变量预测模型
一、数据准备
先整理符合Nixtla库要求的数据格式,单序列场景需添加固定unique_id标识:
import numpy as np import pandas as pd from neuralforecast import NeuralForecast from neuralforecast.models import PatchTST, NeuralProphet # 生成示例数据 feature1 = np.sin(np.linspace(0, 2*np.pi, 100)) feature2 = np.cos(np.linspace(0, 2*np.pi, 100)) target = feature1 + feature2 # 构建DataFrame data = pd.DataFrame({ 'unique_id': ['series_1'] * 100, 'ds': np.arange(100), 'y': target, 'feature1': feature1, 'feature2': feature2 })
二、配置NeuralProphet:完全禁用目标历史输入
默认NeuralProphet会使用目标变量y的历史值建模,需通过设置n_lags=0完全关闭自回归项,只保留外部特征作为输入:
# 初始化模型,禁用目标历史滞后输入 np_model = NeuralProphet( n_lags=0, # 核心设置:不使用目标变量的历史值 n_forecasts=1, # 单步预测,可按需调整 freq='L' ) # 添加外部特征作为预测输入 np_model.add_future_regressor(name='feature1') np_model.add_future_regressor(name='feature2')
三、配置PatchTST:仅用外部特征建模
通过covariates_cols明确指定输入特征,让模型仅学习特征历史与目标的映射关系:
ptst_model = PatchTST( h=1, # 预测步长 input_size=10, # 输入的特征历史窗口长度,可按需调整 freq='L', target_cols=['y'], covariates_cols=['feature1', 'feature2'] # 指定仅使用这两个特征作为输入 )
四、模型训练与效果对比
用NeuralForecast统一管理模型,训练后输出预测结果并计算误差指标:
# 初始化模型管理器 nf = NeuralForecast( models=[np_model, ptst_model], freq='L' ) # 训练模型 nf.fit(df=data) # 生成预测 predictions = nf.predict(df=data) # 查看预测结果 print(predictions[['ds', 'y', 'NeuralProphet', 'PatchTST']]) # 计算MAE对比效果 from sklearn.metrics import mean_absolute_error mae_np = mean_absolute_error(predictions['y'], predictions['NeuralProphet']) mae_ptst = mean_absolute_error(predictions['y'], predictions['PatchTST']) print(f"NeuralProphet MAE: {mae_np:.4f}") print(f"PatchTST MAE: {mae_ptst:.4f}")
关键注意点
- NeuralProphet的
n_lags=0是核心,确保模型完全不依赖目标变量的历史值; - PatchTST通过
covariates_cols锁定输入特征,避免模型隐式使用目标历史; - 多步预测场景需确保特征的未来值可获取(如本例的周期特征),否则需额外处理特征预测问题。
内容的提问来源于stack exchange,提问作者Felix Hohnstein
相关产品推荐
相关产品推荐

