機械学習を始めとしたコンピュータサイエンスを主に扱っています。この広告は、90日以上更新していないブログに表示しています。pythonamazonやNetflixで使われているレコメンドシステムに突然興味を持ったので、推薦システムの勉強をしたのでpythonで実装してみました。勉強のアウトプットなので、間違っていたらご指摘いただけると幸いです。最後に推薦システムとはamazonでモノを買ったりすると、「この商品をチェックした人はこんな商品もチェックしています」みたいな推薦をしてくれますよね。あれが推薦システムで、特定のユーザーに対してどのモノを推薦すべきかを決定するシステムのことを推薦システムといいます。その中でも、すべてのユーザーの嗜好に応じて異なる推薦のリストを提示するシステムが個人化推薦といいます。複数のアプローチを組み合わせたハイブリッド型があります。これをユーザーBに提案することは合理的だといえます。この技術を協調フィルタリングと呼んでいます。協調型推薦を考える上で、以下の問いに答える必要がでてきます。対象ユーザーの評価データ入力して、過去の嗜好と似ている他のユーザー(=ピアユーザー)を特定する対象ユーザーがまだ見ていないモノに対する評価をピアユーザーの評価を用いて予測するユーザーベース推薦は以下の2つの仮説に基づいています。ユーザーが過去に似た嗜好をもっているなら、その嗜好は将来においても似ているユーザーの好みは長い間一貫している実際この辺りの仮定は少し無理があるので、amazonとかは別の手法を用いているみたいです。この辺りはまだ知識不足なので、よくわかってません笑このあたりを基礎知識として、ユーザーベース推薦を実装してみました。使用するデータセット今回利用するのはMovieLensデータセットです。https://grouplens.org/datasets/movielens/MovieLensデータセットは推薦システムの開発やベンチマークとしてミネソタ大学の研究グループが公開してくれています。Datasetを使用します。ベンチマーク(参考コード)推薦システムの実装で使われていることが多いので、他の人のコードを眺めながらできるのは非常にありがたいです。ちなみに以下のgithubのコードをベンチマークとして実装しています。precisionで19.69%を目標とすることになります。実装データの読み込みデータは手元にダウンロードして、使用しています。dataとなっているみたいです。sep='\t')データとしては以下のような内容です。データの全容としては、943ユーザーによる1682アイテムに対して1~5の評価をしているレビューサイトのデータという感じです。amazonをイメージしてもらえると理解の助けになると思うのですが、全員がすべてのアイテムのレビューをしているわけではないので、非常に疎なデータセットになっています。884182806類似したユーザーというけれど類似したユーザーを膨大なユーザーの中から探し出すのか?→今回はすべてのユーザーと総当たりで類以度を計算して、上位何人かを類似したユーザーと定義します。そもそも類似ってなに?→類以度という概念を導入してユーザー間の類似を表現します。類似ってどうやって測る?→類似度にも様々な表現方法があるのですが、今回はコサイン類以度を採用します。新規のユーザーでまだシステムの利用履歴がないけどどう対処する?ユーザーに関して利用できるデータが少ない場合はどうする?類似ユーザーを探す以外に特定のユーザーがあるモノを好きかどうかを予測できる手法は存在する?→上の3つに関しては今回は範囲外としてまた別のタイミングで扱うことにします。今回の記事で扱う話を整理したので、それぞれに注目して行きたいと思います。今回類以度として採用したコサイン類以度は2つのベクトルを用いて以下のように定式化できます。コサイン類以度は、0から1の値を取りベクトル同士の成す角度の近さを表現しています。推薦システムの文脈でコサイン類以度を考える場合には、ユーザーが異なることを気をつける必要があります。ユーザーAは甘めに評価する一方で、ユーザーBは辛めに評価する傾向にあるといったところを考慮する必要があるということです。これは、ユーザーの評価値の平均をそのユーザーの評価から引くことで解決でき、これを調整コサイン類以度といいます。実装としては、以下のように実装しています。下のmean_adjustment=Trueとすると調整コサイン類以度になります。np.linalg.norm(v2))下準備ここではindexがuser_id、columnsがitem_idになるような評価値行列を作成しています。ユーザーが今回評価をつけていないところは0としました。調べてみると、Rの推薦システムのライブラリrecommenderlabも欠損は0としているみたいなので、とりあえずこれで進めていきます。以下がメインの実装部になっています。user1には参考にしたコードでテスト用に5人選抜していたので、そのまま流用しています。実際にuser1が購入したリストと比較してprecisionで評価これを実行するとprecisionが22%になり、少し高いような気がしますが参考にしたコード付近のprecisionになりました。len(precision_list)))最後にコードは以下においてあります。ユーザーベースは理解できた気がするので次はアイテムベースに挑戦します。間違いなどがあればコメントに書いていただけると幸いです。参考にした以下の文献に感謝です。情報検索における潜在意味解析ユーザーベース協調フィルタリングを実装してみた月別アーカイブはてなブログをはじめよう!leisurelabさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。