Amazon Forecastで時系列データの予測を行う

awsgolangmachinelearning

Amazon Forecastは機械学習によって時系列データの予測を行うマネージドサービス。 ドメインやアルゴリズムを選んでデータを投入すればそれらしい出力が得られる。 まずこれで予測してみて、その結果をベースラインとしてSageMakerなどで自作したモデルを評価するといった使い方もできる。

SageMakerでPyTorchのモデルを学習させる - sambaiz-net

料金はデータストレージに$0.088/GB、学習に$0.24/hour、予測に$0.60/1000回かかる。

今回は開発者ガイドと同じく 電力消費量のデータセットを用いて動かしてみる。

$ head electricityusagedata.csv 
2014-01-01 01:00:00,2.53807106598985,client_0
2014-01-01 01:00:00,23.648648648648624,client_1
2014-01-01 01:00:00,0.0,client_2
2014-01-01 01:00:00,144.81707317073176,client_3
...

データのインポート

まずドメインを選んでDataset groupを作成する。Dataset groupには予測対象の時系列データに加えて、他の関連する時系列データやメタデータを含めることができる。

Dataset groupの作成

CSVをS3に置き、それを読めるRoleを渡してインポートする。データの間隔とカラムの順は元データと合致するように設定する。 タイムスタンプは yyyy-MM-ddyyyy-MM-dd HH:mm:ss の形式である必要がある。

Datasetのインポート

学習

インポートが終わるとTrain predictorできるようになる。 予測の間隔と期間を設定し、アルゴリズムを、AutoMLか、ARIMAやCNN-QRといったものの中からマニュアルで選んで学習を始める。

アルゴリズム

時系列データのMAモデルとARモデル、その定常性と反転可能性 - sambaiz-net

ハイパーパラメータの最適化や、国ごとの祝日や天気を考慮するオプションもある。

予測

学習が終わるとCreate a forecastして予測値を得られる。

予測

Goでの取得はこんな感じ。

package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/forecastqueryservice"
)

func main() {
	mySession := session.Must(session.NewSession())
	svc := forecastqueryservice.New(mySession)
	ctx := context.TODO()
	output, err := svc.QueryForecastWithContext(ctx, &forecastqueryservice.QueryForecastInput{
		ForecastArn: aws.String("arn:aws:forecast:ap-northeast-1:*****:forecast/testforecast"),
		Filters:     map[string]*string{"item_id": aws.String("client_367")},
		// StartDate: aws.String("2015-01-01T01:00:00"),
		// EndDate: aws.String("2015-01-02T12:00:00"),
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(output.Forecast.Predictions["p50"][0])
	/*
		{
			Timestamp: "2015-01-01T01:00:00",
			Value: 178.90061950683594
		}
	*/
}