Amazon Personalizeハンズオン!!

## 内容
・趣旨目標
・参考サイト
・使用できるサービス
・概要理解
・やっていく

## 趣旨目標
AWSにおいてAIを活用したサービスをハンズオンを通じて理解する。
AI/ML サービスの全体感を掴む。なんなら業務改善も視野に入れたい。

## 参考サイト

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-AIML-2022-reg-event.html?trk=aws_introduction_page

## 使用するサービス
・Amazon Personalize 

## 概要理解
最初にAI/ML サービスとは。
分かりやすい説明
https://www.ctc-g.co.jp/solutions/cloud/column/article/27.html
公式資料
https://aws.amazon.com/jp/builders-flash/202401/awsgeek-ai-ml-services/?awsf.filter-name=*all
超簡単にまとめると人工知能と機械学習を簡単に始められるサービス。と認識して進めます。

## やっていく
Amazon Personalize 
これは簡単に言うと、ユーザーの好みや行動履歴を分析するもの。
もっと簡単に言うと、ネット検索の中でおすすめが勝手に出てくる便利なものの原理と同じ！

・「amazon personalize データセット」で検索
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/datasets-schemas-overview.html
ここでは、誰が（メタ情報）、何を（アイテム情報）、いつ、何をしたなどのデータセット。

・「amazon personalize レシピ」で検索
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/working-with-predefined-recipes.html
次に、私なりの超簡単解説によると、「レシピに基づいて学習させて、最適解を出すもの。」と解釈しました。詳しくは公式を参照

・全体の流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/57a76187-cd03-9c05-6bfd-bd70e57441cb.png)
１　データインポート。
２　サービスを作成
３　予測する。
流れとなります。

・ここで簡単に、Forcastとの違いについて触れます。
Forcastは、何が、どれだけ、売れるかを予測することに比べ、
Personalizeは、誰が、何をしたか、何をするか、を予測します。
組み合わせると怖いほど物が売れそうですね。。。
整理できたところで実際に作業します。



## 作業開始
・ハンズオンのためのデータをダウンロードする。
（途中で使用するバケットポリシーや仮想的なデータがあります。）
・S3から設定していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2affde7f-13a8-ef82-8391-361b736a726d.png)
一意のネームを付ける。

### データの前処理を行います。決まった形にするのが基本です。
公式さんが作成したデータをコンソール上で設定するスキーマと整合させます。
１　EVENT_TYPEのカラムを追加する。
２　適当なビデオ視聴状況を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/126d1b3b-afb6-38dd-2fcd-068af8a6b840.png)

### S3にデータをアップロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/23981ef1-2136-b632-9781-40e2018ed3ef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/ae404094-2dc5-f401-820b-968f124118a5.png)


### IAMポリシー・ロールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1a9b662d-4bef-860d-9703-d98ddaf2675d.png)
公式さんが作成したバケットポリシーはハンズオンデータに存在しますが、PersonalizeからS3にアクセスするための権限が不足するため、手作業で作ります。

ポリシー作成
ナビゲーションバーから、ポリシーを先に作成していきます。
JSONをクリックし、次のポリシーを記載ペーストします。
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/granting-personalize-s3-access.html
バケット名は任意（bucket-name）です。
```
{
    "Version": "2012-10-17",
    "Id": "PersonalizeS3BucketAccessPolicy",
    "Statement": [
        {
            "Sid": "PersonalizeS3BucketAccessPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/0e79e0cc-5e9f-56cf-ab3f-1a2faef367ec.png)


ロール作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8d235f23-0bf7-7677-fe04-e2951d92746a.png)
エンティティは「AWSのサービス」、ユースケースは「personalize」。
先程作成したポリシーを検索してアタッチしていく。その他は触りません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1b39c1c7-2a39-d50c-7a81-902ebd68736b.png)

### 次はS3のバケットポリシーを設定します。
personalizeからS3への接続は設定しましたが、S3側の設定をしていないので、設定します。
https://repost.aws/ja/knowledge-center/personalize-import-insufficient-privileges-s3-error
バケット名は書き換えてポリシーを追加しましょう。
```
{
  "Version": "2012-10-17",
  "Id": "PersonalizeS3BucketAccessPolicy",
  "Statement": [
    {
      "Sid": "PersonalizeS3BucketAccessPolicy",
      "Effect": "Allow",
      "Principal": {
        "Service": "personalize.amazonaws.com"
      },
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE_BUCKET/*"
      ]
    }
  ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/cf1a1b44-4ac0-7026-31d6-54e340a6c06f.png)





### personalizeの設定
オレンジのボタンから開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c0b5066f-2ccb-082a-8f07-e381481b30f7.png)

ナビゲーションバーの「create dataset group」をクリック。
任意の名前を付けて、ドメインはビデオを選択します。データ型が決まっているので、選択を失敗すると手戻りが発生しちゃいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/0c14d14a-b108-772e-46c1-391bc918f0bd.png)

再びオレンジのボタンから「iteminterractions dataset」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/98e25354-84d4-7b01-82b7-fca29959a076.png)

直接インポートを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1507e979-592f-9ff1-b55b-2ddb7551a562.png)

データセットの名前を付けて、新たにスキーマを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b0b78d4c-9cf0-21b7-4b29-2b4ca3b3f336.png)

スキーマはデフォルトで大丈夫です。CSVデータをスキーマの定型に合わせているためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/91578795-d531-6f52-58bf-b14cd19b7aa4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9a8822eb-4814-a57d-82e3-fb34b75d3aad.png)

次にjob名を決めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/ca3b759f-4b72-a14e-59d4-b6fbfd0d4d12.png)

そして、S3の画面からオブジェクトのURIをコピーしてきて、personalizeの画面に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/dec6cf18-7467-f132-70d5-0526a634eab1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/12384fee-067e-29ef-8898-dcce09809ac3.png)


IAMロールを選択します。先程作成したロールをアタッチします。
IAMの画面からARNをコピーしてきて、personalizeの画面に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/57b6cadf-52e3-472c-814e-c0ed5cf7509a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/bab80626-7a61-4d1a-8997-58d8262db17a.png)
そしてインポートを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/fcf37036-0e18-2a0d-df5f-d299ca61fe4c.png)


### ソリューションを設定していきます。
ナビゲーションバーの下の方の「Solutions and recipes」をクリック。
「create solution」から設定を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b0e88fcd-f64c-8f63-799b-25cb11cd0f8b.png)
https://docs.aws.amazon.com/personalize/latest/dg/customizing-solution-config.html
https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html#user-personalization-features
今回はユーザーが何をしたいかを知りたいこともあるので、「User-Personalization」を選択します。
補足としてオプションが充実しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/97dac23e-743c-ad1b-b6b4-d0a8d7059754.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/09714aad-bcd9-16ed-0c4b-b968abb12a3c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/289dd549-956c-76ff-1dd3-53e288060ea0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d587081d-ca34-7152-a9e6-323e9b08f75b.png)

### キャンペーンを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1c30417f-32b0-6781-6db3-c454bc28fb79.png)

最終的な予測する工程に入っていきます。名前を決めて、先程作成したソリューションを選択し、推奨設定のバージョン（今は１つしかない。）を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d34f8120-c165-96fc-9880-243dd0ba0a03.png)

スループットによって自動的にスケールするようです。ミニマム１ということ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/e6666971-fb6e-6f44-7ce6-bb6acf2ad9fd.png)

ここはおすすめをどれくらい推すかの設定。デフォルトでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/265e72d5-525d-cfe5-fdba-831fb0e9c0ed.png)
作成ができたら、実際にコードではなく、コンソールで試すことができます。

画像の例であると５番さんに上から順番におすすめの映画が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/232f737a-c335-251d-bb4f-24af6ef38978.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/166238d6-fd82-54ca-20c0-2343138bba8d.png)

ここまで基本的な設定はできましたが、もしチューニングする場合は、次の公式サイトを活用する。
https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/working-with-training-metrics.html


### 一口メモ（CloudShellでのリソース削除）
なんせ動きがもっさりしています。エラーを出してしまうと再び作り直すのに時間がいくらあっても足りません。こういった時に以下のコマンドをお試しください。

personalizeにおいてデータセットグループを作成してすぐに削除を使用とすると、次のようなエラーが出ます。画面上で作成が完了していても、実際は作成に数十分かかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d5af6408-5265-b51e-6860-3c5eedfc9192.png)

最初に次のコマンドで消したいデータセットのARNを確認します。そのために、データセットグループのARNから調べます。
```:CloudShell
aws personalize list-dataset-groups
```
そして、次のコマンドでデータセットのARNを調べます。
```:CloudShell
aws personalize list-datasets --dataset-group-arn <データセットグループのARN>
```

データセットを削除します。
```:CloudShell
aws personalize delete-dataset --dataset-arn "<データセットのARN>"
```

次にスキーマを探します。
```:CloudShell
aws personalize list-schemas
```

スキーマを削除します。
```:CloudShell
aws personalize delete-schema --schema-arn "スキーマのARN"
```

次に削除したいデータセットグループのARNを探します。
```:CloudShell
aws personalize list-dataset-groups
```
見つけたら消します。
```:CloudShell
aws personalize delete-dataset-group --dataset-group-arn "<データセットグループのARN>"
```

## リソースの削除
ハンズオンが終了しましたので、通常の削除方法を記載します。

１　Campaignsを削除します。（10分以上かかります。）
ここでしっかり時間をかけることで、以降の削除でエラーが出にくいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2ab7bde3-5804-9ea6-c475-f0067e90ff3e.png)

２　Solutions and recipesを削除します。
赤枠をクリックした後の画面で削除を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3561202e-3c74-f897-a12a-9d890448f549.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2797c132-2dba-6793-b622-7a3e4c6dc620.png)

３　Datasetsを削除します。
赤枠をクリックした後の画面で削除を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/11a3d8c0-53a9-e96c-d9c6-24d5718e16a1.png)

４　Manage dataset groupsを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b56a6446-b47e-f6f3-17bd-9e23cb2e0ab9.png)

５　S3バケットを削除します。
空にしてから、削除ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/4b090c75-d57b-c995-957d-0e4c017b378a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2b5a63fe-deef-bc16-f9c3-c2e3a18428f9.png)



凄く勉強になりました。普段接しているおすすめ機能がこのようなアルゴリズムで作られていて、実際に活用されているのが驚きと感動があります。使いこなすまで専属で扱うくらいしないと、実用性が低いかなと感じました。
全般最近行ったハンズオンで一番エラーがきつかったように思います。動作が遅いために、CloudShellで削除したりと、勉強にはなりました。

では！