見出し画像

AutoGluonで時系列予測 (Time Series Forecasting) を試す

現在でもかは分からないけれども、簡単に使えて精度が高いと注目されていた AutoGluon をやっと試しましたが、時系列予測の事前知識がほぼ無い状態だったので詰まったところが何箇所かあり、そのメモです。

モチベーション

AWS製のAutoMLライブラリということで、あまり深く考えずにデータを放り込めば勝手にモデルを構築してくれて、予測まで簡単に出来るというものを実際に使ったみたかったというところでした。

事前準備・環境

たまたまGoogle Colab Proを継続していたので、GPUを利用しました。

Google ColabのCUDAのバージョン確認

GPUを使うならば、AutoGluonで利用するApache MXNetをインストールする際にCUDAのバージョンを考慮する必要があるようなので確認します。

!nvcc -V

バージョンは11.1のようです(2022.8.5時点)

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Oct_12_20:09:46_PDT_2020
Cuda compilation tools, release 11.1, V11.1.105
Build cuda_11.1.TC455_06.29190527_0

ただ、mxnet-cu110の指定で大丈夫なようです(動いたとの記載が
一応リソース見てたらfitの際にGPUも微増してたので使われていたかとは思います。ただ、体感的にはCPUとそれほど変わらなかったような気がしました。
AutoGluon としてはGPUの指定は出来ず、使える環境であれば使う、という感じみたいです(FAQにしか記載はなさそうな)

AutoGluonのインストール

公式サイトのInstallationには色々ありますが、以下で大丈夫でした。

!pip3 install -U pip
!pip install --upgrade mxnet-cu110
!pip install autogluon

ただ、pip install を一回実行させた後でランタイムを再起動しています(restart しろとメッセージが出てたような気がします)
ここまですれば Forecasting Time Series - Quick Start をそのまま実行できました。


独自データを利用する際に詰まったところ

Quick Startの内容はすんなり実行出来て、概要も少しは捉えることが出来た後に、独自データを利用して試しました。
その際に何箇所か詰まるところがあったので、その対処メモです。

ただ、普段から時系列予測をしている人にとっては当たり前なのかなと思う部分かもしれません。

1) データが時系列に一定かつ連続に並んでいるか

datetime型の時系列データを持つように作成していますが、その時系列が飛び飛びになっているとAutoGluon側はどのような周期か判断出来ないようなので、一定かつ連続になるように時系列を整える必要がありました。

最初、fitを実行すると「KeyError: 0」が出てどこがおかしいのか全然分かりませんでしたが、ISSUEを読んで時系列を一定かつ連続にすることで解消されました(実際用意していた時系列に欠損がありました)

時系列データの追加にはnp.meshgridとpd.mergeを利用(こちらを参考にさせてもらい)して1日おきの連続したデータに整形。

kinds, dates = np.meshgrid(
    train_kinds,
    [(datetime(2010, 1, 1) + timedelta(days=i)) for i in range(3000)]
)
df_kind_date = pd.DataFrame({
    "kind": kinds.ravel(),
    "date": dates.ravel(),
})
df_merged = pd.merge(df_kind_date, df_train, on=["kind", "date"], how="left")

その後、念の為ソートして。

df_merged = df_merged.sort_values(["kind", "date"])

一応、インデックスを振り直してます。

df_merged = df_merged.reset_index(drop=True)

2) NaNの修正を単純に0埋めにする

時系列を追加したので、最初は曲線がなだらかになるようにした方がいいのかなと思い interpolate でNaNを埋めてみたのですが、それよりも単純に fillna で0埋めした方が予測が良くなったと思います(時と場合によるのかもですが)

ちなみに interpolate で埋めた時は stack overflow を参考にしました。

df_merged["price"] = df_merged.groupby("kind").apply(lambda x: x[["price"]].interpolate(limit_area="inside"))

3) prediction_length を意識する

最初、どのように未来の日付(過去の日付でも)の予測をするのか全然分かってなかったです。

デモの最後のグラフ「COVID Case Forecasts in France, compared to actual trajectory」では、予測と実際の値とを並べて表示しており、prediction_length はなんとなく予測精度確認の範囲指定かなと勘違いしてました。

実際は「予測したい範囲」を指定し、train_data を slice_by_timestep せずにpredictor.predict に渡した場合は最終データ以降の prediction_length が予測対象になります(たぶんこういう使い方なのかなと)

それ(正解か分かりませんが)に気づくまで、predictor.predict に何を渡せば・・・と試行錯誤していました。

イメージ図

4) 評価指標の選択

Quick Startでは TimeSeriesPredictor の eval_metric には MAPE が使われています。ただ、データによっては0除算になる場合があるようでエラーが発生したりしていました。

データを修正(欠損を埋めた部分などの修正)するのか、評価指標に他のものを選択するのかは結果を見ながらになると思いますが、評価指標の把握や選び方なども知っておく必要があります(参考

5) 利用可能な presets が限られている

fitを実行する際に presets を指定して性能や精度など何を重視するかを選択できます。
ただ、現状(2022.8.5時点)では「medium_quality」「low_quality」しか動作しないようでした。

ISSUE で Closed になっているようですが、Quick Start のコードで  best_quality を指定してもエラーになりました(0.6 release で直るのかな)
急ぐ人は Files changed 見ながら変更してもいいかもですね。

さいごに

今回上記のことに詰まりながらも独自データで予測までしてみたところ、それっぽくなってくれたので面白かったです。

気を付ける部分さえ分かれば、簡単にそれなりの精度のものが出せる(もしくは検証のサイクルを早くできる)のではと思いました。
特徴量も次元削減など気にせずに、一旦がんがん放り込んで回してみてもいいのではと少し雑な考えになってきたりもしてました(むしろAutoMLの使い方としては正しい?)

AutoGluonとしては出来ることが他にもあるので(画像、テキストなども)、それらも試してみても面白そうです。


この記事が気に入ったらサポートをしてみませんか?