レコメンド – アイテムベース協調フィルタリング –
こんにちは江口です。
今回は、先日社内勉強会で以下の内容について発表しましたので、ブログでも共有させて頂きます。
【概要】
・アイテムベース協調フィルタリング(商品レコメンド)
- アイテムベース協調フィルタリングを実装してみた
- ユーザーが購入した商品の中からjaccard指数で類似商品を見つけ出す
- 対象商品をベースに同じ商品を購入している別のユーザーが購入した別の商品をレコメンド
- あとdjango 使ってみた
▼技術要件
・python 3.6.1
・django1.9
・heroku
・DB・・・heroku上はpostgress、localはsqlite3
▼レコメンドアルゴリズムについて
今回試してみたのは、「アイテムベース協調フィルタリング」と呼ばれる、商品が主語となる簡易的なレコメンドアルゴリズムになります。
よく見る「この商品を買った人はこんな商品も〜」みたいにオススメしてくるあれです。
アイテムベース協調フィルタリングの一環、「jaccard指数」による類似度算出を実際にコード組んで検証してみました。
▼jaccard指数とは。。。
こんな感じのアルゴリズムです。
例えば、Aさんが買った商品は「商品1」と「商品3」になります。
そしてAさんが買った「商品1」とその他全ての商品がどれだけ商品1と類似しているか?
を
『A&&B / A||B => Jaccard指数』でスコアリングしていきます。
資料の例だと、商品3がもっとも類似してますね。
ただ、Aさんはすでに商品3を購入してますので、除外して、商品4をレコメンドすることもできますね。
▼実際に触って見れます!
上で説明したアルゴリズムを実際に検証できるサンプルシステムを作ってみました。
・画面
https://lit-headland-28550.herokuapp.com/recommend/
(無料枠herokuなので、30分アクセスがないと立ち 上がりに時間がかかることがあります。。ご了承ください。)
ちょっとわかりにくいのですが、擬似的なECサイトを模してます。
「購入者」プルダウンで仮想敵にログインユーザーになったとして、「商品一覧」にある商品の「購入」ボタンを押すことで選択したユーザーで買い物ができます。
買い物が済むと、こんな感じで、購入した商品に類似したレコメンド商品一覧と、ユーザーの買い物履歴が確認できます!
自由にユーザーになりすまし、商品を買ったりキャンセルしたりしてみて、レコメンド具合を確かめて見てください。
私が試した時は、「PHP参考書」購入したら、「Java参考書」と「タンクトップ」がなぜかレコメンドされました。。。
▼ソースコード
ソースコードはgithubで公開してます。
https://github.com/yueguchi/recommend-with-django
要点のみ、紹介させて頂きます。
・商品一覧の取得
商品一覧の取得は、requestをrecommend/view.pyにてrequestw受け取っています。
https://github.com/yueguchi/recommend-with-django/blob/master/recommend/views.py
この中の
def index(request):
"""
商品一覧の閲覧・購入から、レコメンド(jaccardベース)を表示する
"""
# 商品一覧
items = Items.objects.all()
# 購入者一覧(値だけのlistを取得する)
users = Users.objects.all()#.values_list('name', flat=True)
# レコメンド取得
user_name = request.GET.get('user_name', '')
recommend_items = Purchases.getRecommend(Purchases, user_name)