🚴🏻‍♀️

【Amazon Forecast】AWSの基礎を学ぼう

2021/07/21に公開

概要

「AWSの基礎を学ぼう」で”Amazon Forecast”のおさらいに参加した感想です。

「AWS エバンジェリストシリーズ AWSの基礎を学ぼう」とは

AWS エバンジェリストシリーズ AWSの基礎を学ぼう

以下、Connpassページより引用

Amazon Web Services (AWS)は現在200を超えるサービスを提供し、日々サービスの拡充を続けています。
このAWS エバンンジェリストシリーズでは週次でAWSのサービスをひとつづつ取り上げながらその基礎を説明していく 初心者、中級者をターゲットとした講座です。午後の仕事前にスキルアップを一緒にしませんか?
注意点 登壇者による発表内容はアマゾン ウェブ サービス ジャパンとして主催しているものではなく、コミュニティ活動の一環として勉強会の主催を行っているものです。

毎週ありがとうございます!


Amazon Forecastとは?

機械学習を使用して精度の高い予測を行うフルマネージド型のサービスです。
Amazon.com と同じテクノロジーをベースとし、機械学習を使って時系列データを付加的な変数に結びつけて予測を立てます。Amazon Forecast を使用する際に、機械学習の経験は必要ありません。必要なのは過去のデータと、予測に影響を与える可能性があるその他の追加データだけです。たとえば、シャツの特定のカラーの需要は、季節や店舗の所在地によって変わることがあります。こうした複雑な関係性は、過去のデータのみに基づいて判断することは困難で、それを認識することに理想的に適しているのが機械学習です。Amazon Forecast は、ユーザーがデータを提供すると、それを自動的に精査し、何が重要かを識別して、予測を立てるための予測モデルを作成します。このモデルの精度は、時系列データのみに基づく場合と比べ、最大で 50% 高くなります。

AWS News Blogに上がっているデータでやってみる

元ネタ

AWS News Blog - Amazon Forecast – Now Generally Available

今回のデータの抜粋

1分単位と中々細かい

カラムID カラム和訳 値1 値2
Date 日付 16/12/2006 16/12/2006
Time 時間 17:24:00 17:25:00
Global_active_power 有効電力 4.216 5.360
Global_reactive_power 無効電力 0.418 0.436
Voltage 電圧 234.840 233.630
Global_intensity 強度 18.400 23.000
Sub_metering_1 サブメーター1 0.000 0.000
Sub_metering_2 サブメーター2 1.000 1.000
Sub_metering_3 サブメーター3 17.000 16.000

Create dataset group

Dataset group

予測を行うためのデータセット・データセット群。予測対象の時系列データ、マッピング定義であるスキーマを用意し、Amazon Forecastに読み込み、学習を行う。データセットは、メインの時系列データ、関連する時系列データ、メタデータ3種類からなる。各種データセットはデータセットグループでまとめることが出来る。

Forecasting domain

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

Create target time series dataset


Dataset

Dataset groupと同じ説明になるので割愛

Frequency of your data

Blogでは1時間単位になっているけど1分単位にしてみる。独自性を出して失敗するぱてぃーん

Data schema

GUIかJSONのどちらかでDatasetの定義を実施する
今回は以下で定義。なお元データは日付と時間が分かれていたので頑張ってyyyy-MM-dd HH:mi:ss形式に変換

{
	"Attributes": [
		{
			"AttributeName": "timestamp",
			"AttributeType": "timestamp"
		},
		{
			"AttributeName": "global_active_power",
			"AttributeType": "float"
		},
		{
			"AttributeName": "global_reactive_power",
			"AttributeType": "float"
		},
		{
			"AttributeName": "voltage",
			"AttributeType": "float"
		},
		{
			"AttributeName": "global_intensity",
			"AttributeType": "float"
		},
		{
			"AttributeName": "sub_metering_1",
			"AttributeType": "float"
		},
		{
			"AttributeName": "Sub_metering_2",
			"AttributeType": "float"
		},
		{
			"AttributeName": "Sub_metering_3",
			"AttributeType": "float"
		},
	]
}

エラー1


なに、Customでもitem_idは必須なのか。
このデータのitem_idってなんや。わからんのでitem1で全部固定にしよう

% head -5 elec_import.csv elec_import.csv2
==> elec_import.csv <==
2006-12-16 17:24:00,4.216,0.418,234.840,18.400,0.000,1.000,17.000
2006-12-16 17:25:00,5.360,0.436,233.630,23.000,0.000,1.000,16.000
2006-12-16 17:26:00,5.374,0.498,233.290,23.000,0.000,2.000,17.000
2006-12-16 17:27:00,5.388,0.502,233.740,23.000,0.000,1.000,17.000
2006-12-16 17:28:00,3.666,0.528,235.680,15.800,0.000,1.000,17.000

==> elec_import.csv2 <==
item1,2006-12-16 17:24:00,4.216,0.418,234.840,18.400,0.000,1.000,17.000
item1,2006-12-16 17:25:00,5.360,0.436,233.630,23.000,0.000,1.000,16.000
item1,2006-12-16 17:26:00,5.374,0.498,233.290,23.000,0.000,2.000,17.000
item1,2006-12-16 17:27:00,5.388,0.502,233.740,23.000,0.000,1.000,17.000
item1,2006-12-16 17:28:00,3.666,0.528,235.680,15.800,0.000,1.000,17.000

エラー2


target_valueはまぁ言われるかなと思った。global_active_powerをtarget_valueに切り替え。

エラー3


予約語以外はstring型ですよ。とのお知らせ。
勉強会の資料には書いてあるので、ここで身になることを実感。
データの持ち方を1時間軸で複数の電気情報を横に持っていたけど、item_idを切り替えて縦に持たないとダメなのかな。
ちとメンドイので残念ですが、floatからstringに切り替え

結果のスキーマ情報

{
	"Attributes": [
		{
			"AttributeName": "item_id",
			"AttributeType": "string"
		},
		{
			"AttributeName": "timestamp",
			"AttributeType": "timestamp"
		},
		{
			"AttributeName": "target_value",
			"AttributeType": "float"
		},
		{
			"AttributeName": "global_reactive_power",
			"AttributeType": "string"
		},
		{
			"AttributeName": "voltage",
			"AttributeType": "string"
		},
		{
			"AttributeName": "global_intensity",
			"AttributeType": "string"
		},
		{
			"AttributeName": "sub_metering_1",
			"AttributeType": "string"
		},
		{
			"AttributeName": "Sub_metering_2",
			"AttributeType": "string"
		},
		{
			"AttributeName": "Sub_metering_3",
			"AttributeType": "string"
		}
	]
}

Train predictor


Predictor

読み込んだデータに対して、アルゴリズムや予測する期間を設定し、トレーニングを行いモデルを作成するまた予測精度に対する評価も行う。

Forecast horizon

モデルのトレーニング期間

Forecast frequency

データが1分単位なので1分で設定

Algorithm selection

AWSで準備されているアルゴリズムは6点
詳細はリンク先参照

今回は季節性もあるかなと思い「NPTS」でやってみる。
なお試しでNPTSでは1時間程度であるが、Autoやると10時間コースだったのでAutoは諦めた

Create a forecast

Forecast

トレーニングされたモデルのエンドポイントを作成し、時系列データの予測を生成する。

Forecast lookup

できました。

  • Target valueが実際の値
  • p10がこれより下回る可能性が10%
  • p50がこれより下回る可能性が50%
  • p90がこれより下回る可能性が90%

アルゴリズムが詳しくないけど、p90になると山の高まりが出ますね。

感想

ハンズオンでやるよりも調べながらなので頭には入りました。
同じデータでアルゴリズムを変えたりしてやるのは試してみたい

データセットを今回の形式に加工してやるのが、一番時間掛かったやも。

Discussion