Amazon Web Services ブログ

Amazon Forecast がサポートする自動補完機能による、ターゲットおよび関連データセット内での欠落した値の管理

Amazon Forecast は、機械学習 (ML) を使用する完全マネージド型サービスです。このサービスでは、ML の経験を必要とせずに非常に正確な予想を生成できます。Forecast が利用可能なユースケースは多岐にわたります。たとえば、製品需要の見積り、サプライチェーンの最適化、人事計画、エネルギー需要の予測、クラウドインフラストラクチャの使用状況の算定などが考えられます。

Forecast では、プロビジョニングすべきサーバー、あるいは手動で構築すべき機械学習モデルなどは存在しません。また、お支払いは実際に使用した分のみであり、最低料金や前払い料金を求められることはありません。Forecast の使用には、予想すべき数値に関する履歴データと、その予想に影響を与える可能性のある関連データが必要がなだけです。この関連データとしては、価格、行事、天候など、時間的に変化するデータや、色、ジャンル、地域など分類に関するデータなどがあります。このサービスは、用意されたデータに基づき、機械学習モデルのトレーニングとデプロイを自動的に行います。また、予想結果を取得するためのカスタム API も利用できます。

現実世界で予想を実施する際に一般的に見られる事象として、生データにおける値の欠落が挙げられます。履歴 (あるいは時系列の) データから値が欠落しているということは、すべての時点において対応した値が利用可能とは限らない、ということを意味します。値が欠落するには、多くの理由があります。たとえば、特定の時点でトランザクションが発生しなかったり装置にエラーがある場合、あるいは、測定自体が適切に実施されなかった場合などに、値の欠落が生じます。

Forecast では、関連あるいはターゲットの時系列データセット、および履歴上や予想期間における、欠落データ (既存の NaN も含みます) の自動補完機能をサポートしています。関連時系列 (RTS) データには、通常、プロモーションや価格もしくは在庫切れなどの、ターゲットの数値 (製品需要) と相関性がある情報が含まれています。これらにより、予想結果の精度が向上することが期待できます。欠落した値に関しては、valuemedianminmaxzeromean、および nan (対象が時系列の場合のみ) といった各種のロジックを、特定のユースケースに合わせ適用できます。Forecast では、CreatePredictor API の FeaturizationConfig により、これらの機能を提供しています。

今回の記事では、Forecast の GitHub レポジトリ からサンプルノートブックを入手して、関連がある、あるいはターゲットの時系列 (TTS) データセットに対し、欠落した値の補完機能を適用していきます。

Forecast における欠落した値の処理

時系列上で値が欠落しているということは、結局、多くの理由により、それ以降の処理のために対応した値が利用不可能になるということを意味します。製品セールスを表している時系列データが欠落していることは、その製品が販売不可能な状態にあると解釈できます。この状況としては、製品が存在しない期間 (リリース前や非推奨となった後など) 、もしくは、製品は存在するものの販売できない期間 (部分的な在庫切れ) などが挙げられます。また、ある期間にセールスデータが記録されなかった場合も、値の欠落が生じます。

「(not available for sale (販売中止)」というユースケースでは、一般的にターゲットの値が zero となりますが、そこで失われたはずの値 (nan) の中には、追加的な情報が含まれているとも考えられます。用意できている商品の売り上げがゼロであったという情報と、在庫切れ商品において売り上げがゼロであるという情報との間には、大きな違いが存在します。このため、ターゲットの時系列に挿入された zero は、予測結果をアンダーバイアスにしがちです。また、nan を挿入した場合は、売るべき商品がなかったという事実を無視することになるので、予測結果はオーバーバイアスになりがちです。

次に示す時系列グラフでは、補完するために不適切な値を選択した場合、それがモデルの精度に対し、いかに大きな影響を与え得るかを示しています。グラフ A と B は、それぞれ在庫切れ商品についての需要を、対応する実際の販売データ (黒いライン) とともにプロットしています。A1 において、欠落している値には zero が挿入されています。これは、A2 に (点線で) 示すように、アンダーバイアス気味の予測結果につながります。一方 B1 では、欠落した値に nan が挿入され、B2 に示す予測結果では、真値をより正確に追従しています。

Forecast には、TTS および RTS データセットでの欠落値を処理するための、複数のデータ補完メソッドが用意されています。補完とは、データセットで欠落しているエントリーに対し、標準化した値を追加する処理のことです。バックテスト実施中、Forecast は挿入された (NaN 以外の) 値を実際の数値と想定し、それらを評価メトリクスの中で使用しますForecast には、次のような補完メソッドがあります。

  • Middle filling (中間挿入) – アイテムデータの開始日と終了日の間で、すべての欠落値を挿入する
  • Back filling (後方挿入) – アイテムデータが最後に記録されたデータポイントと、データセットのグローバルエンド (アイテム全体で最後の日付) の間で、欠落した値を挿入する
  • Future filling (予測挿入、RTS のみ) – データセットのグローバルエンドの日付と、予想機関の最後との間で、欠落した値を挿入する

補完メソッドごとの説明を次の画像に示します。

次に示す表では、各メソッドでサポートされる挿入オプションを個別にまとめています。詳細については、「欠落した値の処理」をご参照ください。

 

A B C
1 補完メソッド (TTS) デフォルト オプション
2 Front filling (前方挿入) No filling (挿入なし) なし
3 Middle filling (中間挿入) zero nan, zero, value, median, mean, min, max
4 Back filling (後方挿入) zero nan, zero, value, median, mean, min, max
5 Future filling (予測挿入、サポートなし) 該当なし 該当なし

 

A B C
1 補完メソッド (RTS) デフォルト オプション
2 Front filling (前方挿入、サポートなし) 該当なし 該当なし
3 Middle filling (中間挿入) デフォルトなし zero, value, median, mean, min, max
4 Back filling (後方挿入) デフォルトなし zero, value, median, mean, min, max
5 Future filling (予測挿入) デフォルトなし zero, value, median, mean, min, max

データの取り込み

TTS および RTS に対しては、最初にデータをインポートする必要があります。今回のユースケースでは、GitHub レポジトリからのデータファイル、tts.csv および rts.csv を使用します。ts.csv には、複数の商品に関する需要が月次で収録されています。また、rts.csv の方は、各商品の平均価格を月次で収録しています。これにより、一般的な小売りシナリオが模倣できます。同時に、これらのデータセットの値には欠落部分があるので、Forecast が提供する補完メソッドとロジックを使用し、これらを埋めていきます。次の Python サンプルコードを使用すると、サンプルの商品 (item_001) に関する需要を可視化することができます。

df = pd.read_csv( "./data/tts.csv" )
df[ df["item_id"]=="item_001" ].plot( x="timestamp" )

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

次の手順を実行し、データセットグループを作成して、それに TTS および RTS のデータセットを追加します。

  1. Forecast コンソールの [データセットグループ] の下で、[データセットグループを作成] をクリックします。
  2. [データセットグループ名] には、filling_analysis_v1 と入力します。
  3. [予想ドメイン] では、[小売り] を選択します。
  4. [次へ] をクリックします。
  5. [データセット名] には、filling_analysis_v1_tts と入力します。
  6. [データスキーマ] に、次のコードを入力します。
    {
            "Attributes": [
              {
                "AttributeName": "item_id",
                "AttributeType": "string"
              },
              {
                "AttributeName": "timestamp",
                "AttributeType": "timestamp"
              },
              {
                "AttributeName": "demand",
                "AttributeType": "float"
              }
            ]
          }
    
  7. [次へ] をクリックします。
  8. [データセットのインポート名] には、filling_analysis_v1_tts_dsi と入力します。
  9. [タイムスタンプ形式] には、yyyy-MM-dd を入力します。
  10. [IAM ロール] では、[AmazonForecast-ExecutionRole] を選択します。
  11. [データセットのインポートを作成] をクリックします。

RTS データセットのインポートには、上記の手順を繰り返した上で、スキーマに対し次のコードを実行します。

{
        "Attributes": [
          {
            "AttributeName": "item_id",
            "AttributeType": "string"
          },
          {
            "AttributeName": "timestamp",
            "AttributeType": "timestamp"
          },
          {
            "AttributeName": "price",
            "AttributeType": "float"
          }
        ]
      }

モデルの作成と推論

データのインポートが完了すると、モデルのトレーニングを行い、精度に関するメトリクスを生成できるようになります。Forecast で利用できるアルゴリズムは 5 つです。アルゴリズムには、特定のものを選択することもできますが、[Auto-ML] を選択して、定義済みの目的関数に適したアルゴリズムを、Forecast に選択させることも可能です。詳細については「Amazon Forecast アルゴリズムを選択する」をご参照ください。

300 の個別商品について 2 年以上の履歴データがある今回のユースケースでは、DeepAR+ を使用します。データセットに数百の時系列データを含む場合、この DeepAR+ アルゴリズムは、標準的な ARIMA や ETS メソッドより優れた結果を残します。予測をトレーニングするためには、次の手順を実行します。

  1. Forecast コンソールの [予測をトレーニング] の下で、[開始] を選択します。
  2. [予測名] に、filling_analysis_v1 と入力します。
  3. [予想期間] に、3を入力します。
  4. [予測頻度] では、[] を選択します。
  5. [アルゴリズム] で、[Deep_AR_Plus] を選択します。
  6. [バックテストウィンドウの数] には、1 を入力します。
  7. [バックテストウィンドウのオフセット] には、3 を入力します。
  8. [トレーニングパラメータ] に、次のコードを入力します。
    {
    	"context_length": "6",
    	"epochs": "500",
    	"learning_rate": "1E-3",
    	"learning_rate_decay": "0.5",
    	"likelihood": "student-t",
    	"max_learning_rate_decays": "0",
    	"num_averaged_models": "1",
    	"num_cells": "40",
    	"num_layers": "2",
    	"prediction_length": "3"
    }
    

    これで、TTS (需要) と RTS (価格) に対し欠落した値を処理するロジックがセットアップできました。middlefillbackfill で使用するロジックは、TTS と RTS の両方に対し mean を使用します。futurefill (予想期間で欠落した値を特定するためのロジック) での RTS に対しては、min を使用します。予想においての一般的なシナリオは、異なる (価格などの) 外部変数が、予想期間に与える影響を評価するというものです。これにより、適切な量の製品在庫を、シナリオとは関係無く計画し確保することが可能になります。Forecast では、これをデータの更新や、予想を再生成することで実現できます (手順については GitHub repo をご参照ください) 。また、(先述の) futurefill メソッドを使用し、さまざまな異なる挿入オプション (max など) による予測を作成して、複数のシナリオを模倣することも可能です。

  9. [機能化] に、次のコードを入力します。
    [
    	{
    	"AttributeName": "demand",
    	"FeaturizationPipeline": [
    		{"FeaturizationMethodName": "filling",
    				"FeaturizationMethodParameters": {
    					"aggregation": "sum",
    					"backfill": "mean",
    					"frontfill": "none",
    					"middlefill": "mean"
    				}
    			}
    		]
    	},
    	{
    	"AttributeName": "price",
    	"FeaturizationPipeline": [
    		{"FeaturizationMethodName":"filling",
    				"FeaturizationMethodParameters": {
    					"aggregation": "first",
    					"backfill": "mean",
    					"frontfill": "none",
    					"futurefill": "min",
    					"middlefill": "mean"
    				}
    			}
    		]
    	}
    ]

  10. [トレーニング予測] をクリックします。

予測のトレーニングが完了すると、予測の詳細ページで、関連のあるメトリクスを確認できるようになります。

予想の作成

予想を作成するには、以下の手順を実行します。

  1. Forecast コンソールの [予想の生成] で、[開始] をクリックします。
  2. [予想名] に、filling_analysis_v1_min と入力します。
  3. [予測] では、filling_analysis_v1 を選択します。
  4. [予想タイプ] に、予測が生成される分位値を入力します (例: .10、.50、.90、.99) 。
  5. [予想を作成] をクリックします。

予想のクエリと可視化

この段階で、作成済みの任意のアイテムについての予想を可視化できるようになりました。これには、コンソールから QueryForecast API を利用します。

予想をクエリするには、以下の手順を実行します。

  1. Forecast コンソールでダッシュボードを開き、[予想のルックアップ] をクリックします。
  2. [予想] で、[filling_value_v1_min] を選択します。
  3. [開始日] で、2019/07/01 を選択します。
  4. [終了日] で、2019/12/01 を選択します。
  5. [item_id] で [item_269] を選択し (任意のアイテムが選択可能) 、[予想を生成] をクリックします。

これで、予想結果と指定した商品についての需要履歴を、次のように可視化できますす。

まとめ

今回の記事では、TTS および RTS データセットにおいて欠落した値を、Forecast でサポートされたメソッドにより補完しました。この機能は、Forecast が提供されるすべてのリージョンでご利用いただけます。AWS フォーラム、もしくは、AWS サポートチャンネルからのフィードバックをお待ちしております。


著者について

Rohit Menon は、Amazon Forecast のシニアプロダクトマネージャーであり、このプロジェクトの立ち上げメンバーの一人です。現在は、機械学習を使用することで、時系列予想をより多くの人が利用できるものにする仕事に取り組んでいます。余暇はドキュメンタリーを読んだり見たりしています。

 

 

 

 

Heesung Sohn は、ビッグデータと機械学習のエバンジェリストです。彼は、アマゾン ウェブ サービスのソフトウェアエンジニアとして、データベースや AI サービスにフォーカスした分散型システム構築の経験を活かしています。彼は、Amazon Forecast の立ち上げエンジニアの一人です。

 

 

 

Tomonori Shimmura は、AWS バーチカル AI チームのシニアテクニカルプログラムマネージャーです。彼は、お客様に深層的なテクニカルコンサルティングを提供し、製品開発を後押ししています。余暇には、ビデオゲームを楽しんだり、漫画を読んだり、ソフトウェアを作成したりしています。

 

 

 

 

Danielle Robinson は、ML 予想チームのアプライドサイエンティストです。彼女は、時系列予想や、新しいニューラルネットワークベースのアルゴリズムの Amazon Forecast への応用方法などを、研究しています。彼女は、自身の論文研究の中で、計算流体力学のための、ロバストで物理的精度が高い新たなニューメリカルモデルの開発を取り上げています。趣味は、料理、水泳、そしてハイキングです。