Pythonで推薦アルゴリズムを試す(scikit-surpriseを使う)

Pythonで推薦アルゴリズムのパッケージを探していたところ、scikit-surpriseというパッケージが便利そうだったのでメモです。

このパッケージは、データの取り込み、予測アルゴリズム、テストデータによる評価などの機能をが用意されています。

ひとまず試してみる

アルゴリズムは類似度、近接、matrix factorizationなど基本的なものは揃っているようです。

いったん、入門の内容をおってみます。

#SVDのアルゴリズムを用いる
from surprise import SVD
#モデル評価用
from surprise.model_selection import cross_validate

#データセット
#よくある MovieLense
from surprise import Dataset
data = Dataset.load_builtin('ml-100k')

#モデルをつくる
svd = SVD()

#モデルの検証(rmse,maeで5クロスバリデーション
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

#fit
svd.fit(data)

データの作り方

モデルが使えるデータにするには、専用の形に変換する必要があるようです。 ファイルから読み込む方法と、DataFrameを変換する方法があります。

ファイルから読み込む場合は、readerインスタンスをつくって、それを元に変換するようです。

#ファイルから読む場合
from surprise import Reader

#フォーマットをReaderオブジェクトに渡す
reader = Reader(line_format='user item rating timestamp', sep='\t')

#fileパスと上記のインスタンスからデータをつくる
data = Dataset.load_from_file(file_path, reader=reader)

同様にDataFrameから作ることもできるようです。使うメソッドがload_from_dfになります。また、以下ではratingの範囲を指定してます。

import pandas as pd


df = pd.DataFrame(
    {'itemID':[],
     'userID':[],
     'rating':[]
    }
)

reader = Reader(rationg_scale=(1,5))

data = Dataset.load_from_df(df[['userID', 'itemID', 'rating']], reader)

予測の方法

ratingのモデルを作った場合の予測は、fitしたモデルにpredictするだけです。この場合はscoreの予測になるので、それのtop_nを取ればレコメンドに使えそうです。

#user_idとitem_idをstringで渡してその組み合わせのrateを予測
pred = svd.predict(uid,iid)

またレコメンドの場合はアイテム間の類似度(ここでは同じユーザがみているか)から出す場合もあります。

その場合は類似度を計算して、近いものを出すことにします。

#類似度が使えるアルゴリズム
from surprise import KNNBasic

#類似度の設定
sim_options = {'name': 'cosine',
               'user_based': False  
               }

knnb = KNNBasic(k=5, min_k=1, sim_options=sim_options)
knnb.fit(data)

#類似度の取得
similarities = knnb.compute_similarities()