モデルベースレコメンドで次に参加すべき声優イベントは予測できるか

今年もいくつかの声優イベントに参加していて、毎回チケットを取らなければならないことが面倒に感じるようになりました。

自動で申し込みを行う仕組みを作ろうとすると、参加するイベントを正確に予測する必要があります。
個人が参加すべきイベントなんてほぼ決まっているはずし、多少なら外してもそれはそれでいろんな声優を知るきっかけになっていいと思います。
そのような背景から、機械で予測するのも簡単だろうと思ってレコメンドアルゴリズムを試してみました。

という建前のもとで、最近勉強したTranslation-based Recommendationという手法を紹介します。

ちなみにこの記事のオチは、「コンテンツベースでやれ」となります。

# Translation-based Recommendation
Translation-based Recommendation(TransRec)はHe等によってRecSys2017で提案されたレコメンドアルゴリズムです。

一般的なモデルベースレコメンドはユーザー・アイテム間のインタラクションをモデル化して次のアイテムを予測しますが、今回想定しているケースはもう少し複雑です。
各ユーザーに対して、現在のアイテムと一時刻前のアイテムから一時刻後のアイテムを予測するという問題を扱います。

一般的な行列分解では直接解けないので、通常は問題をユーザー・アイテム間の関係とアイテム同士の時系列的な関係をそれぞれ求めるという2つのサブタスクに分解するそうです。

これに対してTransRecは、ユーザー・一時刻前のアイテム・現在のアイテムという関係を直接モデル化します。

ちなみにこの手法は、RecSys2018において、Translation-based factorization machinesという強そうなモデルにアップデートされています。


## モデル
TransRecではアイテムを**transition space**という空間に埋め込み、ユーザー毎に定義される**translation vector**というベクトルを作用させて購買行動の変化を表現します。

```math
\vec{\gamma_i} + \vec{T_u} \approx \vec{\gamma_j}
```
ここで、$i,j$はprevious,currentの関係です。
$\vec{T_u}$はユーザーのtranslationを表していて、global translation$\vec{t}$とユーザー毎のtranslation vector$\vec{t_u}$に分解できます。

```math
\vec{T_u} = \vec{t} + \vec{t_u}
```

TransRecの学習は、$(u, i, j)$というtripletが与えられたとき、以下の確率を最大化することを目指します。

```math
P(j|u, i) \propto \beta_j - d(\vec{\gamma_i} + \vec{T_u}, \vec{\gamma_j}), \\
\text{subject to} \ \ \vec{\gamma_i} \in \Psi \in \Phi, \ \ \text{for} \ \ i \in I
```

$\beta_j$はアイテム$j$のバイアス、$d(\cdot,\cdot)$は遷移先のpointとターゲットとなるアイテムのpointの距離です。両者をなるべく近づけるように学習します。

制約条件は、$\vec{\gamma}$のノルムが1を超えないように制限しています。

学習に用いる尤度関数はBayesian Personalized Ranking(BPR)として定式化します。$(u, i, j)$に対する負例を$(u, i, j')$として、以下のようになります。

```math
l(u, i, j, j'|\theta) = \ln\sigma(P(j|u, i;\theta)-P(j'|u, i;\theta)) + \ln P(\theta)
```

## 推薦
推薦するアイテムは、$\vec{\gamma_i} + \vec{T_u}$のk近傍ということになります。
バイアスを考慮しながら距離を求めるのは少し面倒ですが、著者が近傍探索時の変形を提案しています。

まず、アイテムバイアス$\beta_j$を$\beta_j'=\beta_j-\max_{k \in I} \beta_k$に置換します。続いて、アイテム埋め込みベクトル$\vec{\gamma_j}$に変形したバイアスをconcatします。例えば、距離がユークリッドノルムなら、新しい埋め込みベクトルは$\vec{\gamma_j'}=(\vec{\gamma_j};\sqrt{-\beta_j'})$となります。最後にクエリには0をconcatして、$(\vec{\gamma_i} + \vec{T_u};0)$の近傍探索を実行します。


# 実験
著者が公開しているコードをほぼそのまま使いました。C++ですがとてもシンプルに書かれていて人の言語の温かみを感じます。

## ZOZOTOWN
一応ZOZOテクノロジーズのアドベントカレンダーですので、ZOZOTOWNの購買ログ約1ヶ月分、数百万件のトランザクションを使って検証しました。
テストデータに対するAUCとHitRate@50は以下のようになりました。

|        |       AUC |    HitRate@50    |
|:-----------------:|:------------------:|:------------------:|
| BPR-MatrixFactorization|   0.797 |   0.0326      |
| TransRec           |        0.848 |      0.0811       |

HitRate@50でBPRにダブルスコアしてます。

## イベンターノート
声優イベント管理ツールである[Eventernote](https://www.eventernote.com/)が提供しているノートという機能のデータを使います。ユーザーは自身が参加したイベントの記録をノートという形で残します。すなわち、ノートを集めればユーザーとイベントの関係データが手に入ります。
学習に用いたデータの統計は、ユーザー数が約4万、イベント数約1.2万、トランザクション数は約190万件です。

|        |       AUC |    HitRate@50    |
|:-----------------:|:------------------:|:------------------:|
| BPR-MatrixFactorization|   0.869 |   0.166      |
| TransRec           |        0.973 |      0.379       |

こちらもBPRに対して圧勝してます。AUC0.97とかいうスコアは初めて見ました。

イベントベクトル(アイテムベクトルと同義)をUMAPで圧縮しました。TransRecは遷移を考慮しているので、同じ声優が出演するイベントのembedが狭い範囲に密集するとは限りません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66317/edc23c1c-d4b8-424a-1424-bd893fc51a09.png)

イベント開催日で色分けしてみると、見事に時間が反映されています。青が過去、赤が未来を表しているので、反時計回りに遷移していくことがわかります。学習データには一時刻前のイベントIDしか与えておらず、timestampを使っていないのですが、このようなembedになるのは面白いですね。
localに見ると、ファン層の近いイベントが凝集するなど、一定の傾向があることが確認できました。


# 参加すべきイベントを予測する
実際に私が参加した水樹奈々さんの2018年ツアーの千秋楽、「[NANA MIZUKI LIVE ISLAND 2018 WAVE12 埼玉公演](https://www.eventernote.com/events/145370)」の次に参加するイベントを予測してみました。
もちろん$\vec{t_u}$には私のtranslation vectorを使います。


|event_name| event_date|
|:-:|:-:|
|アニエラフェスタ2018|2018-09-01|
|TREASURE05X -HEARTS OF THE TREASURE- 9/8|2018-09-08|
|1stSG「インコンプリートノーツ」リリースイベント AKIHABARAゲーマーズ本店|2018-09-01|
|「パンプキン・ミート・パイ」リリース記念イベント 東京・アニメイト、ゲーマーズ|2018-09-09|
|「少女☆歌劇 レヴュースタァライト」OPシングル発売記念イベント「レヴュー“星のダイアローグ...|2018-09-01|
|明治安田生命J3リーグ アスルクラロ沼津vsギラヴァンツ北九州「沼津・ひものマッチ」|2018-09-02|
|Roselia Fan Meeting 2018 1回目 ライブビューイング|2018-09-17|
|第6回キムチクラ（アニクラ）ゲストDJ：桜咲千依|2018-10-06|
|万博へGO with MBS 2018『アッパレオレたちゴチャ祭～万博からやってまーす～』公...|2018-09-15|
|立花理香 1st LIVE(仮)打ち上げパーティー|2018-09-02|

・・・なんか違います。確かにレヴュースタァライトは舞台見に行きましたがリリースイベントには行っていません。

私のイベント参加傾向が特殊かもしれないので、近くの人と混ぜて中和します。

translation vectorをKMeansでクラスタリング後、私が属するクラスタのセントロイドをtranslation vectorとして入力しました。

|event_name|event_date|
|:-:|:-:|
|「パンプキン・ミート・パイ」リリース記念イベント 東京・アニメイト、ゲーマーズ|2018-09-09|
|立花理香 1st LIVE(仮)打ち上げパーティー|2018-09-02|
|アニエラフェスタ2018|2018-09-01|
|「パンプキン・ミート・パイ」リリース記念イベント 東京・ソフマップ|2018-09-09|
|小松未可子 TOUR 2018 “Personal Terminal” 大阪公演|2018-09-08|
|『劇場版 のんのんびより ばけーしょん』舞台挨拶　角川シネマ新宿　10:00の回|2018-09-08|
|TREASURE05X -HEARTS OF THE TREASURE- 9/8|2018-09-08|
|麻倉もも1stアルバム「Peachy!」予約キャンペーン タワーレコード渋谷店|2018-09-18|
|「ノーフューチャーバカンス」発売記念トーク＆ミニライブ＋お見送りハイタッチ会「裏ハイタッチ☠...|2018-09-02|
|THE IDOLM@STER CINDERELLA GIRLS SS3A Live Soun...|2018-09-08|

ground truthは上坂すみれさんの3rdアルバムリリースイベント「[裏ハイタッチ☠メモリー](https://www.eventernote.com/events/160651)」です。9個目に正解が出てきてくれました。

でもお膳立てしてようやくなので、できたとは言えないですね。

ところで、本記事を投稿した12月19日は上坂さんのお誕生日です。上坂さんおめでとうございます。



# まとめ
- Translation-based Recommendationは単体のレコメンドアルゴリズムとしては結構強力
- イベントの推薦はコンテンツベースで良い
- embeddingのmapは手法の特性が反映されていて面白い

それでは、До свидания