surpriseにある全レコメンドモデルを試す

surpriseとは

surpriseとは明示的な評価データ(explicit feedback)を処理する推薦システムを構築/分析するためのPythonライブラリです。 ※暗黙の評価(implicit feedback)やコンテンツベースの推薦をサポートしていません。
この記事では、surpriseライブラリを使って用意されている全てのレコメンドモデルを試します。この結果をもとに、どんなレコメンドモデルが優勢なのか、あるいは実運用しやすいのか理解が深まるのではないかと思います。

事前準備

本記事の実装は、Google Colaboratory上で行います。 まずはsurpriseライブラリをインストールします。
事前に必要なライブラリをインポートします。

datasetの用意

このdatasetモジュールは、Datasetデータセットの管理に使用されるクラスとその他のサブクラスを定義します。 組み込みでmovielens-100kとmovielens-1Mのデータセットが用意されているので、メソッドを利用することで、簡単に読み込むことができます。
実運用を想定して公式サイトからmovielens-100kのデータセットをダウンロードし、カスタムデータとしてDatasetを作成します。 pandas.DataFrameからロードできるを利用します。またこのメソッドを利用するためには、あらかじめReaderクラスで評価スケール(rating_scale)を定義する必要があります。

データの分割方法

学習データとテストデータを8:2に分割します。(本記事ではこちらのデータセットを使います。)
分割せずに学習とテストで同じデータセットを使うこともできます。

SVDモデルを試す

SVDモデルを試します。関数で学習し、関数で推論します。連結して1文で書くこともできます。最後に4つの指標(RMSE,MSE,MAE,FCP)で評価します。
出力結果:

surpriseにある全てのレコメンドモデルを試す

アルゴリズムの解説

surpriseには11個のアルゴリズムが用意されています。簡単な解説を載せますが、詳しく知りたい方は各自でお調べください。
アルゴリズム概要
NormalPredictor正常なトレーニングセットの分布に基づいてランダムな評価を予測するアルゴリズム。
BaselineOnly特定のユーザーとアイテムのベースライン見積もりを予測するアルゴリズム。
KNNBasic基本的な協調フィルタリングアルゴリズム。
KNNWithMeans各ユーザーの平均評価を考慮した、基本的な協調フィルタリングアルゴリズム。
KNNWithZScore各ユーザーのZスコア(データ群の該当する数値から平均値を引いて、標準偏差で割る)の正規化を考慮した基本的な協調フィルタリングアルゴリズム。
KNNBaselineベースライン評価を考慮した基本的な協調フィルタリングアルゴリズム。
SVD特異値分解。
SVDppSVD++アルゴリズム、SVDを拡張して暗黙の評価を考慮する。
NMF非負行列因子分解に基づく協調フィルタリングアルゴリズム。
SlopeOneシンプルでありながら正確な協調フィルタリングアルゴリズム。
CoClustering共同クラスタリングに基づく協調フィルタリングアルゴリズム。

評価方法

surpriseには、RMSE, MSE, MAE, FCPと4種類のオフライン評価手法が予め用意されています。(詳しく知りたい方は、以下略)

surpriseにある全レコメンドモデルを試すを実装する

11個のレコメンドモデルに対し、4種類のオフライン評価結果と実行時間を測定します。
出力結果:
algormsemsemaefcptime
NormalPredictor1.519782.309721.218490.495762.38026
BaselineOnly0.922740.851460.731270.718981.12585
KNNBasic0.778070.605390.608210.8272819.30517
KNNWithMeans0.772790.597200.604490.8345420.06934
KNNWithZScore0.765430.585890.596110.8294021.54288
KNNBaseline0.751320.564480.585760.8263124.56300
SVD0.671990.451560.531950.885486.83804
SVDpp0.759980.577570.598780.82622277.93482
NMF0.818570.670060.642440.780137.11345
SlopeOne0.858080.736310.674140.7751412.66350
CoClustering0.910660.829300.712260.734652.96320
SVDがスコアも良く、実行時間も短いという結果になりました。