Amazon Forecastでお手軽に時系列予測

DA事業本部の貞松です。

ついにGAしました、Amazon Forecast。AWSの機械学習系サービス(Saas)の中でも待望の機能と言っても過言ではありません。
時系列予測が適用可能な問題は現実世界に溢れかえっています。高度な専門性を持っていなくてもこれらの問題を解決できるとしたら、それはどんなに素晴らしいことでしょう。

DevelopersIOでも既にForecastの記事が幾つか投稿されていますが、本記事では、制限事項やパラメータの見方など、少し細かいところを補足しつつ手順をまとめていきます。

データ資産を活用しビジネスを加速させるAI -Amazon Forecast-

Amazon Forecastのサンプルを動かして時系列予測してみた

前置きが長くなりました。時系列予測、早速やっていきましょう。

Forecastの利用方法

Forecastを利用する方法としては、以下の3種類があります。

  • コンソール
  • AWS CLI
  • Jupyter Notebook

本記事では、コンソールからの利用手順をベースに解説していきます。

コンソールからForecastを利用する手順

コンソールからForecastを利用する場合は以下の手順で実施します。

  1. 時系列データのインポート
  2. 時系列予測モデル(予測子)のトレーニング
  3. 予測子のメトリクスを確認
  4. 時系列予測の実行
  5. 予測結果の確認(可視化・エクスポート)

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

Forecastで扱うデータの形式について

Forecastで扱うデータはデータセットグループとそれに含まれるデータセットで構成されます。

データセットグループは対象データのドメインを設定することができ、設定したドメインによって必要とするデータセットの形式が変わります。

選択可能なデータドメインは以下の通りです。

  • RETAIL – 小売の需要予測
  • INVENTORY_PLANNING – サプライチェーンとインベントリの計画
  • EC2 CAPACITY – Amazon Elastic Compute Cloud (Amazon EC2) キャパシティの予測
  • WORK_FORCE – 従業員の計画
  • WEB_TRAFFIC – 今後のウェブトラフィックの見積もり
  • METRICS – 収益およびキャッシュフローなどの予測メトリクス
  • CUSTOM – その他すべての時系列予測のタイプ

データセットグループに含まれるデータセットタイプは以下の3タイプです。

  • TARGET_TIME_SERIES (必須)
    • データが時系列で、かつ予測を生成するフィールド(ターゲットフィールド)が含まれているデータを格納します。
  • RELATED_TIME_SERIES (オプション)
    • データは時系列であるが、ターゲットフィールドを含まないデータを格納します。
  • ITEM_METADATA (オプション)
    • データが時系列ではなく、データセットの項目に関するメタデータを格納します。

必須のデータセットはTARGET_TIME_SERIESで、他2つは必要に応じて任意で設定します。
各データセットで必須となるデータカラムについては、上述のデータドメインによって変わる為、詳細はAWS公式ドキュメントにてご確認ください。

Amazon Forecast 開発者ガイド:事前定義済みのデータセットドメインとデータセットタイプ

また、インポートデータはS3バケットに配置する必要があり、ファイル形式としてはCSVファイル(拡張子.csv)のみとなっています。

対象となる時系列データをS3にアップロード

上述のルールに従って準備したデータを一旦S3にアップロードします。

今回は公式のドキュメントでも使用されているUCI Machine Learning リポジトリ(http://archive.ics.uci.edu/ml)で公開されている電力利用量データを用います。

以下のリンクからZIPファイルをダウンロードできます。

electricityusagedata.zip

電力利用量データは以下のような形式となっています。

  • データカラム
    • 利用時間(1時間毎)
    • 電力利用量
    • クライアントID
  • データ期間
    • 2014-01-01 01:00:00 〜 2015-01-01 00:00:00
    • 3,241,200 レコード

以下はデータセットのサンプルです。

2014-01-01 01:00:00,   2.53807106598985, client_0
2014-01-01 01:00:00, 23.648648648648624, client_1
2014-01-01 02:00:00,  9.648648648612345, client_0

データセットグループの作成

ここからはAWSマネジメントコンソール上で順番に操作していきます。

Forecastの画面を開いて Create dataset group をクリックします。

  • Dataset group Name
    • インポートするデータセットのグループ(上述のデータセット群 TARGET_TIME_SERIES RELATED_TIME_SERIES ITEM_METADATA をひとまとめにしたもの)に任意の名称を付けます。
    • データセットグループ名にはハイフン(-)が使えないので、単語のセパレーターはアンダースコア(_)を使いましょう。
  • Forecasting Domain
    • 上述のデータドメインから一つを選択します。
    • ここでは CUSTOM を選択します。

NEXT をクリックして、問題なければデータセットグループの作成は完了です。

データセットの作成とデータインポート

データセットグループの作成が完了すると、矢継ぎ早にデータセットの作成画面に遷移します。 ここで作成するのは、必須のデータセットである TARGET_TIME_SERIES です。

タイムスタンプのフォーマット、対象のS3バケットからデータを読みだす為のIAMロール指定、対象データのS3パス指定。

  • Dataset Name
    • データセットに任意の名称を付けます。
    • データセットグループと同じく、データセット名にはハイフン(-)が使えないので、単語のセパレーターはアンダースコア(_)を使いましょう。
  • Frequency of your data
    • 時系列データの刻み幅を選択します。
      • minutes
      • hour
      • day
      • week
      • month
      • year
    • 電力利用量データは1時間毎のデータなので、ここでは (1)hour を選択します。

  • Data schema
    • インポートするデータのカラム順に応じて、必須カラムのスキーマ定義を書き換える必要があります。
    • 必須カラム以外に学習データに含めたいカラムがある場合は定義を追記します。
    • 電力利用量データは、カラム順が 利用時間(timestamp) 電力利用量(target_value) クライアントID(item_id) となっている為、デフォルトの定義から以下のように書き換える必要があります(スキーマ定義と実際のデータがアンマッチだとエラーになります)

NEXT をクリックして、問題なければデータセットの作成が完了し、データインポート画面に遷移します。

  • Dataset import name
    • データセットにインポートされるデータに任意の名称を付けます。
    • 同一データセットに他のデータをインポートした際に識別する為のラベルという位置付けになります。
    • ハイフン(-)が使えないので、単語のセパレーターはアンダースコア(_)を使いましょう。
  • Timestamp format
    • スキーマ定義のtimestampに該当するカラムのフォーマットに合わせて入力します。
  • IAM Role
    • インポートするデータのファイルが配置されたS3バケットにアクセスする為のIAMロールを指定します。
    • 作成済みの場合はそのロールを選択します。
    • 未作成の場合は Create a new role から新規作成します。権限のレベルを以下2パターンから選択できます。
      • Any S3 bucket: 該当アカウントの全てのS3バケットに対する読み取り権限
      • Specific S3 buckets: 特定のS3バケット読み取り権限(データファイルを配置したバケットを選択する)
  • Data location
    • S3に配置したデータファイルのパスを入力します。
    • s3:// から始まり 〜.csv まで入力します。

Start import をクリックして、問題なければデータのインポートが開始します。

時系列予測モデル(予測子)のトレーニング

データのインポートが完了すると、Target time series dataがActiveになり、Predictor trainingのStartボタンが有効になるので、こちらをクリックします。 (Item metadata dataやRelated time series dataは任意のデータセットなので、今回は使用せずに時系列予測を実行します)

  • Predictor name
    • 予測子(時系列予測の学習モデル)に任意の名称を付けます。
    • ハイフン(-)が使えないので、単語のセパレーターはアンダースコア(_)を使いましょう。
  • Forcast horizon
    • この予測子を使って、どれくらい先まで予測するかを設定します。
    • 設定値の単位はデータセットのFrequency(刻み幅)によって変わります。
    • 電力利用量データは1時間毎のデータなので、 48 と入力すると、学習データの末端から48時間後までの1時間毎の電力利用量を予測することになります。
  • Forecast Frequency
    • 予測値の刻み幅の単位を選択します。
    • 電力利用量データは1時間毎のデータなので (1)hour を選択します。
  • Algorithm selection
    • 予測子の学習に使用するアルゴリズムを選択します。
    • Automatic (AutoML)
      • Forecastのストロングポイントの一つ。
      • 学習する時系列データに応じて、最適なアルゴリズムを自動で選択してくれます。
      • 余程意図的(ある程度あたりがついている、アルゴリズムごとの比較がしたい、など)でない限りはこれを選択するのが良いです。
    • Manual

以降の設定はoptionalなので、設定しなくても予測を実行することはできます。

  • Forecast dimensions
    • 予測の対象となるデータセットに必須カラムしか含まれていない場合は自動的にitem_idごとの予測を生成することになります(この場合はドロップダウンで項目を選択することはできません)
    • 必須カラム以外のカラムをインポートしている場合は、item_idの代わりにそれらのカラムを予測対象として選択することができます(この場合はドロップダウンから予測対象にするカラムを選択します)
  • Country for holidays
    • 日単位の時系列データに対する予測を行う場合、祝日の要素が絡んできます。
    • 対象データが発生した国を選択することで、その国の祝日を考慮した予測を行うことができます。
  • Number of backtest windows
    • インポートされた時系列データから学習済みモデルの検証用データを幾つ分割するか(切り出すか)を設定します。
    • 設定値の範囲は1〜5です。
  • Backtest window offset
    • 学習済みモデルの検証用データをインポートされた時系列データから切り出す際に、データの末端から何件のデータを切り出すかを設定します。
    • 設定値は、Forecast horizonに設定した値以上、インポートされた時系列データ件数の半分以下の範囲で設定する必要があります。

Train predictor をクリックすると予測子の作成(予測モデルの学習)が開始します。
※ちなみにこの予測子の作成が一番時間が掛かります。

予測子のメトリクスを確認

Predictorsの画面でトレーニング済みの予測子を選択します。

予測子の確認画面では、設定値やメトリクスを確認することができます。 例えば、画面の上部にある情報から、AutoMLを使用した結果、学習アルゴリズムとしてNPTS(ノンパラメトリック時系列)が選択されていることを確認できます。

メトリクスでは、予測データとテストデータのRMSE(二乗平均平方根誤差)やwQL(weighted Quantile Loss: 重み付けされた分位損失)などの指標が表示されており、テストデータに対する予測データの精度を確認することができます。

メトリクスはEvaluation typeがSUMMARY(backtest windowsの平均)とCOMPUTED(特定のbacktest windowの結果)の2種類表示されます。
(今回は予測子のトレーニング時の設定でNumber of backtest windowsを1に設定している為、両方同じ結果が表示されています)

Amazon Forecast 開発者ガイド:予測子のメトリクス

時系列予測の実行

予測子の作成が完了するとPredictor trainingがActiveになり、Forecast generationのStartボタンが有効になるのでこちらをクリックします。

  • Forecast name
    • 作成する予測に任意の名称を付けます。
    • ハイフン(-)が使えないので、単語のセパレーターはアンダースコア(_)を使いましょう。
  • Predictor
    • 作成済みの予測子を選択します。

Create a forecast ボタンをクリックして予測の作成を開始します。

予測結果の確認

予測結果の確認方法として、コンソール上で指定した期間のグラフを生成して可視化する方法と予測データ全体をCSVファイルとしてS3にエクスポートして、あとはユーザー側でよしなにする方法の2パターンがあります。

コンソール上で可視化

予測の実行が完了後、Generate forecastsの Lookup forecast ボタンをクリックします

  • Forecast
    • 作成済みの予測を選択します。
  • Start date
    • グラフに表示するデータ期間の開始日時を設定します。
    • データセットの終端の日時から、予測子作成時に設定したForcast horizonの分だけ過去の日時を指定できます(ややこしい)
    • データセットの終端の日時: 2015-01-01 00:00:00
    • Forecast horizon: 48(hours)
    • 2014/12/30/01:00:00〜2015-01-01 00:00:00の間で設定可能
  • End date
    • グラフに表示するデータ期間の終了日時を設定します。
    • データセットの終端の日時以降で、予測子作成時に設定したForcast horizonの分だけ未来の日時を指定できます(こちらもややこしい)
    • データセットの終端の日時: 2015-01-01 00:00:00
    • Forecast horizon: 48(hours)
    • 2015/01/01/01:00:00〜2015-01-03 00:00:00の間で設定可能
  • Forecast key
    • データセットの予測対象のカラムを選択します。
    • データセットに必須カラムしか含まれていない場合は item_id 固定になります。
    • データセットのスキーマに必須カラム以外に予測対象となるカラムが含まれる場合はここで選択します。
  • Value
    • データセットの予測対象カラムに対して、実際にグラフ化する対象のデータ(区分)を指定します。
    • 電力利用料データの場合は、予測対象カラム(item_id)が、電力利用者のクライアントIDとなっているので、任意のクライアントIDを入力します。

必要な設定を入力後、 Get Forecast をクリックするとグラフが生成されます。

表示されるグラフの種類は以下の通りです。

  • Target value
    • 予測に使われた実績データ(今回の設定では、データセットの終端から直近の24時間分)
    • 直近の実績データから、どのように予測データに繋がっていくのかという一連の動きを確認できます。
  • P10 Forecast
    • 10パーセンタイル予測
    • 予測値全体に占める10%より低くなることが予想されます。
    • 予測に対する実績が下振れすると困るようなドメインのデータについては、この値を確認する必要があります。
  • P50 Forecast
    • 50パーセンタイル予測
    • いわゆる中央値
    • 一般的に予測値という場合はこの値のことを指します。
  • P90 Forecast
    • 90パーセンタイル予測
    • 予測値全体に占める90%より低くなることが予想されます。
    • 予測に対する実績が上振れすると困るようなドメインのデータについては、この値を確認する必要があります。

予測データをエクスポート

Forecastsのページで対象の予測を選択します。

Exportsセクションにある Create forecast export をクリックします。

  • Export name
    • エクスポートに任意の名称を付けます。
    • 前述のExportsセクションに一覧表示される際のラベルです。
    • ハイフン(-)が使えないので、単語のセパレーターはアンダースコア(_)を使いましょう。
  • Generated forcast
    • 作成済みの予測を選択します。
  • IAM Role
    • ファイルをS3にエクスポートする為、必要な権限を持ったロールを選択します。
  • S3 forecast export location
    • エクスポート先のS3パスを入力します。
    • データファイルはCSVファイルですが、その他メタデータ的なファイルが幾つか含まれたファイルのセットとして出力される為、ここではファイル名までではなくディレクトリ名までで指定します。

Create forecast export をクリックするとエクスポートが開始します。

Exportsの一覧でStatusがActiveなったらエクスポート完了です。

指定したS3パスの中身を確認すると、以下のように幾つかのファイルが出力されていることを確認できます。 エクスポートした予測データの実体は part- から始まって c000.csv で終わるCSVファイルです。

CSVファイルをダウンロードして、中身を確認すると、以下のようなスキーマで全ての予測データが出力されていることを確認できます。

  • item_id
  • date
  • p10
  • p50
  • p90

あとはこのデータをDBに取り込んだり、BIツールと接続したりすることで、よしなに扱うことができそうです。

まとめ

データの下準備やパラメータ設定等々、それなりに理解しておくべきことはあるものの、自力で作成・実行するのに比べれば非常に簡単に時系列予測を実行することができました。

実戦投入するには、以下のような本記事でカバーしきれていない部分の検証も必要になりますが、こちらについても順次まとめていきたいと思います。

  • AWS CLIやJupyter Notebookからの操作
  • 各学習アルゴリズムの比較やハイパーパラメータ最適化
  • Forecastに関する制限事項
  • RELATED_TIME_SERIESやITEM_METADATAが揃ったデータセットグループでの予測
  • 必須カラム以外のカラムを含むデータセットを使用した予測
  • 1時間単位以外のFrequency(1週間単位や1日単位)のデータセットを使用した予測

冒頭でも述べた通り、時系列予測が適用可能な問題は現実世界に溢れかえっているので、少しでもそういった問題を解決する糸口になれば幸いです。