予測生成、モデル比較を簡単に!

「Improving Forecast Accuracy with Machine Learning」を試してみる

2023-03-02
AWS ソリューション紹介

松永 大河 (監修 : 山澤 良介)

みなさん、こんにちは。Professional Services Consultant の松永大河です。

みなさんは、「AWS ソリューションライブラリ」ご存知でしょうか。この AWS ソリューションライブラリでは、すぐにお客様の課題に対応できるよう導入までの手順や AWS CloudFormation のテンプレート等を含めた AWS ソリューション実装 というリファレンスとなる実装パターンが多数掲載されています。

今回は、これらのソリューションの中から「Improving Forecast Accuracy with Machine Learning (機械学習を使用して予測の精度を向上)」という Amazon Forecast の予測生成のサイクルを自動化することができるソリューションをご紹介します。このソリューションをベースとして担当者に合わせたカスタマイズを行うことで、担当者の負担を減らしながら短期間でモデルの精度の向上を行うことが可能になります!Amazon Forecast を利用しているお客様には是非とも利用を検討していただきたいソリューションです。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

この記事のデモを無料でお試しいただけます »

毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。 

それでは、ここから本ソリューションの実際の構築方法や使い方を見ていきますが、その前に Amazon Forecast とはどのようなサービスなのか、なぜこのソリューションが有用なのかについてご説明いたします。

本ソリューションの内容をすぐに知りたい!という方は こちらのセクション からお読みください。


ソリューションを理解する

Amazon Forecast とは

Amazon Forecast は、Amazon.com で利用されている機械学習予測技術を利用し、時系列予測を行うことができるサービスです。サーバ管理や機械学習アルゴリズムなどについては AWS が用意しているフルマネージドなサービスであるため、機械学習の経験がない方でも数クリックで時系列予測を行うことができます。

Amazon Forecast を利用する際の基本的な手順は以下のスライドのようになります。

より詳細な手順を記載すると以下のようになります。

  1. データセットを S3 へ配置
    Amazon Forecast はモデルを学習する前にデータセットを Amazon Forecast が持つストレージにインポートします。そのため、事前に S3 にデータセットとして CSV ファイルを配置しておく必要があります。
  2. データセットグループを作成
    データセットグループとは複数のデータセットを管理する項目です。データセットグループではデータセットの他に、そのデータセットから学習した予測も管理されます。
  3. データセットの作成
    1. データセットを S3 からインポート
      手順 1 で S3 に配置したデータセットを Amazon Forecast のデータセットグループにインポートします。
    2. 学習の設定
      使用するデータセットのスキーマやデータセットの時系列の間隔など、学習のための設定を行います。
  4. モデルの学習 (予測子の作成、実行)
    手順 3 でインポートしたデータセットや作成した設定をもとに、機械学習モデルの学習を行います。
  5. 予測の作成
    学習結果から予測を作成します。
  6. 結果の確認
    予測をクエリ / エクスポートすることで結果を確認できます。

そのほかの Amazon Forecast の詳細については、AWS Summit の動画Blackbelt の資料をご確認ください。

Amazon Forecast の予測精度を向上させるためにはデータセットやハイパーパタメータを変更するなどの試行を行う必要があります。しかし、モデルの学習、テスト、可視化の一連の予測生成の手順を繰り返し手作業で行うのは骨が折れます。特に、モデルの学習や予測の作成には待ち時間が発生するのですが、手順が終了したかどうかをいちいちマネジメントコンソールを見に行くのは非常に大変、ということは共感いただけるのではないでしょうか。

そんな時に活躍するのが本ソリューションです!

「Improving Forecast Accuracy with Machine Learning」ソリューションとは

「Improving Forecast Accuracy with Machine Learning」ソリューションを使用することで、データセットのアップロード、予測の生成、結果の視覚化の一連のプロセスを自動化することができます。具体的には、Amazon Simple Storage Service (Amazon S3) にデータセットをアップロードすると、Amazon Forecast による学習が自動的に始まります。そして学習が終了すると Amazon SNS から登録したメールへ通知が届きます。さらに、準備されている Amazon SageMaker のノートブックで結果を可視化することができます。つまり、Amazon Forecast を実行するための詳細な手順 (前章に記載) のうち、手順の 2 ~ 6 を自動化することが可能です!

このソリューションでは、設定ファイルを利用するデータセットと一緒に S3 にアップロードすることで予測やパラメータ設定の管理が可能です 。これにより、複数の予測生成の繰り返し作業を軽減でき、開発者やデータサイエンティストが予測の精度に集中できます。

この他にも Amazon Simple Notification Service (Amazon SNS) を介した自動予測ジョブの成功 / 失敗の通知や Amazon QuickSight, Jupyter Notebook を用いた予測の可視化を提供します。

言い換えると、Amazon S3 にデータセットと設定ファイルをアップロードするだけで、担当者は機械学習モデルの作成することができます!

ソリューションで扱う AWS サービス

AWS CloudFormation テンプレートを使用すると、Amazon Forecast の予測を行うためのサーバレス環境を簡単に構築することができます。

ソリューションの機能に基づいて、アーキテクチャはデータの準備、予測、データの視覚化といった 3 つの部分に分かれます。テンプレートには、次のコンポーネントが含まれています。

  1. データセットグループ、データセット予測子、予測、およびデータセットの構成設定で指定する、Amazon Forecast 構成用の Amazon S3 バケット
  2. 新しいデータセットが Amazon S3 バケットにアップロードされたときにトリガーされる Amazon S3 イベント通知
  3. Amazon Forecast の学習プロセスを自動化し、継続的に精度を向上するための AWS Step Functions ステートマシン
    これは、Amazon Forecast で機械学習モデルを構築、トレーニング、およびデプロイする一連の AWS Lambda 関数を組み合わせたものです。Amazon CloudWatch にログを記録します。
  4. AWS Step Functions の結果を管理ユーザーに通知する Amazon Simple Notification Service (Amazon SNS) の E メールサブスクリプション
  5. データサイエンティストとデベロッパーがデータの準備と処理、および Amazon Forecast の出力の評価に使用できる Amazon SageMaker ノートブックインスタンス
  6. 生の予測入力データ、メタデータ、予測子のバックテストエクスポート、および予測エクスポートを組み合わせて、予測の集計ビューを生成するための AWS Glue ジョブ
  7. 標準の SQL クエリを使用して予測出力をクエリするための Amazon Athena
  8. 予測されたアイテムの階層とカテゴリにわたる予測出力の視覚化、およびアイテムレベルの精度メトリクスをユーザーに提供するための Amazon QuickSight 分析
    ダッシュボードを作成することで、QuickSight 分析を共有することが可能です。

ソリューションをデプロイする

本セクションでは本ソリューションのデプロイ方法を解説します。今回実施する手順の流れは以下となります。

Step 0 : 使用するファイル (設定ファイル、データセット) のダウンロード
Step 1 : AWS CloudFormation スタックの作成 (ソリューションのデプロイ)
Step 2 ~ 4 : 設定ファイル、データセットのアップロード (ソリューションを利用し予測を作成)
Step 5 : 設定ファイル、更新したデータセットのアップロード (Step 2 ~ 4 で作成したものとは異なる条件で予測を作成)
Step 6 : 結果の確認

Step 0 : 使用する設定ファイル、デモデータのダウンロード

公式のソースコードを GitHub リポジトリからクローンします。

git clone https://github.com/aws-solutions/improving-forecast-accuracy-with-machine-learning.git

今回検証のために、このリポジトリに含まれているデータセットを使用します。データセットは、source/example/data/ フォルダに格納された CSV ファイルです。

また、Amazon Forecast の設定ファイルとして forecast-defaults.yaml を使用します。前文のリンクをクリックし、ダウンロード後、zip ファイルを解凍してください。

クリックすると拡大します

Step 1 : AWS CloudFormation スタックの作成

それでは早速、AWSソリューションをデプロイしていきましょう!

本ソリューションにて使用する CloudFormation テンプレートを実行するために、Improving Forecast Accuracy with Machine Learning のランディングページにアクセスします。

AWS コンソールで起動する」を選択します。

クリックすると拡大します

CloudFormation が起動されて、「スタックの作成」画面が表示されます。

デフォルトではバージニア北部リージョンで AWS CloudFormation が起動し、ソリューションが展開されます。

東京リージョンでデプロイしたい場合は、右図右上の「バージニア北部」と記載があるプルダウンメニューをクリックし、リージョンを「東京」に切り替えてください。

そのほか、このソリューションは Amazon Forecast が利用可能なリージョンのみでデプロイできます。
AWS リージョン別の利用状況に関する最新情報については、AWS のリージョン別のサービス表をご参照ください。

「前提条件 - テンプレートの準備」、「テンプレートの指定」は変更せずにそのまま「次へ 」を選択します。

クリックすると拡大します

スタックの詳細を設定」画面で以下の設定を行います。

  • スタックの名前」について、任意の名前 (例 : forecast-demo-stack) を入力
  • パラメータ」について、
    • Notification Configuration」に通知を受け取りたいメールアドレスを入力
    • Visualization Options」で、「Deploy Jupyter Notebook」を「Yes」に変更
    • Forecast Configuration」で、「Forecast Name」に任意の名前 (例 : forecast_demo) を入力

上記の設定をおこなった後、右下の「次へ」をクリックします。

【参考】
Amazon QuickSight の Enterprise Edition 以上のプランに登録している場合は結果の可視化に Amazon QuickSight の使用も可能です。

※その他パラメータの詳細については、実装ガイド P. 17 〜 P. 19 をご覧ください。

クリックすると拡大します

スタックオプションの設定」画面では何も変更せず右下の「次へ」をクリックします。

レビュー」画面で、AWS CloudFormation のパラメータが指定した値で設定されていることを確認します。

その後、下へスクロールし、「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」および「AWS CloudFormation によって、次の機能が要求される場合があることを承認します : CAPABILITY_AUTO_EXPAND」の2つのチェックボックスにチェックを入れ、「スタックの作成」をクリックします。

クリックすると拡大します

スタックの作成が成功し、ステータスが「CREATE_COMPLETE」に変化したことを確認します。

作成完了までに5分程度かかります。

クリックすると拡大します

Step 2 : Amazon Forecast の設定ファイルをアップロード

スタックの「出力」タブをクリックします。すると、出力として 3 つの S3 バケットの BucketName が出力されていることが確認できます。

このうち、キーが「ForecastBucketName」であるバケットの出力の値をコピーします。コピーする値は「YOUR_STACK_NAME-data-bucket-XXXXXXXXXXXX」といったフォーマットになっているはずです。

ここで、YOUR_STACK_NAME は Step 1 で決定したスタック名を表しています。

クリックすると拡大します

Amazon S3 のマネジメントコンソール画面 にアクセスし、検索フィールドに先程コピーした BucketName の値入力し、対象の S3 バケットを選択します。

初期状態では、オブジェクトは「glue/」フォルダのみとなっています。こちらに Amazon Forecast の設定ファイルをアップロードするため、「アップロード」をクリックします。

クリックすると拡大します

Step 0 でダウンロードした forecast-defaults.yaml をアップロードします。

その後、右図のようにアップロードが完了したことを確認します。

設定ファイルの中で、Amazon Forecast の予測子を設定することができます。今回予測子は AutoPredictor を使用しております。AutoPredictor では複数のアルゴリズムで学習を行い、最も性能の良いアルゴリズムでの結果を出力することができます。

クリックすると拡大します

ここで、上記の設定ファイル (forecast-defaults.yaml) について解説をしたいと思います。こちらのファイルでは 2 つの設定がなされています。「Default:」から始まる設定と、「retail_experiment_2:」から始まる設定です。それぞれが Amazon Forecast を実行するための設定になっています。ここでは「Default:」から始まる設定について解説します。

上記の設定ファイルは、今回利用するサンプルデータセットに対する設定となっております。この設定ファイルを実際のデータセットに合わせて変更することによって、このソリューションをあらゆるデータセットに適応させることが可能になります

Step 3 : データセットをアップロード

まず、データセットをアップロードするためのフォルダを Amazon S3 に作成します。

先ほど設定ファイルをアップロードしたバケットと同じバケットにおいて、「フォルダの作成」をクリックします。

フォルダ名」に「train」と入力し、右下の「フォルダの作成」をクリックします。

クリックすると拡大します

では、データセットをアップロードします。

まずは、Amazon Forecast の学習に最低限必要なデータセット (目的変数を含むデータセット) のみをアップロードし、学習を行なってみます。

Step 0 でクローンしたリポジトリに含まれる、source/example/data/demand.csv を S3 バケットの「train/」フォルダにアップロードします。

その後、右図のようにアップロードが完了したことを確認します。

Amazon Forecast では、「ターゲット時系列」「関連時系列」「項目メタデータ」の 3 種類のデータセットを利用することができます。これらのうち、「ターゲット時系列」データセットは必須であり、今回は demand.csv をターゲット時系列データセットとして用います。

クリックすると拡大します

今回利用するターゲット時系列データセットはこのようになっております。

データセットの各列は、左から「アイテム名」「タイムスタンプ」「アイテムの需要」となっています。今回はこれらの列のうち「アイテムの需要」を予測対象とするモデルを作成しています。このように、予測対象のフィールドはターゲット時系列に含める必要があります。

クリックすると拡大します

Step 4 : Step Functions による学習プロセス自動化の確認

データセットがアップロードされたことをトリガーとして、AWS Step Functions のステートマシンが動作します。

ステートマシン実行の様子を確認してみましょう。

AWS Step Functions のマネジメントコンソール画面にアクセスし、「YOUR_STACK_NAME-forecast-workflow-XXXXXXXXXXXX」といったフォーマットになっているステートマシンの名前をクリックします。

クリックすると拡大します

名前が「demand_target_time_series_XXXXXXXX」といったフォーマットになっている実行の名前をクリックします。

クリックすると拡大します

すると、ステートマシンの実行の様子を確認できます。
エラーが起きなかった場合のステートマシンの実行フローを簡略化したものを以下に記載します。

  1. Amazon Forecast データセットグループとデータセットを作成
  2. Amazon Forecast で使用する予測子を作成
  3. Amazon Forecast の予測の作成
  4. Amazon Forecast の予測とバックテストデータを Amazon S3 へエクスポート
  5. AWS Glue の ETL 処理で使用するテーブルを作成
  6. AWS Glue ジョブで予測の入力データを集約し Amazon S3 へエクスポート
  7. Amazon SNS 通知を送信

詳細なワークフローについては実装ガイド P. 10 〜 P. 12 をご覧ください。

クリックすると拡大します

【参考】
Step Functions の実行には時間がかかる場合があります。私の場合だと、初回の実行に 2 時間程度かかりました。多くの場合、2 回目以降の実行では時間が短縮されます。

Step 5 : データセット、アルゴリズムを変更し、予測プロセスを実行

Step 3 とは異なったデータセット、アルゴリズムを使用して Amazon Forecast の予測を行ってみましょう。

まず、Step 0 でクローンしたリポジトリに含まれる、source/example/data/ フォルダに格納されている3つの CSV ファイルの名前を以下のように変更します。

  • demand.csv → retail_experiment_2.csv
  • demand.metadata.csv → retail_experiment_2.metadata.csv
  • demand.related.csv → retail_experiment_2.related.csv

CSV ファイルの名前を変更する理由は、AWS Step Functions のステートマシンがこの CSV ファイルの名前を参照して Amazon Forecast の Dataset Group を作成するからです。また、変更先のフォルダ名は Amazon Forecast の設定ファイルである forecast-defaults.yaml で指定したデータセットの名前 (31 行目) と一致していなければなりません。

今回の予測では、forecast-defaults.yaml の 31 行目 (retail_experiment_2:) 以降の設定が使用されます。

Amazon S3 のマネジメントコンソール画面から、Step 3 の時と同じ S3 バケットを開き、「train/」フォルダをクリックします。

クリックすると拡大します

上記の 3 つの CSV ファイルを train フォルダにアップロードします。

【参考】
CSV ファイルを同時にアップロードすることで、同時に複数のデータセットの学習を行うことができますが、まれに学習が失敗することがあります。その際には再度 S3 の train フォルダに CSV ファイルをアップロードしてください。

retail_experiment_2.metadata.csv, retail_experiment_2.related.csv はそれぞれ、「項目メタデータ」「関連時系列」データセットです。これらのデータセットを追加することで Amazon Forecast の予測精度を向上させることができる可能性があります。

クリックすると拡大します

右図は、今回利用する項目メタデータデータセットです。

データセットの各列は、左から「アイテム名」「カテゴリ名」「ブランド名」となっています。項目メタデータでは静的な情報をモデルの学習に反映することができます。結果としてどの特徴量がより重要であるかをモデルが学習する際の助けになります。

クリックすると拡大します

右図は、今回利用する関連時系列データセットです。

データセットの各列は、左から「アイテム名」「タイムスタンプ」「関連データ」となっています。関連時系列では、予測したいデータに連動する可能性が高い時系列データを使用します。また、時間間隔は予測を生成する時間感覚と同じである必要があります。

クリックすると拡大します

そのほか、項目メタデータ、関連時系列データセットの詳細については以下をご覧ください。

Step 6 : 予測結果の確認

ステートマシンの実行フローが終了したら、予測結果を確認していきましょう。

Step 3, 4 で作成した予測と Step 5 で作成した予測の結果を Jupyter Lab 上で並べて比較を行います。

Amazon SageMaker のマネジメントコンソール画面にアクセスし、画面左側のメニューから「ノートブック」タブを開き、「ノートブックインスタンス」をクリックします。

クリックすると拡大します

画面右側の「JupyterLab を開く」をクリックします。

クリックすると拡大します

画面左のファイルツリーにおいて、/improving-forecast-accuracy-with-machine-learning/v1.5.2/notebooks/SampleVisualization.ipynb をダブルクリックして開きます。

【参考】
本ブログ執筆時点 (2023 年 2 月時点) での本ソリューションのバージョンは v1.5.2 ですが、今後バージョンアップすることが予想されます。それに伴い、ノートブックが格納されるフォルダ名のバージョンも変更されると予想されます。

1つ目のセルを次のように書き換えます。
ここで、yyyy_MM_dd_HH_mm_ss はフォルダが作成された年月日時刻を表しています。
また、yyyy-MM-ddTHH-mm-ssZ はファイルが作成された年月日時刻を表しています。

# Set the start and end dates of the forecast
start_date = '2014-09-01' # YYYY-MM-DD
end_date = '2015-02-01' # YYYY-MM-DD

# provide the full CSV name uploaded to the /train folder in S3
demand_dataset_name = 'retail_experiment_2.csv'
related_dataset_name = 'retail_experiment_2.related.csv'

# provide the exports to show from the export/ folder in S3 (these are created by Amazon Forecast)
forecast_exports = [
    {
    'path': 'export_ap_demand_yyyy_MM_dd_HH_mm_ss/export_ap_demand_yyyy_MM_dd_HH_mm_ss_yyyy-MM-ddTHH-mm-ssZ_part0.csv',
    'name': 'Forecast 1 - Predictor: AutoPredictor, Use 1 Dataset'
    },
    {
    'path': 'export_ap_retail_experiment_2_yyyy_MM_dd_HH_mm_ss/export_ap_retail_experiment_2_yyyy_MM_dd_HH_mm_ss_yyyy-MM-ddTHH-mm-ssZ_part0.csv',
    'name': 'Forecast 2 - Predictor: AutoPredictor, Use 3 Dataset'
    }
]

Amazon Step Functions のステートマシンの実行により、Step 2 で Amazon Forecast の設定ファイルを格納した S3 バケットに exports/ フォルダが作成されます。

exports/ フォルダ配下には、予測毎に 2 つのフォルダが作成されており、その 2 つの内フォルダ名が「export_ap」から始まるフォルダには CSV ファイルが出力されています。こちらのファイルの exports/ フォルダから見た相対パスを上記コードブロックの 12 行目 'path' の値に置き換えて下さい。

このとき、12 行目の 'path' には export_ap_demand から始まるフォルダ内の CSV ファイル、16 行目の 'path' には export_ap_retail_experiment_2 から始まるフォルダ内の CSV ファイルの相対パスを記載してください。

クリックすると拡大します

上記設定後全てのセルを実行します。

すると右図のように予測を可視化することができます。

上のグラフが Step 3 〜 4 の予測、中央のグラフが Step 5 の予測、下のグラフが関連する時系列データです。

このように、複数の予測結果を視覚的に比較することが可能です。

クリックすると拡大します


リソースの削除方法

スタックの削除

AWS CloudFormation のコンソールに移動し、作成したスタックを削除します。

Amazon S3 Backet の削除

Amazon S3 のコンソールに移動し、以下の Backet を削除します。

  • YOUR_STACK_NAME-data-bucket-XXXXXXXXXXXX
  • YOUR_STACK_NAME-athenabucket-XXXXXXXXXXXX
  • YOUR_STACK_NAME-accesslogsbucket-XXXXXXXXXXXX

作成した Forecast の削除

Amazon Forecast のコンソールに移動し、Dataset Groups を開きます。
Step 3, Step 5 において、「 train/」フォルダに配置したファイル名と同じ名前の Dataset Group を削除します。
例えば、「train/」フォルダに demand.csv というファイルを配置していた場合、「demand」という Dataset Group を削除します。

Amazon CloudWatch Logs のロググループの削除

Amazon CloudWatch のコンソールに移動し、ロググループを開きます。
/aws/lambda/YOUR_STACK_NAME-」から始まるロググループを全て削除します。

まとめ

今回の記事では、「Improving Forecast Accuracy with Machine Learning」ソリューションの概要や使い方をご紹介しました。AWS CloudFormation をデプロイし、設定ファイルを作成することで Amazon Forcast の予測生成のサイクルを自動化することができる環境を構築することができます。

さらに、今回扱うことはできませんでしたが、Amazon Forecast の設定ファイルを変更することでお客様のデータに合わせた予測生成のサイクルを簡単に構築することもできます。こちらについては実装ガイドに記載がありますので興味のある方はぜひそちらも試してみてください!

本ソリューションが Amazon Forecast の環境構築を行う際の助けとなれば幸いです。


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

松永 大河 (Taiga Matsunaga)
アマゾン ウェブ サービス ジャパン合同会社
プロフェッショナルサービス コンサルタント

2022 年 4 月に新卒として入社したプロフェッショナルサービスコンサルタントです。普段は公共分野のお客様にコンサルティングサービスを提供しております。ブロックチェーン技術を用いた分散型アプリ開発が好きです。長崎出身なのでたまに海に還りたくなることもありますが、都会の荒波に揉まれながら強く生きています。

監修者プロフィール

山澤 良介 (Ryosuke Yamazawa)
アマゾン ウェブ サービス ジャパン合同会社
テクニカルソリューションアーキテクト

ソリューションアーキテクトとして、業種業態を問わず様々なお客様を支援させて頂いています。前職では主にネットワーク案件を担当していたため、好きなサービスは、AWS Direct Connect と AWS Transit Gateway です。
休日はスノーボードが大好きなので、シーズン中は毎週スキー場に行っているほか、オフシーズン中もオフトレ施設に行っています。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する