Amazon Forecastを試してみる

## Amazon Forecastとは
- Amazon Forecastは、機械学習を使用して精度の高い予測を行う完全マネージド型のサービス

### 検証データ内容
- 日別の予約数（っぽいもの）を記録したCSVを作成し、Forecastに読み込ませて予測を行ってみる
    - 作成したCSVはS3においておく
- 項目は店舗ID、予約日付、予約数
- 2020/11/1から2020/1/31までの3ヶ月分のデータ（92行）
- 土日祝日は予約数多め、平日だと比較的火曜日が多い。予約数は増加傾向を示している。というデータとなっている
- このデータを使って2月の予約数の予測を算出してもらおう

### 検証データ項目
- item_id
    - Forecastで必須の項目
    - ディメンション（○○別に見るといった分析軸を示すもの
    - 店舗IDを当てはめる
- timestamp
    - Forecastで必須の項目
    - 時間軸を示す
    - yyyy-MM-dd（日単位）
    - 予約日付を当てはめる
- target_value
    - Forecastで必須の項目
    - 予約数を当てはめる

## AWSマネジメントコンソールからForecastを試す

### 操作方法
- Amazon Forecastを開く

![Screen Shot 2021-01-31 at 23.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/db26b8f0-7ae6-2d8c-dc23-bc55b78a423c.png)

- 「View dataset groups」ボタンをクリック

![Screen Shot 2021-01-31 at 23.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/a0c1dee7-237f-8df3-9681-fd9214a01003.png)

- 「Create dataset group」ボタンをクリック

![Screen Shot 2021-01-31 at 23.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/ce6a19f7-e3a6-9490-4c30-ea3d66733427.png)

- 以下項目を入力
    - Dataset group name
        - 英数字＆アンダースコアで適当に入力する（例：forecast_sample）
    - Forecasting domain
        - 予測する種類の設定
            - https://docs.aws.amazon.com/forecast/latest/dg/howitworks-domains-ds-types.html
            - テンプレートが用意されている
        - Custom Domainを選択する（RETAIL Domainでも良かったかもしれない）
- 「NEXT」ボタンをクリックする

![screencapture-ap-northeast-1-console-aws-amazon-forecast-home-2021-01-31-23_40_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/95425ebf-72f0-6cd6-9c47-53ea01e9364b.png)

- 以下項目を入力
    - Dataset name
        - 英数字＆アンダースコアで適当に入力する（例：forecast_sample_dataset）
    - Frequency of your data
        - 読み込ませるデータの日付の単位
        - 分、時、日、週、月、年から選択
        - 今回は日単位で作成
    - Schema Builder
        - item_id
        - timestamp
            - yyyy-MM-dd HH：mm：ss / yyyy-MM-ddからフォーマットを選択（yyyy/MM/ddはないので、CSVの形式に注意）
        - target_value
    - ちなみに読み込ませられるデータ型（Attribute Type）は以下が用意されている
        - string（文字列）
        - float（浮動小数点）
        - integer（整数）
        - geolocation（地理データ。USとヨーロッパのみ）
    - Dataset import name
        - 英数字＆アンダースコアで適当に入力する（例：forecast_sample_dataset_import）
    - Select time zone
        - timestampがUTC時刻だったら選択すると良いのかも（未検証）
        - Do not use time zoneを選択
    - Data location
        - CSVデータをおいたS3を選択
    - IAM role
        - CSVを読み込めるIAMロールを選択。なかったらこの場で自動生成してもらえる
- 「Start Import」を選択
- 15分ほど待ち

![Screen Shot 2021-02-01 at 0.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/3c53680a-1988-5ead-62cd-39b769860191.png)

- Dashboardが表示されたら、Predictor trainingの「Start」ボタンをクリックして学習の設定を行う
- 必要ならば、その前にItem metadata dataやRelated time series dataをインポートしておくこともできる（今回は何も入れてない）
    - item metadata data
        - item_idに指定した値の属性情報を読み込ませることができる
        - item_idを店舗IDにするならば、店舗の規模とか、取り扱い商品とか？
    - Related time series data
        - 時系列の属性情報を読み込ませることができる
        - 休日、特売日とか

![screencapture-ap-northeast-1-console-aws-amazon-forecast-home-2021-02-01-00_20_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/b243b3d9-7b7d-0fbc-9197-6a47c3553850.png)

- 以下項目を入力
    - Predictor name
        - 英数字＆アンダースコアで適当に入力する（例：forecast_sample_predictor）
    - Forecast horizon
        - 何行先まで予測するか
        - 入力データの1/3まで選択可能（Max：500）
        - 今回2月の予約数を予測したいので、28を設定
    - Forecast frequency
        - 日単位なのでdayを選択
    - Algorithm selection
        - 使用するアルゴリズムを選択する
        - とりあえずAutomaticにすればおすすめで予測してもらえる
        - Manualの場合は以下から選択
            - CNN-QR
            - DeepAR+
            - Prophet
            - NPTS
            - ARIMA
            - ETS
    - Forecast dimensions
        - 店舗別に予測を出したいならitem_idを選択する？
    - Number of backtest windows、Backtest window offset
        - 学習する際にテストデータを分割するかどうかみたいな
        - よくわからんのでデフォルトのままで
    - Forecast type
        - よくわからないのでデフォで
    - advanced configuration
        - 高度な設定。無視で
    - Weather
        - AWSが持ってる天気情報（2週間分）を学習に含めるか
        - geolocation型をデータに持っている場合に使用可能（つまりUSかヨーロッパ限定の機能）
    - Holiday
        - AWSが持ってる祝日情報を学習に含めるか
        - 日本も選択できるのでOnにしてみる
- 「Train predictor」ボタンをクリックして学習開始
- 2時間くらい待つ

![Screen Shot 2021-02-01 at 0.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/ad6d1d21-8ae8-4737-f81c-f467df119b48.png)

- Dashboardに戻って、Forecast generationの「Start」をクリックして予測の設定を行う

![Screen Shot 2021-02-01 at 10.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/1e5ec46d-516c-73ab-b348-49aa36c50c19.png)

- 以下項目を入力
    - Forecast name
        - 英数字＆アンダースコアで適当に入力する（例：forecast_sample_forecast）
    - Predictor
        - 先程作成したPredictorを選択
    - Forecast types
        - 空欄で
- 「Create new forecast」ボタンをクリックして予測開始
- 30分くらい待つ

![Screen Shot 2021-02-12 at 2.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/fb1a5d36-4a5a-1e5c-ad46-304cb9460be1.png)

- 「Lookup forecast」ボタンをクリックする

![Screen Shot 2021-02-12 at 2.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/fc0be6a3-f25c-48a4-1df1-392cc05e116a.png)

- 以下項目を入力
    - Forecast
        - 先程作成したForecastを選択
    - Start date
        - 結果グラフの開始日付
        - 予測したデータ行分だけ過去日付を指定可能
        - 今回は予測開始日付の2/1から28日前までを指定可能（つまり1月4日）
    - End date
        - 結果グラフの終了日付
        - 2/28まで予測するのでこれを指定
    - Choose the keys you want to use to filter your forecasts
        - 店舗別に予測するようにしたので、表示する店舗IDを入力
- 「Get Forecast」ボタンをクリックして結果を表示


![Screen Shot 2021-02-12 at 2.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228400/78c589eb-36e3-dfd3-af15-5eeb1705a617.png)
どや

### 結果考察
- 土日の予約数が多いってのは反映されている
- 平日は火曜日が多いってのも反映されている
- だんだん予約数が増加傾向にあることもでている
- 祝日が多いってのは無視されている（2/11が少ない予測になっている）

### 所感
- 日時の単位が分、時、日、週単位なので、30分単位での予測とかは用意されていない
    - 分単位を選択してがんばればできなかないが、それだと最大500行（8時間ちょい）までの予測しかできない
- 祝日多いのが反映できていないのはAWSが用意しているHolidayデータがおかしいのでは？
    - 読み込ませているデータは↓みたい
    - http://jollyday.sourceforge.net/data/jp.html
    - 振替休日考慮されてないじゃん！
- 93行ぽっちのデータでもデータインポート＞学習＞予測で3時間くらいかかる。実データでやろうとするならば、読み込ませるデータ数でどれくらい時間がかかるか注意する