Amazon Forecast ハンズオン やってみた

<h2>はじめに</h2>

今回、AWS公式の[Amazon Forecast ハンズオン](https://pages.awscloud.com/rs/112-TZM-766/images/201912-AmazonForecastHandson.pdf)をやってみました。せっかくなので記事にしたいと思います。ハンズオンとしては、過去の家庭の電⼒使⽤量のサンプルデータから学習を行い、その後の使⽤量を予測するモデルを**Amazon Forecast**を使って構築する内容になっています。
それではやっていきましょう！

<h2>データの準備</h2>

最初に、**Forecast**にデータを渡すための準備をします。
やることは簡単で、S3を作成してそこにcsvファイルをアップロードするだけです。
今回はハンズオンで用意されているサンプルを使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/38b2fb7a-3f20-7c3e-a63a-fcae5d8cf9ec.png)

<h2>データのインポート</h2>

ここからが本番です。
最初にデータセットグループを作成します。このデータセットグループはデータセットや学習結果、予測などを入れていく箱のようなひとまとまりの事です。

- データセットグループの名前
- **Forecast**のドメイン

以上の2点を設定します。
ドメインとはデータのスキーマを指定するもので、売り上げ予想用のドメインやEC2の容量を予測するためのドメインが用意されています。詳しくは[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/howitworks-domains-ds-types.html)を参照ください。今回のハンズオンでは、用意されているドメインに当てはまるものが無いので**Custom**を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/95846b5a-4f7c-f368-f5e1-3c6173b4dbdc.png)
次にデータセットを作っていきます。最初のブロックでは

- データセット名
- データの時系列間隔
- データスキーマ

以上3点を設定します。
**Frequent of your data**には、学習に使用するデータの時系列情報の間隔を指定します。今回のサンプルでは1時間ごとの電力使用量を扱っているので、**1 hour**を指定しています。
**Data schima**はデータのスキーマを指定するもので、**Schema builder**を指定し、学習に使用するサンプルデータと**同じ順序**になるように設定します。ハンズオン資料の当時はJSONで指定する方法しかなかったようですが、今はGUIでも設定できるのは小さな幸せですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/4f9a16fe-00b8-ee34-e5a0-ca23c7c4c754.png)

次のブロックでインポートするデータの設定をします。

- インポートデータ名
- タイムゾーン
- インポートするデータのファイル形式
- データの場所
- IAMロール

以上の5点を設定します。
名前は他のインポートデータと区別できるようにしておきます。
データの場所としては、先ほど作成しアップロードしたサンプルデータのS3のパスを指定します。
また、IAMロールは自動的に必要な権限だけを持ったロールを作成してくれます。作成されるロールにアタッチされているポリシーはS3に関する権限だけを持っています。別で用意したIAMロールを使用する場合はそちらを指定します。最後に削除するので、ロール名を覚えておきます。

<details><summary>作成されるポリシー※参考</summary>

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        }
    ]
}
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/542e90c5-aebe-72fd-5d7a-8c900d984c9d.png)
この状態でStartを押すとデータセットグループが作られ、データセットにデータのインポートが始まります。Import your dataが**Active**に変わり、Train a predictorのStartに色が付いたら完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/49cced33-2930-f9ec-3e5c-92f88c83fbae.png)
↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/e8bce882-c7ec-023e-d3b2-8be017482f43.png)

<h2>データを学習</h2>

続いてデータをForecastに学習させて、予測子(Predictor)というものを作成します。

- 予測子名
- データの時系列間隔
- どのくらい先を予測させるのか

以上のオプションを除いた3点を設定します。
**Forecast Frequency**はデータセットを作成した時に、Frequent of your dataで設定した値と揃えます。今回は**1hour**にしています。
**Forecast horizon**がどれくらい先を予測させるのかを指定する値で、今回は**36**として、36時間分の予測をしてもらいます。
**Forecast dimensions**はFrequencyがdayより間隔が広い場合に設定でき、開始点を指定できます。例えばFrequencyがdayでdimensionsの値を10にした場合、午前10時から翌日の9:59までが1日分としてデータが管理されます。今回はデータが時間単位のため特に指定しません。
**Forecast quantiles**は分位数の設定です。分位数とは統計解析において、データの相対的位置をみるのに用いる数値のことで、データを4分割している場合は4分位数と呼ぶそうです。今回はデフォルトの値で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/d84588ea-7160-de51-2ed1-2e7d24efc98a.png)

トレーニングを開始したら、**左メニューにPredictor**の項目があるので、選択すると対象データセットグループのPredictor一覧が表示されます。ここのステータスが**Avtive**になれば完了です。ここは時間がかかるため休憩したり、ここまでのまとめ等ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/23ad6de6-e32c-6cd0-983e-859d55578f2d.png)
↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/7a0380c6-a0eb-8aa6-62cc-a27d1e4ad426.png)


<h2>予測の作成</h2>

トレーニングが完了したら、Forecastが作成できるようになるので、**Forecast generationのStart**から作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/ddaa7d44-7e5c-dd70-e7fb-7ff1100a76b2.png)

- Forecast名
- 使用する予測子(Predictor)
- 学習データのうち、どのアイテムの予測を作成するか

以上のオプションを除いた3点を設定します。
**Predictor**は先ほど作成したものを指定します。
**Forecast quantiles**はオプションで、分位数を指定する項目で、今回はデフォルトのため特に設定しません。
**Items for generating forecasts**は、今回扱うデータのアイテムが電力使用量の1つのため**All Items**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/e40bd051-35c2-9a0f-5cc5-ad87af88a42b.png)
左メニューに**Forecast**の項目ができるので、選択すると対象データセットグループのForecastの一覧が表示されます。ここのステータスが**Avtive**になれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/cc56b6e9-2d4f-07e1-657b-f8536526f612.png)
↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/5933223e-4b90-60b4-ff07-b792e4fbb317.png)


<h2>予測の確認</h2>

Forecastの作成が完了したらダッシュボードのForecastの枠にQuery forecastが表示されます。
予測を確認していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/f249a893-074c-c345-1869-de1be9def1a8.png)
- どのForecastを使うか
- 開始時間
- 終了時間
- 確認するアイテムのIDの値

対象のForecastは先ほど作ったものを指定します。
**開始時間はサンプルデータの末尾の時間**を指定し、**終了時間はForecast作成時にForecast horizonに設定した値だけ後ろの時間**に設定します。今回のサンプルデータは2015年の1/1 0:00までのため、開始時間は2015年1/1 0:00、終了時間はForecast horizonに36と設定したので、36時間後の2015年1/2 12:00とします。
Forecast keyのValueには、画像の通りサンプルデータではclient_1～client_10まであるので、client_1を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/c68e4883-8cca-0955-c289-e5637624c630.png)
全部記載したのがこちら↓です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/f4d671af-84bb-de2e-cbd5-ee936450ff9c.png)
**Get Forecast**を押すと予測結果が画面下部に表示されます。
P50が示す値は、50％の確率でこの値を下回ることを表しています。
P10が示す値は、10％の確率でこの値を下回ることを表しているので、最低でもこれくらいの値を取りうることを表しています。需要予測の場合は、在庫を抱えずにすべて売り切れる個数のイメージです。
逆にP90が示す値は、90％の確率でこの値を下回ることを表しているので、最高でもこれくらいの値に収まることを表しています。需要予測の場合は、欠品させたくない商品はこの値に合わせて発注するイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/5b72da13-35e0-3bfb-93c6-29c47bdf6f10.png)

<h2>予測のエクスポート</h2>

左メニューに**Forecast**の項目から作成したForecastを開き、**Create forecast export**ボタンからエクスポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/4876cf93-3ecf-7dff-a162-e2c08fdd1509.png)

- エクスポート名
- IAMロール
- 暗号化キー
- ファイル形式
- エクスポート先

以上を設定します。
IAMロールは先ほどデータセットを作成した時と同じものを指定します。
暗号化キーはオプションで、エクスポート時に使用する暗号化キーを指定します。暗号化しない場合は設定しなくても大丈夫です。
ファイル形式はインポート時と同じですが、CSV or PARQUETを選ぶことができます。
エクスポート先にはS3のURIを設定します。※スクショは入力前のものです。
設定が終わったら下部の**Create forecast export**を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/ae9a8792-f0b4-175f-33ac-54640ac2276a.png)
指定したS3バケットにエクスポートされているのが確認できれば完了です。

<h2>環境掃除</h2>

最後に環境掃除をします。
左メニューからForecast → Predictor → Dataset → Datasetgroupの順に選び削除します。
S3のページに移動し、インポート用のサンプルデータやエクスポートした予測を削除し、バケットも削除します。
**IAMロールは忘れやすい**ので注意です。

<h2>終わりに</h2>

今回、初めてAWSの機械学習系サービスを触ってみました。コードも特に必要なく、コンソールだけで完結しているため機械学習の知識が無くても予測まで作れてしまいました。一方で、よくわからず予測まで作れてしまった感もあります。
扱うデータや各パラメータの調整、その予測から何を見出すのかなど使いこなせたらカッコいいなと思いました。
**Amazon Forecast**は、EC2の容量や販売個数、株価などなど時系列情報を持ったデータであれば、予測が作成できますので、興味がある方は是非触ってみてもらえたら、そのきっかけがこの記事だと嬉しいです。

p.s.面白かったし他の機械学習系のサービスを触ってみようかな
その勢いでAWS MLSも取得したい！な、と。