matrix factorizationを使用してmovie lensのデータから映画のレコメンドモデルを作成し、tableauで可視化してみる

なんとなくtableauで行列を表現したらどうなるだろうか、と思いやってみた

環境

  • python: 3.7
  • tensorflow: 2.2
  • tableau: 2020.2.2

データセット&モデル

データセットはmovie lensを用いた。userごとのitem(映画)のrating値情報が入っている。またuser、itemの属性も入っている

matrix factorizationを簡単に説明すると

userが評価したitemを行列形式(rating)で表現する。行列分解を行い、各々k次元の特徴(埋め込み)ベクトルで表現する。特徴ベクトルの内積(score)が元のratingに近づくように更新していくことでscore行列を得る。score行列より、あるuserに対するitemの評価値が予測できる

となる。要するにこんな感じの図をtableauで描いてみたい

matrix factorization drawing matrix factorization drawing

実装

tensorflowにて実装した。matrix factorizationモデルは、user, item行列についてのembedding層と、それらの内積からなる

matrix factorization keras matrix factorization keras

埋め込みベクトル&スコアの取得

tableau表示用データとして、特徴ベクトルと算出したスコアを保存する

モデルの各embedding層からweightを取得した。スコアは、それらの内積とした

# embedding
pd.DataFrame(model.layers[2].get_weights()[0]).to_csv('./user_emb_8.csv')
pd.DataFrame(model.layers[3].get_weights()[0]).to_csv('./item_emb_8.csv')

# score
df_scores = pd.DataFrame(model.layers[2].get_weights()[0] @ model.layers[3].get_weights()[0].T).stack().reset_index()
df_scores.columns = ['user_id', 'item_id', 'rating']
df_scores.to_csv('./scores.csv', index=False)

全体のコードはgist参照

可視化&考察

作成したダッシュボードはこんな感じ

以下4つのダッシュボードを作成した
  • rating score: ratingやscoreのばらつきが気になったので、 その辺りの可視化をしている

  • overview of model: 描きたかったやつ。特徴ベクトルの考察にも使える

  • recommend: あるユーザに対して、予測score高い順で表示している

  • embeddings: item genre、userごとの特徴ベクトルを閲覧

特徴ベクトルの考察
movie lens matrix movie lens matrix

jawsが割と高めな0は怖い度合い、toy story、star warsとかが高めな3は人気、star warsとtarminatorが高い7はSFっぽさとかを表現してそう

そうすると、user4なんかは怖い映画はあまり好きじゃないのかも、といったことが類推できる

埋め込み空間を解釈するときに各特徴ベクトルをみる、みたいなことを行うらしいが、GUIベースで探索できるのはなかなか面白い

学んだこと

  • データを結合するときのファイル拡張子

movie lensのデータはu.data、u.userなど拡張子が割と自由だが、tableauでテキストデータとして読み込む際、特定の拡張子以外(.csv, .txt, .tsvなど)のデータ同士は"ファイル"一覧に出てこず、結合できなかった

データブレンドで結合すると、フィルターとか結合すると粒度の異なる集計ができないなど取り回しが面倒な部分があり

クロスデータベース結合も面倒だったので movie lensのデータセットに拡張子.csv付けて対処した

参考