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()