智算多多



在当今数据驱动的世界中,准确的时间序列预测对于业务决策、资源规划和风险管理至关重要。传统的统计方法虽然稳定,但在处理复杂模式和非线性关系时往往表现不足。NeuralForecast通过神经网络的力量,能够捕捉时间序列中复杂的依赖关系和季节性模式,显著提升预测精度。
时间序列数据普遍存在于金融、零售、能源、医疗等各个领域。准确的预测可以帮助企业优化库存管理、预测销售趋势、规划能源需求,从而节省成本并提高效率。
NeuralForecast采用模块化设计,将数据预处理、模型训练、预测和评估集成到一个简洁的API中。用户只需几行代码就能构建复杂的预测模型,无需深入了解底层神经网络实现细节。

数据从原始DataFrame开始,经过from_df转换器转换为NeuralForecast内部格式。数据集支持动态更新、裁剪和批量获取,确保高效的内存使用和数据处理。
基础模型类定义了训练、验证和预测的标准流程。每个神经网络模型都继承自这个基础类,确保一致的API和行为。
NeuralForecast提供了多种数据标准化方法:
这些缩放器帮助模型更好地处理不同尺度的数据,提高训练稳定性和收敛速度。
损失函数模块支持多种评估指标,包括点预测损失和概率预测损失。用户可以根据具体需求选择合适的损失函数进行模型优化。
| 依赖包 | 最低版本 | 主要功能 |
|---|---|---|
| torch | 2.4.0 | PyTorch深度学习框架 |
| pytorch-lightning | 2.0.0 | 简化训练流程 |
| pandas | 1.3.5 | 数据处理 |
| numpy | 1.21.6 | 数值计算 |
| ray[train,tune] | 2.2.0 | 分布式训练和超参数调优 |
# 使用pip安装
pip install neuralforecast
# 或者使用conda安装
conda install -c conda-forge neuralforecast
# 开发模式安装(用于贡献代码)
git clone https://gitcode.com/gh_mirrors/ne/neuralforecast.git
cd neuralforecast
pip install -e .
from neuralforecast import NeuralForecast
from neuralforecast.models import NHITS
from neuralforecast.utils import AirPassengersDF
# 初始化预测器
nf = NeuralForecast(
models=[NHITS(input_size=24, h=12, max_steps=100)],
freq='M' # 月度数据
)
# 加载航空乘客数据集
df = AirPassengersDF()
# 训练模型
nf.fit(df=df)
# 生成预测
forecast = nf.predict()
print(forecast.head())
选择合适的时间序列预测模型需要考虑多个因素。以下是常见模型的特点对比:
| 模型类型 | 适用场景 | 训练速度 | 内存需求 | 可解释性 |
|---|---|---|---|---|
| N-BEATS/NHITS | 单变量预测,需要可解释性 | 中等 | 低 | 高 |
| Transformer系列 | 长序列,复杂模式 | 慢 | 高 | 中等 |
| RNN/LSTM/GRU | 短期依赖,简单模式 | 快 | 低 | 低 |
| TFT | 外生变量丰富场景 | 中等 | 中等 | 中等 |
| MLP/TCN | 快速原型,中等复杂度 | 快 | 低 | 低 |

N-BEATS模型架构
N-BEATS模型采用残差块结构,每个块包含全连接层堆栈,分别生成预测和回测分量。这种设计使得模型能够学习时间序列的多尺度特征,同时提供趋势和季节性分解的可解释性。
NeuralForecast支持静态和动态外生变量,可以显著提升预测精度:
from neuralforecast import NeuralForecast
from neuralforecast.models import TFT
import pandas as pd
# 创建包含外生变量的数据集
df = pd.DataFrame({
'unique_id': ['1'] * 100,
'ds': pd.date_range('2020-01-01', periods=100, freq='D'),
'y': np.random.randn(100),
'exog1': np.random.randn(100), # 动态外生变量
'exog2': ['A'] * 100 # 静态外生变量
})
# 使用TFT模型(支持外生变量)
nf = NeuralForecast(
models=[TFT(h=7, input_size=14, max_steps=200)],
freq='D'
)
nf.fit(df=df)
NeuralForecast支持分位数预测,提供预测区间:
from neuralforecast.models import DeepAR
# 配置分位数预测
model = DeepAR(
h=14,
input_size=28,
loss=HuberIQLoss(quantiles=[0.1, 0.5, 0.9]),
max_steps=100
)
nf = NeuralForecast(models=[model], freq='D')
nf.fit(df=df)
# 生成概率预测
prob_forecast = nf.predict()
利用Ray或Optuna进行分布式超参数调优:
from neuralforecast.auto import AutoNHITS
from ray import tune
# 自动模型选择与调优
auto_model = AutoNHITS(
h=12,
config={
"input_size": tune.choice([24, 48, 96]),
"n_blocks": tune.choice([1, 2, 3]),
"mlp_units": tune.choice([[64, 64], [128, 128]]),
"learning_rate": tune.loguniform(1e-4, 1e-2),
},
num_samples=10
)

NHITS模型架构
NHITS模型在N-BEATS基础上增加了层次结构,通过多个堆栈的残差连接,能够更好地处理不同时间尺度的模式。每个堆栈专注于特定频率的特征提取,最终汇总为全局预测。
import pandas as pd
import numpy as np
from neuralforecast import NeuralForecast
from neuralforecast.models import NHITS, NBEATS
from neuralforecast.losses.pytorch import MAE
# 模拟零售销售数据
dates = pd.date_range('2020-01-01', '2023-12-31', freq='D')
store_ids = ['Store_A', 'Store_B', 'Store_C']
data = []
for store in store_ids:
base_sales = 1000 + np.random.randn(len(dates)) * 200
seasonal = 200 * np.sin(2 * np.pi * np.arange(len(dates)) / 365)
trend = np.linspace(0, 500, len(dates))
sales = base_sales + seasonal + trend + np.random.randn(len(dates)) * 50
for i, date in enumerate(dates):
data.append({
'unique_id': store,
'ds': date,
'y': max(sales[i], 0) # 确保非负
})
df = pd.DataFrame(data)
# 多模型集成预测
models = [
NHITS(h=30, input_size=90, max_steps=200),
NBEATS(h=30, input_size=90, max_steps=200),
]
nf = NeuralForecast(models=models, freq='D')
nf.fit(df=df)
forecast_df = nf.predict()
# 模型性能评估
from neuralforecast.losses.numpy import mae, rmse
actual = df[df['ds'] > '2023-12-01']['y'].values
predicted = forecast_df['NHITS'].values
print(f"MAE: {mae(actual, predicted):.2f}")
print(f"RMSE: {rmse(actual, predicted):.2f}")
能源负荷预测需要考虑天气、节假日等多重因素。NeuralForecast的外生变量支持使其成为理想选择:
from neuralforecast.models import TFT
import holidays
# 添加节假日特征
us_holidays = holidays.US(years=[2020, 2021, 2022, 2023])
df['is_holiday'] = df['ds'].apply(lambda x: 1 if x in us_holidays else 0)
df['day_of_week'] = df['ds'].dt.dayofweek
df['month'] = df['ds'].dt.month
# 使用TFT模型处理外生变量
tft_model = TFT(
h=24, # 预测未来24小时
input_size=168, # 使用过去一周的数据
hidden_size=64,
n_head=4,
max_steps=500
)
nf = NeuralForecast(models=[tft_model], freq='H')
nf.fit(df=df)

DeepAR概率预测模型
DeepAR模型采用循环神经网络架构,通过蒙特卡洛采样生成概率预测。在训练阶段,模型学习历史数据的条件分布;在推理阶段,通过自回归方式生成多步预测,并计算预测区间。
# 使用适当的缩放器
from neuralforecast.common._scalers import LocalStandardScaler
# 对于存在异常值的数据,使用鲁棒缩放器
scaler = LocalRobustScaler()
# 对于有界数据,使用最小-最大缩放器
scaler = LocalMinMaxScaler(feature_range=(0, 1))
# 启用GPU加速
import torch
device = 'cuda' if torch.cuda.is_available() else 'cpu'
# 使用混合精度训练
from pytorch_lightning import Trainer
trainer = Trainer(
accelerator='gpu',
devices=1,
precision='16-mixed', # 混合精度训练
max_epochs=100
)
# 调整批处理大小
model = NHITS(
h=12,
input_size=24,
batch_size=32, # 根据GPU内存调整
max_steps=200
)
# 使用梯度累积
trainer = Trainer(
accumulate_grad_batches=4, # 每4个批次更新一次梯度
max_epochs=100
)
解决方案:
解决方案:
解决方案:
解决方案:
NeuralForecast提供了模型可解释性工具,帮助理解预测结果:
from neuralforecast import NeuralForecast
from neuralforecast.models import NBEATS
nf = NeuralForecast(models=[NBEATS(h=12, input_size=24)], freq='M')
nf.fit(df=df)
# 获取趋势和季节性分解
decomposition = nf.decompose(df=df)
对于数据稀缺的场景,可以使用预训练模型:
# 在相似领域数据上预训练
pretrained_model = NHITS(h=12, input_size=24)
pretrained_model.fit(pretrain_df)
# 在新的小数据集上微调
pretrained_model.finetune(finetune_df, max_steps=50)
对于大规模数据集,可以使用分布式训练:
from ray import train
from neuralforecast import NeuralForecast
from neuralforecast.auto import AutoNHITS
# 配置分布式训练
train.init(address="auto")
auto_model = AutoNHITS(
h=12,
config={
"input_size": tune.grid_search([24, 48, 96]),
"learning_rate": tune.loguniform(1e-4, 1e-2),
},
num_samples=20,
resources_per_trial={"cpu": 2, "gpu": 0.5}
)
NeuralForecast采用清晰的模块化结构:
neuralforecast/
├── core.py # 核心预测引擎
├── models/ # 30+预测模型实现
│ ├── nhits.py # NHITS模型
│ ├── nbeats.py # N-BEATS模型
│ ├── tft.py # 时间融合Transformer
│ └── ... # 其他模型
├── losses/ # 损失函数实现
│ ├── pytorch.py # PyTorch损失函数
│ └── numpy.py # NumPy评估指标
├── common/ # 共享工具和基类
│ ├── _base_model.py # 模型基类
│ ├── _scalers.py # 数据标准化
│ └── _modules.py # 神经网络模块
└── tsdataset.py # 时间序列数据集处理
每个模型都遵循统一的接口设计,继承自BaseModel类,确保一致的使用体验。
docs/目录中的详细文档nbs/目录中的Jupyter Notebook示例tests/目录中的测试用例学习最佳实践neuralforecast.utils中的工具函数分析数据CONTRIBUTING.md了解贡献指南NeuralForecast作为一个活跃的开源项目,持续集成最新的时间序列预测研究成果。通过掌握这个工具,你可以构建出业界领先的预测系统,为业务决策提供有力支持。