Amazon Web Services ブログ

Amazon Forecast: 学習済み Predictor を再利用して最新の予測を更新する

こんにちは、アマゾン ウェブ サービス ジャパンの藤田です。Amazon Forecastでは、過去の時系列データからpredictor(予測子)の学習を行い、将来(新しいデータポイント)の予測を行うことが可能です。需要予測や在庫計画など、様々なビジネス課題に適用することができます。今回は、Amazon Forecast で学習した Predictor を再利用して、最新の予測を更新していく Rolling Forecastについて紹介します。

Rolling Forecastとは?

  • Rolling Forecast は、新たにデータが収集されたとき、既存の Predictorを使用して、Predictor を再学習することなく、さらに先のデータポイントの予測を行います。Predictor の再学習には時間とコストがかかりますが、Rolling Forecastを使用すれば、必要な時間とコストを削減することができます。
  • 具体的には、下図のように1日先のデータポイントを予測するモデルの場合、追加データを次々と加えていくことで、さらに1日先の予測が得られます。Amazon Forecast の場合は、学習データと追加データを再度インポートすることによって、データポイントを更新することができます。

 

使用するデータ

ForecastのGetting Startedからダウンロードできる電気使用量のデータを使用します。
このデータには370世帯の2014/01/01から2014/12/31(2015/01/01の0時まで)までの1年分の電力使用量が毎時単位で格納されています。今回はRolling Forecastを行うため、このデータから3つのファイルを作成します。

  • electricityusagedata_train.csv: 2014/01/01の1:00から2014/12/30の0:00まで
  • electricityusagedata_add.csv:  2014/01/01の1:00から2014/12/31の0:00まで
  • electricityusagedata_test.csv:  2014/01/01の1:00から2015/01/01の0:00まで

ファイルの作成はダウンロードしたelectricityusagedata.csvを使用し、各対象の期間を抽出します。
electricityusagedata_trainはPredictorを作成するために利用します。この Predictor で予測を行うと、2014/12/30 から Forecast Horizon で指定した期間 (今回は24時間分) の予測を得ることができます。ここでは、electricityusagedata_trainに24時間分のデータを追加した、electricityusagedata_addを利用することでRolling Forecastを行い、2014/12/31より先の予測を得ます。electricityusagedata_testは実測値としてRolling Forecastの予測値との比較に使用します。

Predictorの作成

上記のファイルの作成が終わったら、Getting Startedに従い、データをS3にアップロードします。次にGetting Started(Console)を参照しながら、Forecastへのデータのアップロードとelectricityusagedata_trainを使ったpredictorの作成を行います(ForecastはConsoleからの操作の他に、AWS CLISageMakerからも操作することができます)。

Import your dataでの変更点

  • Getting Started同様にFrequency of your dataはhourに変更してください。
  • Getting Started(Console)内でも図示されていますが、Create target time series datasetのData schemaはデータに合わせて、下記のようにtimestamp, target_value, item_idの順番にしてください。
{
        "Attributes": [
          {
            "AttributeName": "timestamp",
            "AttributeType": "timestamp"
          },
          {
            "AttributeName": "target_value",
            "AttributeType": "float"
          },
          {
            "AttributeName": "item_id",
            "AttributeType": "string"
          }
        ]
}
  • Data locationは、s3://YOUR_S3_PATH/electricityusagedata_train.csvとなります。

Train a predictorでの変更点

  • PredictorのForecast horizonは、Getting Startedでは36としていますが、今回は24に設定してください。同様にBacktest windowが24に変更されていることを確認してください。
  • Forecast frequencyはhourに変更してください。
  • Algorithmは任意ですが、今回はGetting Started同様にETSを使用します。
  • 「Train predictor」をクリックすると学習が実行されます。学習時間はデータの量やAlgorithmによって異なります。

Generate forecastsでの変更点

  • Predictorには先ほど学習したPredictorを選択
  • Forecast typesは以下のようにします。
    .10, .50, .90, mean
  • 「Create a forecast」をクリックすると予測が生成されます。

Forecast lookup

  • 先ほど作成したForecastを選択して、Start dateに「2014/12/29 01:00:00」、End dateに「2014/12/31 00:00:00」を入力します。
  • Forecast keyは「Item_id」、ValueはGetting Startedと同様に「client_21」を入力します。
  • 黒の実線が実測値、色のついた線がそれぞれのパーセンタイルでの予測値となります(ETSでは.50とmeanは同値になるため重なっています)。

  • この時点で、2014/12/30 01:00:00から2014/12/31 00:00:00の24時間分の予測は得られましたが、End dateを変更してもそれ以降の予測値を得ることはできません。

Rolling Forecast

それではRolling Forecastを行いましょう。まずはelectricityusagedata_addに対するデータセットインポートジョブを作成します(追加データでRolling Forecastする場合、追加データには学習に使った既存データが全て含まれている必要があります)。

  • 左側のメニューからDatasetsをクリックし、作成したDataset(下図ではmy_forecast_dataset)をクリックします。

  • 「Create dataset import」をクリックします。

  • 新しいDatasetの名前(下図ではadd_dataset_import)とData locationにS3にあるelectricityusagedata_add.csvのパスを入力し、「Create dataset import」をクリックします。

 

  • 追加したDatasetのStatusがActiveになったら左側のメニューからForecastsをクリックし、「Create a forecast」をクリックします。

  • 新しいForecast nameを入力し、Predictorには前回作成したPredictor(下図ではmy_forecast_predictor)を選択、Forecast typesは前回と同様の値を入力し、「Create a forecast」をクリックします。

  • ForecastのStatusがActiveになったら、Forecast lookupをクリックし、Forecastには先ほど作成したforecastを選択します。Start dateには「2014/12/30 01:00:00」、End dateには「2015/01/01 00:00:00」を入力します。Forecast keyは前回と同様に「Item_id」、Valueには「client_21」を入力し、「Get Forecast」をクリックします。

  • 追加データからさらに24時間先まで(2014/12/31 01:00:00から2015/01/01 00:00:00)の予測が得られました。

  • この予測データは、CreateForecastExportJob を利用して、S3 に CSV ファイルとして出力することができます。この結果をダウンロードして、あらかじめ用意していたelectricityusagedata_test.csv の実測値と比較してみます。青線が実測値で黄線、緑線、赤線がそれぞれ10、50、90パーセンタイルの予測値になります。深夜帯の変化のない部分、夕方の上昇、夜間の減少といった変化を予測できていることを確認できました。

今回のデータセットとAlgorithmの例では、再学習せずにRolling Forecastで1日分のデータを追加しても精度は大きく劣化しませんでした。しかし、再学習しない場合はパラメータの更新が行われないため、時間の経過と共にモデルの精度は劣化していきます。実際の運用ではモデルの鮮度を確認した上で定期的に再学習を行いながら運用していくことが望ましいです。

以上となります。

本blogのSageMakerからの操作はamazon-sagemaker-examples-jp内にコードがありますのでよかったら参照してください。

 

著者について

藤田 充矩 (Atsunori Fujita) は AWS の機械学習 プロトタイプ ソリューション アーキテクトで、自然言語処理や時系列分析などを得意にしています。趣味はkaggleです。