行列分解に基づく推薦システム#

Matrix Factorization#

Matrix Factorization: A Simple Tutorial and Implementation in Python @ quuxlabs

その他の行列分解による推薦#

ALS#

ALS(Alternating Least Squares)

Alternating Least Square (ALS) でCP分解 - でかいチーズをベーグルする

iALS#

iALS(Implicit Alternating Least Squares) はALSの応用的な位置付けのモデル。

通常のALSはユーザーがアイテムに対して明示的な評価を与える場合を想定している。iALSはユーザーの行動履歴などの暗黙的なフィードバック(例:クリック、閲覧、購入履歴など)を扱う。

iALSの論文実装と評価〜推薦システムの手法〜 #Python - Qiita

ライブラリ#

Surprise · A Python scikit for recommender systems.

  • 主に行列分解系を中心に扱っているライブラリ

import time
import pandas as pd
import numpy as np
from surprise import Dataset, Reader, accuracy
from surprise.model_selection import train_test_split
from surprise import SVD, NMF
# data_ml_100k = Dataset.load_builtin(name=u'ml-100k', prompt=False)
# data_ml_100k
ML100K_URL = 'http://files.grouplens.org/datasets/movielens/ml-100k/u.data'
df = pd.read_csv(ML100K_URL, names=["userid", "itemid", "rating", "timestamp"], sep="\t")
df.tail()
userid itemid rating timestamp
99995 880 476 3 880175444
99996 716 204 5 879795543
99997 276 1090 1 874795795
99998 13 225 2 882399156
99999 12 203 3 879959583
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(df_custom[["userid", "itemid", "rating"]], reader)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[4], line 2
      1 reader = Reader(rating_scale=(1, 5))
----> 2 data = Dataset.load_from_df(df_custom[["userid", "itemid", "rating"]], reader)

NameError: name 'df_custom' is not defined
trainset, testset = train_test_split(data_custom, test_size=.2)
algo = SVD()
algo.fit(trainset)
pred = algo.test(testset)
_ = accuracy.rmse(pred),accuracy.mse(pred),accuracy.mae(pred),accuracy.fcp(pred)
RMSE: 0.9338
MSE: 0.8720
MAE:  0.7378
FCP:  0.7007

参考文献#