自分をReadyな状態に

今週のタイムライン

エネルギーを奪った出来事(悲しくなった・不幸になったなど)

  • 頑張り続けることでお金はついてくる理論は本当に信じるべきか考えてしまった(日曜日)

エネルギーを与えた出来事(幸せになった・安心した)

  • 朝喫茶で勉強をすること(ほぼ毎日)
  • パン作り(日曜日)
  • 仕事での目標を立てた(月曜日)
  • Amazon Personalizeの勉強(火曜日)
  • 銀行を一つにまとめるための行動(火曜日)
  • 不動産屋巡り(火曜日)
  • アルゴリズムの勉強を進めた(水曜日)
  • 普通に褒められた(木曜日)
  • 今まで一緒に作業していなかった人とペア作業ができた(金曜日)
  • 大学の友人と会話(金曜日)

戸惑った出来事や疑問に思った出来事

  • その場でわからないことを解決するべきか、ちょっと自分で考えてから改めて質問をするべきか(水曜日)

話したいこと

  1. 仕事での目標を立てた
  2. Amazon Personalizeの勉強

自分をReadyな状態に

3月から新たなクォーターがはじまるということで、5月までの目標をたてました。

私は目標を立ている時に「SMARTの法則」にしたがって考えています。SMARTの法則は具体性(Specific)、測定できるか(Measurable)、行動的か(Action-oriented)、関連性(Relevant)、期限(Time-bound)の5つの要素からなる目標設定の方法です。

(ちょっと内容は変えていますが)私が立てた目標の一つはこちらです。 S:チームメンバーがスクラムのプロセスやルールを理解し、スクラムの考えに基づいて行動するようになること M:どれくらい各イベントがチームに浸透したかで達成度を判断 A:自分がファシリテーターをする時に各スクラムイベントの目的を確認する、...(たくさんあるため省略) R:チーム全体の目標を達成するためにこの目標を達成することが重要だと考えている T:5月末まで

個人的に一番大切にしているのは行動的か(Action-oriented)です。目標達成のためには、何らかの変化が必要だと思います。その変化は自分の行動によって起こす必要があります。そこで具体的な行動を考えることによって自らの力で変化を起こすきっかけを作ることができると思っています。そのため、目標を達成するための行動を具体的に考えることが重要だと思っています。

今週は、目標達成のために何を自分がすべきかを考えることができ、自分をReadyな状態*1にすることができたと思っています。

レコメンドエンジンをさくっと作る

知り合いのお手伝いの中で、ユーザにおすすめのコンテンツを推薦する部分を実装する機会がありまして、その際にAmazon Personalizeを使ってみたので、学んだ知識をまとめてみます。

事前知識

Amazon Personalizeを使う際にはいろいろな言葉が出てきますので先にまとめておきます。

用語 内容
データセットグループ データセット、ソリューション、キャンペーン、バッチジョブなどが含まれたもの。
インタラクション どのユーザがどのアイテムに対してアクション(見る、購入するなど)をしたかという情報のデータセット
ユーザ ユーザに関するメタデータのデータセット
アイテム ユーザがアクションを起こすアイテムのメタデータのデータセット
ソリューション 実際のレコメンデーションモデルを作るところ。
キャンペーン リアルタイムで推薦するために使用するもの。(ちょっと料金が高い)
バッチジョブ バッチで推薦するために使用するもの。

実際にやること

ここではAWSのコンソールの画面上での操作で説明します。

1. データセットグループの作成

コンソールにてAmazon Personalizeと検索して、Get startedのボタンを押すと、データセットグループを作成する画面に遷移する。遷移後は名前を指定するだけで作成完了。

2. 必要なデータをS3にアップロード

S3にバケットを作成して、必要なcsvデータをアップロードしておく。また、Amazon Personalizeからのアクセスを許可するため、アクセス許可タブのバケットポリシーに以下のように記述を追加。

{
    "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:::[指定したバケット名]",
                "arn:aws:s3:::[指定したバケット名]/*"
            ]
        }
    ]
}

3. データセット・データセットインポートジョブの作成

データセットにはインタラクション、ユーザ、アイテムの3種類があり、それぞれインポートできるボタンがある。インタラクションは必須だが、それ以外は任意のデータとなっています。

データセット作成の際にはスキーマ(どんなデータかの定義)を作成し、指定する必要があります。スキーマはその場で作成することもできますし、以前作成したスキーマを使用することもできます。Amazon PersonalizeではAvroスキーマという形式で書く必要があります。 以下がインタラクションのスキーマの例です。

{
    "type": "record",
    "name": "Interactions",
    "namespace": "com.amazonaws.personalize.schema",
    "fields": [
        {
            "name": "USER_ID",
            "type": "string"
        },
        {
            "name": "ITEM_ID",
            "type": "string"
        },
        {
            "name": "TIMESTAMP",
            "type": "long"
        }
    ],
    "version": "1.0"
}

スキーマの指定を行うと、データセットインポートジョブの作成画面に移ります。ここではどのデータを用いるかを指定します。 手順2で保存したデータのパスを指定してあげます。

s3://[バケット名]/hoge.csv

これでデータセットとデータセットインポートジョブの作成が完了します。 実際に作成するまでに少し時間がかかります。

ソリューションの作成と行きたいところだったが…

インタラクションの必要データ数が1000データ以上ということでデータセットの作成に失敗してしまいました。

ソリューションを作成するためにはデータセットには以下の条件が必要らしいです。

  • インタラクションは1000データ以上
  • ユーザは2回以上インタラクションに存在するユーザが25ユーザ以上

その他の細かい制約についてはこちらに記載されています。データ数をどうにかあつめて学習まで進めたい気持ちです。

他にもデータセットを作るまでの工程をPythonのboto3とdiscord.pyを使って自動化などもしたが、体力が尽きたので書くのは諦めました…

最後に

先週の日曜日は人生で初めてパン作りをしました。以下の写真は作ってもらった食パンですが、絶品でした。パン作りの機会に誘っていただいたことに感謝です!

f:id:makky_emmanuel:20210313202345j:plain
食パン

*1:スクラムにおいて使う言葉で、実施する上でわからないことや妨げになるようなものがないこと。詳しくはこちらの記事が良さげです。