入门指南#

安装#

如果您在Windows上工作,您需要首先安装PyTorch

pip install torch -f https://download.pytorch.org/whl/torch_stable.html

否则,您可以继续

pip install pytorch-forecasting

或者,通过 conda 安装包:

conda install pytorch-forecasting pytorch>=1.7 -c pytorch -c conda-forge

PyTorch Forecasting 现在从 conda-forge 频道安装,而 PyTorch 则从 pytorch 频道安装。

要使用MQF2损失(多元分位数损失),还需安装

pip install pytorch-forecasting[mqf2]

用法#

该库在很大程度上依赖于PyTorch Lightning,这使得模型训练变得简单,能够快速发现错误,并且开箱即用地在多个GPU上进行训练。

此外,我们依赖Tensorboard来记录训练进度。

训练和测试模型的一般设置是

  1. 使用TimeSeriesDataSet创建训练数据集。

  2. 使用训练数据集,通过from_dataset()创建一个验证数据集。 同样地,可以创建一个测试数据集或稍后用于推理的数据集。如果您不希望在进行推理时加载整个训练数据集,可以直接存储数据集参数。

  3. 使用其.from_dataset()方法实例化模型。

  4. 创建一个 lightning.Trainer() 对象。

  5. 使用其.tuner.lr_find()方法找到最佳学习率。

  6. 在训练数据集上使用早停法训练模型,并使用tensorboard日志来了解模型是否以可接受的精度收敛。

  7. 使用您最喜欢的包调整模型的超参数。

  8. 在整个数据集上使用相同的学习率计划训练模型。

  9. 从模型检查点加载模型并将其应用于新数据。

Tutorials 部分提供了关于如何使用模型和实现新模型的详细指导和示例。

示例#

import lightning.pytorch as pl
from lightning.pytorch.callbacks import EarlyStopping, LearningRateMonitor
from lightning.pytorch.tuner import Tuner
from pytorch_forecasting import TimeSeriesDataSet, TemporalFusionTransformer

# load data
data = ...

# define dataset
max_encoder_length = 36
max_prediction_length = 6
training_cutoff = "YYYY-MM-DD"  # day for cutoff

training = TimeSeriesDataSet(
    data[lambda x: x.date < training_cutoff],
    time_idx= ...,
    target= ...,
    # weight="weight",
    group_ids=[ ... ],
    max_encoder_length=max_encoder_length,
    max_prediction_length=max_prediction_length,
    static_categoricals=[ ... ],
    static_reals=[ ... ],
    time_varying_known_categoricals=[ ... ],
    time_varying_known_reals=[ ... ],
    time_varying_unknown_categoricals=[ ... ],
    time_varying_unknown_reals=[ ... ],
)

# create validation and training dataset
validation = TimeSeriesDataSet.from_dataset(training, data, min_prediction_idx=training.index.time.max() + 1, stop_randomization=True)
batch_size = 128
train_dataloader = training.to_dataloader(train=True, batch_size=batch_size, num_workers=2)
val_dataloader = validation.to_dataloader(train=False, batch_size=batch_size, num_workers=2)

# define trainer with early stopping
early_stop_callback = EarlyStopping(monitor="val_loss", min_delta=1e-4, patience=1, verbose=False, mode="min")
lr_logger = LearningRateMonitor()
trainer = pl.Trainer(
    max_epochs=100,
    accelerator="auto",
    gradient_clip_val=0.1,
    limit_train_batches=30,
    callbacks=[lr_logger, early_stop_callback],
)

# create the model
tft = TemporalFusionTransformer.from_dataset(
    training,
    learning_rate=0.03,
    hidden_size=32,
    attention_head_size=1,
    dropout=0.1,
    hidden_continuous_size=16,
    output_size=7,
    loss=QuantileLoss(),
    log_interval=2,
    reduce_on_plateau_patience=4
)
print(f"Number of parameters in network: {tft.size()/1e3:.1f}k")

# find optimal learning rate (set limit_train_batches to 1.0 and log_interval = -1)
res = Tuner(trainer).lr_find(
    tft, train_dataloaders=train_dataloader, val_dataloaders=val_dataloader, early_stop_threshold=1000.0, max_lr=0.3,
)

print(f"suggested learning rate: {res.suggestion()}")
fig = res.plot(show=True, suggest=True)
fig.show()

# fit the model
trainer.fit(
    tft, train_dataloaders=train_dataloader, val_dataloaders=val_dataloader,
)

主API#

pytorch_forecasting.data.encoders.EncoderNormalizer([...])

特殊的归一化器,适用于每个编码序列。

pytorch_forecasting.data.encoders.GroupNormalizer([...])

按组进行缩放的标准化器。

pytorch_forecasting.data.encoders.MultiNormalizer(...)

用于多个目标的标准化器。

pytorch_forecasting.data.encoders.NaNLabelEncoder([...])

可以始终将nan和未知类别(在转换中)编码为类别0的标签编码器

pytorch_forecasting.data.timeseries.TimeSeriesDataSet(...)

用于拟合时间序列模型的PyTorch数据集。

pytorch_forecasting.metrics.base_metrics.DistributionLoss([...])

DistributionLoss 基类。

pytorch_forecasting.metrics.base_metrics.MultiHorizonMetric([...])

用于定义多时间范围预测指标的抽象类

pytorch_forecasting.metrics.base_metrics.MultiLoss(指标)

可以用于多个指标的指标。

pytorch_forecasting.metrics.distributions.BetaDistributionLoss([...])

用于单位区间数据的Beta分布损失。

pytorch_forecasting.metrics.distributions.ImplicitQuantileNetworkDistributionLoss([...])

隐式分位数网络分布损失。

pytorch_forecasting.metrics.distributions.LogNormalDistributionLoss([...])

对数正态损失。

pytorch_forecasting.metrics.distributions.MQF2DistributionLoss(...)

基于文章Multivariate Quantile Function Forecaster的多变量分位数损失。

pytorch_forecasting.metrics.distributions.MultivariateNormalDistributionLoss([...])

多元低秩正态分布损失。

pytorch_forecasting.metrics.distributions.NegativeBinomialDistributionLoss([...])

负二项式损失,例如用于计数数据。

pytorch_forecasting.metrics.distributions.NormalDistributionLoss([...])

正态分布损失。

pytorch_forecasting.metrics.point.CrossEntropy([...])

分类的交叉熵损失。

pytorch_forecasting.metrics.point.MAE([...])

平均绝对误差。

pytorch_forecasting.metrics.point.MAPE([...])

平均绝对百分比。

pytorch_forecasting.metrics.point.MASE([...])

平均绝对缩放误差

pytorch_forecasting.metrics.point.PoissonLoss([...])

用于计数数据的泊松损失。

pytorch_forecasting.metrics.point.RMSE([...])

均方根误差

pytorch_forecasting.metrics.point.SMAPE([...])

对称平均绝对百分比。

pytorch_forecasting.metrics.quantile.QuantileLoss([...])

分位数损失,即q=0.5的分位数将给出平均绝对误差的一半,因为它计算为。

pytorch_forecasting.models.base_model.AutoRegressiveBaseModel([...])

具有自回归模型附加方法的模型。

pytorch_forecasting.models.base_model.AutoRegressiveBaseModelWithCovariates([...])

具有协变量的自回归模型的附加方法。

pytorch_forecasting.models.base_model.BaseModel([...])

新时间序列模型应继承的BaseModel。

pytorch_forecasting.models.base_model.BaseModelWithCovariates([...])

使用协变量的模型,具有额外的方法。

pytorch_forecasting.models.baseline.Baseline([...])

使用最后一个已知目标值进行预测的基线模型。

pytorch_forecasting.models.deepar._deepar.DeepAR([...])

DeepAR 网络。

pytorch_forecasting.models.mlp._decodermlp.DecoderMLP([...])

解码器上的MLP。

pytorch_forecasting.models.nbeats._nbeats.NBeats([...])

初始化NBeats模型 - 如果可能的话,使用其from_dataset()方法。

pytorch_forecasting.models.nhits._nhits.NHiTS([...])

初始化N-HiTS模型 - 如果可能,使用其from_dataset()方法。

pytorch_forecasting.models.nn.embeddings.MultiEmbedding(...)

用于分类变量(包括分类变量组)的嵌入层。

pytorch_forecasting.models.nn.rnn.GRU()

可以处理零长度序列的GRU

pytorch_forecasting.models.nn.rnn.LSTM()

可以处理零长度序列的LSTM

pytorch_forecasting.models.nn.rnn.get_rnn(...)

获取LSTM或GRU。

pytorch_forecasting.models.rnn._rnn.RecurrentNetwork([...])

循环网络。

pytorch_forecasting.models.temporal_fusion_transformer._tft.TemporalFusionTransformer([...])

用于预测时间序列的时间融合变压器 - 如果可能,请使用其 from_dataset() 方法。

pytorch_forecasting.models.tide._tide.TiDEModel(...)

TiDE模型的实现。

pytorch_forecasting.utils._maint._show_versions.show_versions()

打印Python版本、操作系统版本、sktime版本、选定的依赖版本。

pytorch_forecasting.utils._utils.apply_to_list(...)

如果传递的值不是列表,则直接应用函数到对象列表。

pytorch_forecasting.utils._utils.autocorrelation(输入)

计算样本在维度 dim 上的自相关。

pytorch_forecasting.utils._utils.create_mask(...)

创建形状为len(lenghts) x size的布尔掩码。

pytorch_forecasting.utils._utils.detach(x)

分离对象

pytorch_forecasting.utils._utils.get_embedding_size(n)

根据经验确定良好的嵌入大小(公式取自fastai)。

pytorch_forecasting.utils._utils.groupby_apply(...)

对torch张量进行分组应用

pytorch_forecasting.utils._utils.integer_histogram(data)

在预定义范围内创建整数的直方图

pytorch_forecasting.utils._utils.move_to_device(x, ...)

将对象移动到设备。

pytorch_forecasting.utils._utils.profile(...)

使用vmprof分析给定函数。

pytorch_forecasting.utils._utils.to_list(value)

将值或列表转换为值的列表。

pytorch_forecasting.utils._utils.unpack_sequence(...)

解包RNN序列。