Amazon Forecastで時系列予測を試してみた

記事タイトルとURLをコピーする

こんにちは、技術5課の長崎です。

今回、機械学習を使用して時系列予測をしてくれるAmazon Forecast(以降、Forecastと記載)を試しに使ってみました。

Amazon Forecastとは

インポートしたCSV形式の時系列データを機械学習を使用して予測を生成してくれます。 機械学習と書くと専門知識が必要で、ハードル高そうと思われるかもしれませんが、ForecastはAutoMLという複雑な機械学習タスクを自動化してくれる機能があるので結構お手軽に利用ができちゃいます。

前提

  • CSVファイルを保存するS3バケットは作成済み

やってみる

①時系列データの準備

CSV形式の時系列データを用意します。今回は、インターネットからダウンロードしてきた日毎のPCR検査数が記載されているCSVファイルを少し加工して使用します。Forecastでは使用するデータセットドメインに対してデータセットタイプが用意されており、記載が必要なフィールドがあります。 今回は、Customドメインを利用します。

参考資料①: 事前定義済みのデータセットドメインとデータセットタイプ - Amazon Forecast

f:id:swx-nagasaki:20201110114334j:plain

準備した時系列データをS3バケットへアップロードします。

②時系列データのインポート

「Create dataset group」から必要項目を入力していきます。

  • Forecasting domain→上記記載の「参考資料①」を確認の上、Customドメイン用にCSVファイルを構成したので「Custom」を選択しています。

f:id:swx-nagasaki:20201110191408j:plain

  • Frequency of your data→今回インポートするのは日毎のデータなので、ドロップダウンメニューで「day」を選択します。
  • Data schema→「AttributeName」には、CSVファイルに入力したターゲットフィールド名を入力、「AttributeType」には、それぞれのフィールドのデータ型を入力します。

f:id:swx-nagasaki:20201110192105j:plain

  • Timestamp format→CSVファイルのタイムスタンプの記載方式に合わせます。対応しているのは、「yyyy-MM-dd HH:mm:ss」or「yyyy-MM-dd」です。
  • IAM Role→事前に作成していなくても、ドロップダウンメニューで「Create a new role」を選択すれば自動で作成されます。
  • Data location→CSVファイルを保存したS3バケットのパスを入力します。

全て入力できたら、「Start import」を押下します。完了すると、状態が「Active」となります。

f:id:swx-nagasaki:20201110192929j:plain

③予測子のトレーニングモデル作成

予測する為のモデルを作成していきます。こちらの設定をする事により機械学習による予測の生成が可能となります。

  • Forecast horizon→予測する期間を入力します。
  • Forecast frequency→データセットのデータ取得頻度に合わせる必要があります。今回は日毎なので、[1day]とします。
  • Algorithm selection→なんのアルゴリズムを選択すべきか分からない場合は、[Automatic(AutoML)]を選択しましょう。Forecastが最適なアルゴリズムを選択してくれます。トレーニングに若干時間を要する部分はありますがこれを選択しておけば間違いはないでしょう。
  • Forecast dimensions(オプション)→デフォルトでは、必須カラムであるitem_idごとに予測されます。それ以外のカラムを指定している際はそのカラムで予測する事が可能です。
  • Country for holidays(オプション)→利用する国の祝日が適用されます。
  • NumberOfBacktestWindows→アルゴリズムがトレーニングと評価で使用するために入力データを分割する回数です。範囲は1-5が選択できます。
  • BackTestWindowOffset→モデルのトレーニングと評価のためにデータを分割するデータセット内のポイントです。[Forecast horizon]で入力した値以上、データセットのデータ数の半分以下の値を入力します。

f:id:swx-nagasaki:20201130221824j:plain

④予測の作成

  • Forecast name→任意の名前を記載します。
  • Predictor→作成済みの予測子を選択します。

f:id:swx-nagasaki:20201130223745j:plain

⑤予測結果を確認

  • Start date→データセットの終端日時~[Forecast horizon]で入力した値の日数分過去に遡る事ができます。
  • End date→データセットの終端日時~[Forecast horizon]で入力した値の日数分予測を確認する事ができます。

f:id:swx-nagasaki:20201130224755j:plain

⑥予測結果グラフの出力

色付きのグラフが予測データとなります。(黒い線はデータセットに取り込んだ過去のデータです)

  • P90 forecast(青の線)→実績の値が90%の確率でこの数値を下回るだろうという線です。需要が予想以上に多く、供給が間に合わないなどの状況を避けるならばこの値を参考にするべきでしょう。
  • P50 forecast(緑の線)→中央値です。実際の需要もこの数値に近くなる事が予想されます。需要に対して大幅なずれが発生しない事が予想される場合はこの値を参考にすると良いと思います。
  • P10 forecast(黄色の線)→実績の値が10%の確率でこの値を下回ると予想されます。需要の大幅な下振れが予想される場合はこの値を参考にすると良いと思います。

今回、PCR検査の実施数に対しての予測なので、[P10 forecast(黄色の線)]でグラフがマイナス域を示しているのはおかしいですね。。 マイナスにいかないように調整する事は可能なのかちょっと調べてみる必要がありそうです。

f:id:swx-nagasaki:20201130230045j:plain

まとめ

今回はお試しで時系列予測してみましたが、使いこなせればもっと正確な予測を出せるのではないかと感じました。 また、Lambdaなどと組み合わせる事で予測の自動化もできそうですね。時間があればやってみたいと思います。

長崎 将太 (執筆記事の一覧)

クラウドインテグレーション部