【Amazon Personalize】Part.1 概要、データセットの要件

# はじめに
## Amazon Personalize とは
>Amazon Personalize は、アプリケーションを使用するユーザー向けに個別化したレコメンデーションを簡単に追加できる、開発者向けの機械学習サービスです。

抜粋：https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/what-is-personalize.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/e438f52e-fda0-b736-f587-0243633f5bf7.png)

関連記事

- [【Amazon Personalize】Part.2 映画レコメンデーション作成のデモ](https://qiita.com/omiyu/private/cd24449a6f5e33b2ffe2)
- [【Amazon Personalize】Part.3 最新アップデート情報](https://qiita.com/omiyu/private/6ed8f022a8ccef20e550)

# ワークフロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/f770ed31-a3da-5dbd-272d-c5ce93661102.png)

1. 入力データをフォーマットして Amazon S3 にアップロードするか、リアルタイムのイベントデータを送信する。
2. データに適用するトレーニングレシピ (アルゴリズム) を選択する。
3. レシピを使用してソリューションバージョンをトレーニングする。
4. ソリューションバージョンをデプロイする。
5. レコメンデーションを取得する。

詳細：https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/personalize-workflow.html

# レシピの種類

Amazon Personalize では、ユースケースに合わせてレシピ（アルゴリズム）の選択をします。

**① USER_PERSONALIZATION レシピ**
ユーザー向けにパーソナライズされた推奨事項を提供する。

**② PERSONALIZED_RANKING レシピ**
特定のアイテムリストをユーザーの嗜好に合わせて並び替えて提供する。
例：特定カテゴリーのアイテムリストからユーザー毎に並び替えて表示。

**③ RELATED_ITEMS レシピ**
類似アイテムを提供する。
例：よく一緒に購入される商品や、ほかのユーザーも視聴した映画など

詳細：https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/determining-use-case.html#use-cases

# データについての要件

## データセットの種類
次の3つの種類があります。

| 種類 | 説明 | 例 |
|:-----------|------------|:------------|
| Users| ユーザーに関するメタデータ  | 年齢、性別、ロイヤリティメンバーシップなど|
| Items |アイテムに関するメタデータ|価格、SKU タイプ、在庫状況など|
| Interactions（必須）| ユーザーとアイテム間の対話からの履歴データとリアルタイムデータ| ユーザーの場所やデバイスなど、ユーザーの閲覧コンテキストに関するインプレッションデータやコンテキストメタデータ|


## データセットの要件
各データセットには必須フィールド、予約キーワード、および必須のデータ型があります。
予約キーワード：メタデータ以外のオプションのフィールド

| データセットタイプ | 必須フィールド | 予約キーワード | 詳細 | 
|:-----------|------------|:------------|:------------|[リンク](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/users-datasets.html)
|ユーザー|USER_ID (string) <br> 1つのメタデータフィールド (カテゴリstringまたは数値型)| | [リンク](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/items-datasets.html)| 
|アイテム|ITEM_ID (string) <br> 1 つのメタデータフィールド (カテゴリまたはテキストstringフィールドまたは数値フィールド）|TIMESTAMP (long)|[リンク]() | 
|インタラクション|USER_ID (string)  <br> ITEM_ID (string)  <br> TIMESTAMP (long)|EVENT_TYPE (string) <br> EVENT_VALUE (float,null) <br> 印象 (string) RECOMMENDATION_ID (string,null)|[リンク](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/interactions-datasets.html) | 


## スキーマの要件
データセットを追加する前に、そのデータセットにスキーマを定義する必要があります。
データセットの作成後はスキーマを変更できません。

- Avro 形式であること。
- スキーマフィールドの順序とデータファイル内の対応する列ヘッダーの順序を一致させる。
- 各データセットタイプには、スキーマ内に特定の非メタデータフィールドが必要。（前表参照）
- ネストされた構造のないフラット JSON ファイルであること。
- スキーマフィールドは一意の英数字の名前。

## Items データ
価格、SKU タイプ、在庫状況などのアイテムに関するメタデータを格納します。

詳細：https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/items-datasets.html

- **Items スキーマの例**

```json:
{
  "type": "record",
  "name": "Items",
  "namespace": "com.amazonaws.personalize.schema",
  "fields": [
    {
      "name": "ITEM_ID",
      "type": "string"
    },
    {
      "name": "GENRES",
      "type": [
        "null",
        "string"
      ],
      "categorical": true
    },
    {
      "name": "CREATION_TIMESTAMP",
      "type": "long"
    },
    {
      "name": "DESCRIPTION",
      "type": [
        "null",
        "string"
      ],
      "textual": true
    },
  ],
  "version": "1.0"
}
```

- **Items データの例**

```csvs:
ITEM_ID,GENRES,CREATION_TIMESTAMP,DESCRIPTION
1,Adventure|Animation|Children|Comedy|Fantasy,1570003267,"This is an animated movie that features action, comedy, and fantasy. Audience is children. This movie was released in 2004."
2,Adventure|Children|Fantasy,1571730101,"This is an adventure movie with elements of fantasy. Audience is children. This movie was release in 2010."
3,Comedy|Romance,1560515629,"This is a romantic comedy. The movie was released in 1999. Audience is young women."
4,Comedy|Drama|Romance,1581670067,"This movie includes elements of both comedy and drama as well as romance. This movie was released in 2020."
...
...
```
## Users データ
年齢、性別、ロイヤリティメンバーシップなどの、ユーザーに関するメタデータを格納します。

詳細：https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/users-datasets.html

- **Users スキーマの例**

```json:
{
  "type": "record",
  "name": "Users",
  "namespace": "com.amazonaws.personalize.schema",
  "fields": [
      {
          "name": "USER_ID",
          "type": "string"
      },
      {
          "name": "AGE",
          "type": "int"
      },
      {
          "name": "GENDER",
          "type": "string",
          "categorical": true
      }
  ],
  "version": "1.0"
}
```

- **Users データの例**

```csvs:
USER_ID,AGE,GENDER
5,34,Male
6,56,Female
8,65,Male
...
...
```
## Interactions データ
ユーザーとアイテム間のやりとりの履歴データとリアルタイムデータを格納します。

- [インプレッションデータ](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/interactions-datasets.html#interactions-impressions-data)：ユーザーが特定のアイテムと対話したとき（クリックまたは視聴したときなど）に表示されたアイテムのリスト
- [コンテキストメタデータ](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/interactions-datasets.html#interactions-contextual-metadata)：イベント発生時にユーザーの環境で収集する対話データ（ユーザーのデバイス情報など）

詳細：https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/interactions-datasets.html

- **Interactions スキーマの例**

```json
{

  "type": "record",
  "name": "Interactions",
  "namespace": "com.amazonaws.personalize.schema",
  "fields": [
      {
          "name": "USER_ID",
          "type": "string"
      },
      {
          "name": "ITEM_ID",
          "type": "string"
      },
      {
          "name": "EVENT_TYPE",
          "type": "string"
      },
      {
          "name": "EVENT_VALUE",
          "type": [
             "float",
             "null"
          ]
      },
      {
          "name": "LOCATION",
          "type": "string",
          "categorical": true
      },
      {
          "name": "DEVICE",
          "type": [
              "string",
              "null"
          ],
          "categorical": true
      },
      {
          "name": "TIMESTAMP",
          "type": "long"
      },
      {
          "name": "IMPRESSION",
          "type": "string"
      }
  ],
  "version": "1.0"
}
```

- **Interactions データの例**

```csvs:
USER_ID,ITEM_ID,EVENT_TYPE,EVENT_VALUE,LOCATION,DEVICE,TIMESTAMP,IMPRESSION
35,73,click,,Ohio,Tablet,1586731606,73|70|17|95|96|92|55|45|16|97|56|54|33|94|36|10|5|43|19|13|51|90|65|59|38
54,35,watch,0.75,Indiana,Cellphone,1586735164,35|82|78|57|20|63|1|90|76|75|49|71|26|24|25|6|37|85|40|98|32|13|11|54|48
9,33,click,,Oregon,Cellphone,1586735158,68|33|62|6|15|57|45|24|78|89|90|40|26|91|66|31|47|17|99|29|27|41|77|75|14
23,10,watch,0.25,California,Tablet,1586735697,92|89|36|10|39|77|4|27|79|18|83|16|28|68|78|40|50|3|99|7|87|49|12|57|53
27,11,watch,0.55,Indiana,Tablet,1586735763,11|7|39|95|71|1|6|40|41|28|99|53|68|76|0|65|69|36|22|42|34|67|24|20|66
...
...
```

# さいごに

次回は実際に使ってみて手順をまとめたいと思います。（➝[記事](https://qiita.com/omiyu/private/cd24449a6f5e33b2ffe2)）