时间序列历史预测正确实现方式咨询:Darts与NeuralForecast应用
解决NeuralForecast历史预测速度问题的正确实现方式
一、优先使用NeuralForecast内置的backtest方法
NeuralForecast针对自身模型架构优化了backtest接口,相比通用交叉验证,它能避免重复训练的冗余开销,是实现历史预测的官方推荐方式。示例代码:
from neuralforecast import NeuralForecast from neuralforecast.models import NBEATS import pandas as pd # 初始化模型与预测器 models = [NBEATS(input_size=24, h=12, max_steps=1000)] nf = NeuralForecast(models=models, freq='H') # 执行高效历史回测 backtest_results = nf.backtest( df=your_dataframe, start_in_sample=pd.Timestamp('2023-01-01'), # 指定回测起始时间 h=12, # 预测步长 step_size=1 # 滚动步长,按需调整以平衡精度与速度 )
二、优化模型与训练配置提速
- 启用硬件加速:给模型添加
accelerator='gpu'参数(有GPU环境时),大幅缩短训练时间:model = NBEATS(input_size=24, h=12, max_steps=1000, accelerator='gpu') - 精简交叉验证设置:若必须用交叉验证,减少折数(比如从5折降至3折),避免无意义的重复计算。
- 合理设置输入序列长度:根据预测步长调整
input_size,比如预测12步时,input_size设为24或36即可,无需过长的历史序列。 - 关闭冗余输出:训练时设置
verbose=0,并将val_check_interval设为None,减少IO与验证开销。
三、手动实现轻量滚动预测
如果需要高度自定义的历史预测逻辑,可基于predict方法手动实现滚动预测,跳过框架层的交叉验证冗余:
current_date = pd.Timestamp('2023-01-01') end_date = pd.Timestamp('2023-02-01') h = 12 predictions = [] while current_date <= end_date: # 截取当前时间之前的训练数据 train_df = your_dataframe[your_dataframe['ds'] <= current_date] # 拟合模型 nf.fit(df=train_df) # 预测未来h步 pred = nf.predict(h=h) predictions.append(pred) # 滚动到下一个时间节点 current_date += pd.Timedelta(hours=h) # 合并所有预测结果 historical_preds = pd.concat(predictions)
四、排查数据层面的性能瓶颈
- 若数据集过大,先按时间窗口做分块处理或采样,减少单轮训练的数据量;
- 确保数据格式符合NeuralForecast要求(比如
ds列为时间戳、y列为目标值),避免框架内部的额外数据转换开销。
内容的提问来源于stack exchange,提问作者Igor Rivin
相关产品推荐
相关产品推荐

