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で描いてみたい
実装
tensorflowにて実装した。matrix factorizationモデルは、
user, item
埋め込みベクトル&スコアの取得
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参照
gist:uni-3/559aeb67e86fb022b8480263b7608b1c
可視化&考察
作成したダッシュボードはこんな感じ
https://public.tableau.com/app/profile/yuni7627/viz/movie_lens_100k/overviewofmodel
以下4つのダッシュボードを作成した
-
rating score: ratingやscoreのばらつきが気になったので、 その辺りの可視化をしている
-
overview of model: 描きたかったやつ 。特徴ベクトルの考察にも使える
-
recommend: あるユーザに対して、予測score高い順で表示している
-
embeddings: item genre、userごとの特徴ベクトルを閲覧
特徴ベクトルの考察
jawsが割と高めな0は怖い度合い、toy story、star warsとかが高めな3は人気、star warsとtarminatorが高い7はSFっぽさとかを表現してそう
そうすると、user4なんかは怖い映画はあまり好きじゃないのかも、といったことが類推できる
埋め込み空間を解釈するときに各特徴ベクトルをみる、みたいなことを行うらしいが、GUIベースで探索できるのはなかなか面白い
学んだこと
- データを結合するときのファイル拡張子
movie lensのデータは
u.data、u.user
データブレンドで結合すると、フィルターとか結合すると粒度の異なる集計ができないなど取り回しが面倒な部分があり
クロスデータベース結合も面倒だったので movie lensのデータセットに拡張子
.csv