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にした
gist:uni-3/89ef1999772306213b9038095af80aff
参考
-
AIアルゴリズムマーケティング 自動化のための機械学習/経済モデル、ベストプラクティス、アーキテクチャ