ニューラル ネットワークの時系列予測 PyTorch-Forecastin!

ce5a15813fea8f51506f6add43a36735.png

来源:数据STUDIO 深度学习初学者
本文约5200字,建议阅读8分钟
本文为你介绍了神经网络时间序列预测PyTorch-Forecastin。

e341df2d0ce948ec30d9a18a68477e91.png

PyTorch-Forecasting [1] ニューラル ネットワークを使用した時系列予測は、データ サイエンティストや研究者にとって簡単です。

正確な予測がなぜそれほど重要なのでしょうか?

時系列の予測は多くの状況で重要であり、機械学習の実践者にとって非常に関連性の高いものです。需要予測を例に挙げてみましょう。需要予測から多くのユースケースが生まれています。ほぼすべてのメーカーは、生産量を最適化するために自社製品の需要をより深く理解することで恩恵を受けるでしょう。生産が不足すると収入が減り、生産が過剰になると過剰分を割引価格で販売せざるを得なくなります。非常に関係があるのは価格設定であり、基本的には価格弾力性に特に重点を置いた需要予測です。価格設定はほぼすべての企業に関係します。

予測メンテナンス、リスク スコアリング、不正検出などの追加の機械学習アプリケーションのホストにとって、時間は非常に重要です。信頼性の高い予測を作成するには、イベントの順序とイベント間のタイミングが重要です。

実際、時系列予測は画像認識や言語処理ほど派手ではないかもしれませんが、業界ではより一般的です。これは、画像認識と言語処理が新製品の強化によく使用される比較的新しい分野であるのに対し、予測は数十年前から存在しており、多くの意思決定 (サポート) システムの中心となっているためです。PyTorch Forecasting などの高精度の機械学習モデルを採用すると、意思決定をより適切にサポートし、自動化することもでき、多くの場合、数百万ドルの追加利益が直接得られます。

ディープラーニングが強力な予測ツールとして登場

ディープ ラーニング (ニューラル ネットワーク) は、近年、時系列予測において従来の手法を上回っており、程度は劣りますが画像処理や言語処理においても優れています。実際、ディープラーニングは、純粋な時系列の予測において、わずか 2 年前に従来の統計手法を上回りました (つまり、価格対需要などの共変量が存在しないことを意味します)。しかし、この分野の急速な発展に伴い、ニューラル ネットワークに関連する精度の利点が非常に明白になり、時系列予測での使用の増加が正当化されるようになりました。たとえば、最先端のアーキテクチャであるN-BEATS [2] は、次に優れた非ニューラル ネットワーク手法 (つまり、統計手法のアンサンブル) と比較して、M4 競合データセットの sMAPE が 11% 低下していることを示しています。 。このネットワークはPyTorch Forecasting [3]にも実装されています。

さらに、ディープ ラーニングには、勾配ブースト ツリーなどの他の一般的な機械学習アルゴリズムと比較しても、2 つの利点があります。まず、ニューラル ネットワーク アーキテクチャは、時間を本質的に理解して設計できます。つまり、時間的に近いデータ ポイント間の接続を自動的に作成します。したがって、複雑な時間的依存関係を捉えることができます。対照的に、従来の機械学習モデルでは、過去 x 日間の平均などの時系列特徴を手動で作成する必要があります。これにより、これらの従来の機械学習アルゴリズムが時間的依存関係をモデル化する能力が弱まります。次に、ほとんどのツリーベースのモデルは設計によりステップ関数を出力します。そのため、入力変化の限界効果を予測することができず、さらに、ドメイン外の予測では信頼性が低いことで知られています。たとえば、30 ユーロと 50 ユーロの価格のみを観察する場合、ツリーベースのモデルでは、需要に応じて価格を 30 ユーロから 35 ユーロに変更する効果を評価できません。そのため、多くの場合、入力を最適化するために直接使用することはできません。ただし、多くの場合、それが機械学習モデルの作成の要点であり、価値は共変量の最適化にあります。同時に、ニューラル ネットワークは連続活性化関数を採用しており、特に高次元空間での補間が得意です。つまり、価格などの入力を最適化するために使用できます。

PyTorch 予測とは何ですか?

38f8272930e9103467eb7b1faef0cbf9.png

PyTorch Forecasting は、実際の事例や研究にニューラル ネットワークを使用して時系列予測を簡素化することを目的としています。最先端の時系列予測アーキテクチャを提供することで、pandas データを使用して簡単にトレーニングできます。

  • ユーザーはトレーニング データ セットを準備するために PyTorch の使用方法に関する特別な知識を持っている必要がないため、高レベル API によりユーザーの作業負荷が大幅に軽減されます。TimeSeriesDataSetクラスは、変数の変換、欠損値、ランダムなサブサンプリング、複数の履歴の長さなどを処理します。必要なのは、pandas データフレームを提供し、モデルが学習する必要がある変数を指定することだけです。

  • BaseModel クラスは、予測と実際のグラフや部分的な依存関係グラフの表示など、一般的な視覚化機能を提供します。指標と例の形式でのトレーニングの進行状況は、テンソルボードに自動的に記録できます[4] 。

  • 共変量の有無にかかわらず、予測には最先端のネットワークが使用されました。また、特殊な組み込みの解釈機能も備えています。たとえば、Temporal Fusion Transformer [5][3] は、変数および時間的重要度の尺度を使用したベンチマークで Amazon の DeepAR を 36 ~ 69% 上回っています。これについては、以下の例でさらに詳しく見ることができます。

  • 複数の予測期間の予測を評価できるマルチホライズン時系列メトリクスが多数あります。

  • スケーラビリティを確保するために、これらのネットワークはPyTorch Lightning [6]で使用するように設計されており、CPU および単一および複数 (分散) GPU でのすぐに使用できるトレーニングが可能です。Ranger オプティマイザーは、モデルのトレーニングを高速化するために実装されています。

  • 実験や研究を促進するために、ネットワークを追加するのは簡単です。コードは、PyTorch の専門家を念頭に置いて明示的に設計されました。彼らは、複雑なアイデアさえも簡単に実現できることに気づくでしょう。実際、BaseModel クラスを継承し、forward メソッドの入出力の規則に従うだけで、記録機能と説明機能をすぐに有効にすることができます。

開始するには、ドキュメント内の詳細なチュートリアルでエンドツーエンドのワークフローが示されています。この記事の後半では、具体的な例についても説明します。

なぜこのパッケージが必要なのでしょうか?

PyTorch Forecasting は、ディープ ラーニングの使用に対する重要な障壁を克服するのに役立ちます。深層学習は画像処理や言語処理では定着していますが、時系列予測については同様ではありません。この分野は、ベイジアン モデルを除いて、ARIMA などの伝統的な統計手法や、勾配ブースティングなどの機械学習アルゴリズムが依然として主流です。時系列予測においてディープ ラーニングがまだ主流になっていない理由は 2 つありますが、これらはすべてすでに克服できています。

  1. ニューラル ネットワークのトレーニングには、ほとんどの場合 GPU が必要ですが、いつでもすぐに利用できるわけではありません。多くの場合、ハードウェア要件が大きなハードルとなります。ただし、このハードルはコンピューティングをクラウドに移行することで克服できます。

  2. 従来の方法と比較すると、ニューラル ネットワークの使用は比較的困難です。これは、時系列予測に特に当てはまります。現在、Facebook の PyTorch や Google の Tensorflow などの一般的なフレームワークで使用するための高レベル API が不足しています。従来の機械学習の場合は、実践者に標準化されたインターフェイスを提供する sci-kit learn エコシステムが存在します。

ユーザーにとって使いにくいため、広範なソフトウェア エンジニアリングが必要であることを考えると、この 3 番目のハードルはディープ ラーニング コミュニティでは重要であると考えられています。

273ba0fafdf641406f4a19a42f2ccf74.png

ディープラーニング実践者からの典型的な証言

つまり、PyTorch Forecasting は、fast.ai [7] が画像認識と自然言語処理で行ったことと同じことを行うことを目的としています。これにより、学術界から実世界へのニューラル ネットワークの普及が大幅に促進されました。PyTorch Forecasting は、PyTorch に高レベルの API を提供し、pandas データ フレームを直接使用して、時系列予測に対応する作業を実行します。学習を容易にするために、fast.ai とは異なり、このパッケージはまったく新しい API を作成しませんが、確立された PyTorch および PyTorch Lightning API に基づいて構築されています。

PyTorch 予測の使用方法?

この小さな例は、パッケージの能力とその最も重要な抽象化を示しています。私達はします

  1. トレーニングと検証のデータセットを作成します。

  2. Temporal Fusion Transformer [8]をトレーニングします。これはオックスフォード大学と Google によって開発された、Amazon の DeepAR を上回るアーキテクチャです。

  3. 検証セットの結果を確認し、トレーニングされたモデルを説明します。

注: 以下のコードは、PyTorch Forecasting のバージョン 0.4.1 および PyTorch Lightning のバージョン 0.9.0 でのみ機能します。最新リリースで実行するには、最小限の変更が必要です。最新のコードを含む完全なチュートリアル [9] 。


トレーニングと検証用のデータセットを作成する

まず、時系列を pandas データ フレームに変換する必要があります。これにより、各行がタイム ステップと時系列で識別できるようになります。幸いなことに、ほとんどのデータセットはすでにこの形式になっています。この論文では、 Kaggle の Stallion データセット [10]を使用して、さまざまな飲料の売上を説明します。私たちの仕事は、在庫管理単位 (SKU)、つまり製品ごとに施設 (つまり店舗) の売上の 6 か月間の予測を立てることです。過去の販売記録は約 21000 か月あります。過去の販売実績に加え、販売価格、代理店所在地、休日などの特別日、業界全体の販売量などの情報も掲載しています。

from pytorch_forecasting.data.examples 
import get_stallion_data
data = get_stallion_data()  # load data as pandas dataframe

このデータセットはすでに正しい形式を持っていますが、いくつかの重要な特徴が欠けています。最も重要なのは、タイム ステップごとに 1 ずつ増加する時間インデックスを追加する必要があることです。また、日付機能を追加すると有益です。この場合、日付レコードから月を抽出することになります。

#添加时间索引
data["time_idx"] = data["date"].dt.year * 12 + data["date"].dt.monthdata["time_idx"] -= data["time_idx"].min()
# 添加额外的特征
# 类别必须是字符串
data["month"] = data.date.dt.month.astype(str).astype("category")
data["log_volume"] = np.log(data.volume + 1e-8)
data["avg_volume_by_sku"] = (
   data
   .groupby(["time_idx", "sku"], observed=True)
   .volume.transform("mean")
)
data["avg_volume_by_agency"] = (
   data
   .groupby(["time_idx", "agency"], observed=True)
   .volume.transform("mean")
)
# 我们想把特殊的日子编码为一个变量,因此需要先把一个热度倒过来。
# 因此需要先进行反向的一键编码
special_days = [
   "easter_day", "good_friday", "new_year", "christmas",
   "labor_day", "independence_day", "revolution_day_memorial",
   "regional_games", "fifa_u_17_world_cup", "football_gold_cup",
   "beer_capital", "music_fest"
]data[special_days] = (
   data[special_days]
   .apply(lambda x: x.map({0: "-", 1: x.name}))
   .astype("category")
)
# 显示样本数据
data.sample(10, random_state=521)

d7fe96067853632e8426f67a902e0c29.png

データフレームから行をランダムに抽出する

次のステップは、データ フレームを PyTorch Forecasting データセットに変換することです。どの特徴がカテゴリ的で、どの特徴が連続的で、どの特徴が静的で、どの特徴が時間の経過とともに変化するかをデータセットに伝えることに加えて、データを正規化する方法も決定する必要があります。ここでは、値が常に正であることに注意して、各時系列を個別に標準化します。

また、過去 6 か月のデータを検証セットとして使用することも選択しました。

from pytorch_forecasting.data import (
    TimeSeriesDataSet,
    GroupNormalizer
)max_prediction_length = 6   #预测6个月
max_encoder_length = 24 # 使用24个月的历史数据
training_cutoff = data["time_idx"].max() - max_prediction_lengthtraining = TimeSeriesDataSet(
    data[lambda x: x.time_idx <= training_cutoff],
    time_idx="time_idx",
    target="volume",
    group_ids=["agency", "sku"],
    min_encoder_length=0,  # 允许没有历史的预测
    max_encoder_length=max_encoder_length,
    min_prediction_length=1,
    max_prediction_length=max_prediction_length,
    static_categoricals=["agency", "sku"],
    static_reals=[
        "avg_population_2017",
        "avg_yearly_household_income_2017"
    ],
    time_varying_known_categoricals=["special_days", "month"],
  # 一组分类变量可以被视为一个变量
    variable_groups={"special_days": special_days},
    time_varying_known_reals=[
        "time_idx",
        "price_regular",
        "discount_in_percent"
    ],
    time_varying_unknown_categoricals=[],
    time_varying_unknown_reals=[
        "volume",
        "log_volume",
        "industry_volume",
        "soda_volume",
        "avg_max_temp",
        "avg_volume_by_agency",
        "avg_volume_by_sku",
    ],
    target_normalizer=GroupNormalizer(
        groups=["agency", "sku"], coerce_positive=1.0
  ), # 使用softplus,beta=1.0,并按组进行规范化处理
  add_relative_time_idx=True, # 作为特征添加
  add_target_scales=True, # 添加为特征
  add_encoder_length=True, # 添加为特性
)# 创建验证集(predict=True),这意味着要预测每个系列的最后一个最大预测长度的时间点
validation = TimeSeriesDataSet.from_dataset(
  training, data, predict=True, stop_randomization=True
)# 为模型创建数据加载器
batch_size = 128
train_dataloader = training.to_dataloader(
    train=True, batch_size=batch_size, num_workers=0
)
val_dataloader = validation.to_dataloader(
    train=False, batch_size=batch_size * 10, num_workers=0
)


時間融合トランスフォーマーの訓練

今度はモデルを作成します。このモデルを PyTorch Lightning でトレーニングします。トレーニング前に、学習率ファインダーを使用して、最適な学習率を決定できます。

import pytorch_lightning as pl
from pytorch_lightning.callbacks import (
    EarlyStopping,
    LearningRateLogger
)
from pytorch_lightning.loggers import TensorBoardLogger
from pytorch_forecasting.metrics import QuantileLoss
from pytorch_forecasting.models import TemporalFusionTransformer# stop training, when loss metric does not improve on validation set
early_stop_callback = EarlyStopping(
    monitor="val_loss",
    min_delta=1e-4,
    patience=10,
    verbose=False,
    mode="min"
)
lr_logger = LearningRateLogger() # 记录学习率
logger = TensorBoardLogger("lightning_logs") # 记录到tensorboard# 创建训练器
trainer = pl.Trainer(
    max_epochs=30,
    gpus=0,   # 在CPU上训练,使用gpus = [0] 在GPU上运行
    gradient_clip_val=0.1,
    early_stop_callback=early_stop_callback,
    limit_train_batches=30,  # 每30个批次运行一次验证
    # fast_dev_run=True,   # 注释进去以快速检查bug
    callbacks=[lr_logger],
    logger=logger,
)# 初始化模型
tft = TemporalFusionTransformer.from_dataset(
    training,
    learning_rate=0.03,
    hidden_size=16,  # 影响最大的网络规模
    attention_head_size=1,
    dropout=0.1,
    hidden_continuous_size=8,
  output_size=7, # QuantileLoss默认有7个量纲
  loss=QuantileLoss()、
  log_interval=10, # 每10个批次记录一次例子
  reduce_on_plateau_patience=4, # 自动减少学习。
)
tft.size() # 模型中29.6k个参数# 适合网络
trainer.fit(
    tft,
    train_dataloader=train_dataloader,
    val_dataloaders=val_dataloader
)
65e82c46e7090efd5f52ac316cf7138a.png

私のコンピューターではトレーニングに約 3 分かかりますが、大規模なネットワークやデータセットでは数時間かかる場合があります。トレーニング中に、tensorboard --logdir=lightning_logs で開始できる tensorboard を監視できます。たとえば、トレーニング セットと検証セットの予測例を監視できます。下の画像からわかるように、予測はかなり正確であるように見えます。ご参考までに、灰色の線は、予測を行うときにモデルがさまざまな時点にどの程度注意を払うかを示しています。

fa781f797414dad7096009c61e366ce7.png

トレーニング インスタンスを表示する Tensorboard パネル

トレーニングされたモデルを評価する

トレーニング後、検証データセットといくつかの例でこれらのメトリクスを評価して、モデルがどのように機能するかを確認できます。21000 サンプルのみを使用したことを考えると、結果は非常に信頼できるものであり、グラジエント ブースターの結果と比較しても遜色ありません。

from pytorch_forecasting.metrics import MAE
# 根据验证损失加载最佳模型(鉴于
# 我们使用早期停止,这不一定是最后一个 epoch)
best_model_path = trainer.checkpoint_callback.best_model_path
best_tft = TemporalFusionTransformer.load_from_checkpoint(best_model_path) # 计算验证集的平均绝对误差
actuals = torch.cat([y for x, y in iter(val_dataloader)] )
predictions = best_tft.predict(val_dataloader)MAE(predictions, actuals)
c6fd24f2c9a140c3735ca6bcd7489278.png

最もパフォーマンスの悪い sMAPE を見ると、モデルのどこに信頼性の高い予測に問題があるかがわかります。これらの例は、モデルを改善する方法についての重要な指針を提供します。この実際と予測のプロットは、すべてのモデルで利用できます。

from pytorch_forecasting.metrics import SMAPE# 计算用于显示的指标
predictions, x = best_tft.predict(val_dataloader)
mean_losses = SMAPE(reduction="none")(predictions, actuals).mean(1)
indices = mean_losses.argsort(descending=True) # 对损失进行排序raw_predictions, x = best_tft.prediction(val_dataloader, mode="raw, return_x=True)# 仅显示两个例子用于演示
for idx in range(2):
  best_tft.plot_prediction(
    x,
    raw_predictions、
    idx=indices[idx]、
    add_loss_to_title=SMAPE()
  )
cb9ae5c5d710809a8dad63710e952350.png

検証セットの最悪の 2 つの予測。白い線は、コンバーターが特定の時点をどの程度気にするかを表します。

同様に、モデルからランダムな例を視覚化することもできます。PyTorch Forecasting のもう 1 つの機能は、トレーニングされたモデルを説明することです。たとえば、すべてのモデルでいつでも部分依存グラフを計算できます。ただし、簡潔にするために、ここでは Temporal Fusion Transformer の組み込み解釈機能の一部を示します。ニューラルネットワークを設計することで変数のインポートを実現します。

interpretation = best_tft.interpret_output(
    raw_predictions, reduction="sum"
)best_tft.plot_interpretation(interpretation)
375ee25c9c0273ffb550b6e9b1a273e7.png 92f65988500908ce3fb406d99063d622.png

予想通り、過去に観測された出来高がエンコーダーの最上位の変数であり、デコーダーでは価格関連の変数が最上位の予測変数でした。おそらくもっと興味深いのは、機関は静的変数の中で 5 位に過ぎなかったということです。ただし、2 番目と 3 番目の変数が場所に関連していることを考えると、これら 2 つの変数がモデルに含まれていない場合、代理店の順位がはるかに高くなることが予想されます。

要約する

PyTorch Forecasting ソフトウェアを使用すると、モデルをトレーニングし、その内部動作について洞察を得るのが非常に簡単です。実践者は、このパッケージを使用して、すぐに最先端のモデルをトレーニングおよび説明できます。PyTorch Lightning の統合により、トレーニングと予測がスケーラブルになります。研究者は、このパッケージを活用して、アーキテクチャの自動追跡およびイントロスペクション機能を取得し、それらを複数のデータセットにシームレスに適用できます。

参考文献

[1] PyTorch 予測: https://pytorch-forecasting.readthedocs.io/
[2] N-BEATS: https://openreview.net/forum?id=r1ecqn4YwB
[3] PyTorch 予測: https://pytorch -forecasting.readthedocs.io/en/latest/api/pytorch_forecasting.models.nbeats.NBeats.html
[4] テンソルボード: https://www.tensorflow.org/tensorboard
[5] 時間融合コンバーター: https:/ /arxiv .org/pdf/1912.09363.pdf
[6] PyTorch Lightning: https://pytorch-lightning.readthedocs.io/
[7] fast.ai: https://www.fast.ai/
[8] Temporal Fusion Transformer: https://arxiv.org/pdf/1912.09363.pdf
[9] 完全なチュートリアル: https://pytorch-forecasting.readthedocs.io/en/latest/tutorials/stallion.html
[10] Kaggle の Stallion データセット: https:/ /www.kaggl

e.com/utathya/future-volume-prediction

編集者: 王晶

7e775995c85166bc842afe156b721833.png

おすすめ

転載: blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/131587617