uni farm

implicitでレコメンドを試す

python implicitで暗黙的フィードバックデータからレコメンドモデルを作成した

協調フィルタリングに代表されるようなユーザの嗜好データを用いたレコメンドにおいて、活用できるデータは主に以下の2種類存在する

  • explicit(明示的)データ: ratingなど、ユーザ自信が選んで付けた評価データ

  • impilcit(暗黙的)データ: クリック、購入、などコンバージョンに基づき決められる評価データ

それぞれ、explicitなデータについてはsurpriseが、 implicitなデータについてはimplicitというパッケージが存在する

surpriseは前に試したので、今回はimplicitを試した

データセットはimplicitに組み込んであるlastfmというものを用いた。再生回数についてユーザとアーティストを紐付けたデータになっている

環境

  • python: 3.6.9
  • implicit: 0.4.2

実装

pip install implicit
import pandas as pd
import numpy as np
import implicit
import scipy
# load data
from implicit.datasets.lastfm import get_lastfm
artists, users, plays = get_lastfm()
# train
model = implicit.als.AlternatingLeastSquares(factors=50,
                                    regularization=0.01,
                                    iterations=15)
model.fit(plays)
  • 各ユーザにレコメンド
import tqdm
user_items = plays.T.tocsr()
with tqdm.tqdm(total=len(users[:5])) as progress:
    for userid, username in enumerate(users[:5]):
        artistids, scores =  model.recommend(userid, user_items[user_id])
        for artistid, score in zip(artistids, scores):
            print(("%s\t%s\t%s\n" % (username, artists[artistid], score)))
            progress.update(1)
  • 似ているアーティストを抽出
# artistid, otherartistid, score
user_count = np.ediff1d(plays.indptr)
to_generate = sorted(np.arange(len(artists)), key=lambda x: -user_count[x])
for artistid in to_generate[:5]:
    artist = artists[artistid]
    others, scores = model.similar_items(artistid, 11):
    for other, score in zip(others, scores):
        print(f"%s\t%s\t%s\n" % (artist, artists[other], score))

sparse matrixの形で処理するのでややわかりづらいが、レコメンド用のメソッドが充実しているのでデバッグが便利&いろいろな使い道がありそう

コードはまとめてgistにした

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
view raw implicit.ipynb hosted with ❤ by GitHub

参考

2022, Built with Gatsby. This site uses Google Analytics.