【Python】映画のジャンルを用いて、Content-basedに映画を推薦する

courseraのgcp講座で紹介されていたContent-basedなレコメンドを、movie-lensで試そうと思います。

https://www.coursera.org/learn/recommendation-models-gcp

上記では、tensorflow1.4での実装でしたが、numpyで行います。

 

流れとしては以下の通りです。

①user×item行列と、item×feature行列を作成する

②ドット積をとり、user×feature行列を作成し、正規化する

③ドット積をとり、user×item行列を復元する

④ユーザーをピックアップしてソートし、Top-Nを出力する

 

今回は、映画のメタ情報として映画のジャンルを利用します。

それでは順番に行きましょう。

 

①user×item行列と、item×feature行列を作成する

genresは変なデータの入り方をしているので、少し前処理が必要です。

 

見方としては、movieId=0はcomedy,Children,Fantasy…のジャンルに属していますよ、ということです。

②ドット積をとり、user×feature行列を作成し、正規化する

このusers_genresは、各ユーザーごとのジャンルの好み度合いのようなものです。

 

③ドット積をとり、user×item行列を復元する

もとのuser×item行列(users_movies)は、未評価(0)が非常に多いスパースなデータでしたが、こうして復元すると、もともと0であったところに、数字が入ります。

(Aさんはこれまでの映画の視聴履歴から、このジャンルはこれくらい好きだとわかりました(=users_genres行列)。ということは、まだ見ていない映画についても、その映画のジャンルからおおよそこれくらいの点数をつけるだろうと予測できる(=users_movies_new))

0を予測値で埋めることができたのは良いのですが、レコメンドで使用するには、すでにユーザーが視聴した映画が推薦されないようにしたいです。

ということで、np.whereで未評価の映画のみの予測値の行列を作ります。

 

④ユーザーをピックアップしてソートし、Top-Nを出力する

見やすくするためにデータフレーム型にします。

userId = 1の人に対して5つレコメンドします。

movieIdでなくタイトルをみえるようにするには…

 

最後まで読んでいただきありがとうございました。