Amazon Lookout for Metricsを構築してみました

## はじめに
Lookout for Metricsというサービスを触ってみる機会がありましたので学んだことを記載します。
## サービスの概要
Lookout for Metricsとは、AWSが提供する機械学習を利用した異常検出サービスになります。
ビジネスデータや運用データの中から異常を検出(異常検知)し、その原因を迅速に特定するのに役立つサービスになります。

https://aws.amazon.com/jp/lookout-for-metrics/
## 前提
・AWSアカウントがあること
・Lookout for Metricsとのデータ連携にはS3を利用
・データ形式はCSV
※後述しますが、状況によって多額の費用が発生する可能性があるため、設定する値については十分注意してください。
## やること
・異常検知させるデータを作成する
・S3のバケットを作成し、データをアップする
・BacktestモードでLookout for Metricsを設定する

## データの作成
使用するデータについてはAWSの公式でもサンプルがあります。
以下のサイトからloyalty.csvをダウンロードして使用することも可能です。

https://github.com/aws-samples/build-a-loyalty-points-anomaly-detector-using-amazon-lookout-for-metrics/blob/main/loyalty.csv

今回は自作したデータを使ってみます。
なおデータを作成する際には以下の要件がありますので注意してください。

>バックテストに使用されるトレーニング データとテスト データの比率は、トレーニング 70%、テスト 30% です
>バックテストに必要な最小データ量は、データ収集の間隔によって次のように異なります。
>5 分間隔– 約 1 日分のデータ。
>10 分間隔– 1.9 日分のデータ。
>1 時間間隔– 11.8 日分のデータ。
>1 日間隔– 285 日間のデータ。

https://docs.aws.amazon.com/lookoutmetrics/latest/dev/gettingstarted-quotas.html#gettingstarted-quotas-backtest

1日間隔でデータを作成する場合は、最低でも285日分のデータが必要でかつ、Backtestモードでは約200日分はトレーニング(学習)として使用され、残りの85日分で異常検知が行われるということになります。
つまりBacktestモードで異常検知させたい場合は、データの後半30％に異常検知させる値を含める必要があることになります。

上記を踏まえたうえで、今回は以下のようなデータを作成しました。
・Timestamp(日)、Product(製品)、Number(数)の行を作成
・日数は1000日分程度を用意
・製品（product)の異常な数(number)を検知させる
  ここでは12/31の製品Aの数で通常とは違う数値(異常)が出ていることを検知するようにデータを作成しています。
・データ形式はCSVにします

データサンプル
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/2c5be6ab-165d-f6b7-a60f-e6f88042024f.png">

<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/c6bc3a98-8562-9379-2341-5b5a7a5b6cbe.png">

## S3バケットの作成
上記で作成したデータをS3にアップロードします。

AWSコンソールにログインし、S3でバケットを作成します
ここでは「test-bucket-l4m-20240719」という名前で作成しています。
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/c968e002-b4f9-4f8a-59dc-9dbee380308c.png">
他はデフォルトのまま「バケットを作成」を押下します。
作成したバケットを選択し、アップロードから先程作成したCSVファイルを選択しアップロードします。

## Lookout for Metricsの設定
検索窓で「Amazon Lookout for Metrics」と検索します。
「Create Detector」を選択します。
detectorの設定画面に変わるので任意の「Detector name」を入力します。
Intervalを選択します。ここでは1日間隔のデータで作成していますので「1 day intervals」を選択し「Create」を押下します。
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/d9941348-c567-95c3-717f-6e66f2ddf09e.png">
次にdatasetを設定します。
「Add a dataset」を押下します。
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/4e45df01-0352-4054-81ef-4cf78cac4e44.png">
ここでは以下の用に入力します
Name：任意の名前
Timezone ：Asia/Tokyoを選択
Datasource ：S3を選択
Detector mode：Backtestを選択
Historical data：S3のURIからコピーしたものを貼り付けてください
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/27d8e1e4-0655-e6c8-1aaf-0a80b647fe76.png">

「Detect format settings」を押下します
Formatの画面が出ますがデフォルトのままで大丈夫です。
「Next」を押下します。
「Map field」sの画面では以下を設定します。
Measures：Numberを選択します
Dimensions：Productを選択します
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/5222279c-c2b5-462a-1cd4-146bb5dec2cf.png">

Measuresとは異常検出を行う際の分析対象となる数値データになります。
時間に基づくデータポイントであり、異常が発生した際に検出の対象となります。

Dimensionsとは異常検出を行う際にデータを細分化するための属性やカテゴリです。Dimensionsは、Measures（測定値）と組み合わせることで、特定のデータポイントに関する分析を可能にします。

※ Lookout for Metricsの費用はメトリクス数で計算されます。
メトリクス数は「Measures×Dimensions」で計算されます。
そのため、Measuresの数やDimensionsの数が増えると費用が膨大になる可能性がありますので注意してください。
なお最初の月は100メトリクス分の無料枠があるようです。
>AWS 無料利用枠
>Lookout for Metrics は無料で開始できます。サービスの使用を開始すると、最初の月には 100 のメトリクスを分析するまで料金はかかりません。

https://aws.amazon.com/jp/lookout-for-metrics/pricing/

設定を続けます。
Timestamp:Timestampを選択
Format では「Enter a timestamp format Timestamp format」を選択し
「yyyy-MM-dd」と入力します
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/d7bb3ee9-c13f-012d-3356-b89059f59fa9.png">
今回はMeasuresはNumberの1つ、DimensionsはA,B,Cの3つとなります。
値を入力すると見積もりをしてくれます。
問題なければ「Next」を押下します。
確認画面になりますので内容を確認し問題なければ
「Save and Activate」を押下します。
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/6a952df2-c998-779e-431f-66aea7c126f5.png">

内容を確認し問題なければ「confirm」と入力しActivateを押下します。
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/f7a8012c-cee9-7a5f-976f-70aaf5d6241f.png">
検出器をアクティブ化するとコストが発生し始めます。

Detectorのステータスが「Activating backtest...」から
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/d36ed840-7d21-ce13-455c-87794310a139.png">
「 Backtest in progress」になり
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/8b312688-5688-22bb-8fe4-fe96149cf9a8.png">
「 Backtest complete」となれば解析完了です。
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/3db969bd-20da-439c-d5ea-bc1f04c69631.png">

## 確認
作成したDetectorを選択し「Anomalies」を押下すると検知結果が確認できます。
<img width="200" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/b71e7d7f-bbaf-6188-0261-1c61008b3409.png">
どのディメンションでエラーを検知しているか、検知したエラーのメトリックのグラフが確認できます。
今回はCというディメンションで異常を検知しているのがわかります。
<img width="700" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/4823bee8-b8b3-3cd1-8696-08f2ef568f06.png">
またグラフでは異常は青色で表示されます。
<img width="300" alt="IAM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/5a4cb3a6-b49d-ce97-2b2c-4d098a2c3183.png">

ここでは7/24の22：00にcountが1003となっていることが異常として検知されているのがわかります。

## まとめ
Backtestモードに続いてcontinuousモードを記事にしましたが、continuousモードではS3のフォルダ構成をインターバルに合わせる必要があることを知らず、DetectorがなかなかActiveにならず苦労しました。
なお、データ解析を1日インターバルにした場合は、設定やデータに問題がなくてもDetectorがActiveになるまでに48時間ぐらいかかりました。