【Python】scikit-surpriseで推薦エンジンを作成する

Python
この記事は約8分で読めます。

scikit-surpriseは類似度評価や予測モデルを作成するのに適しているPythonライブラリ
です。

2020年4月現在のバージョンは1.1で開発が継続されているため
安心して使えるライブラリになっています。

Home
A simple Python library for building and testing recommender systems.

インストール方法

pipでインストールする

pip install scikit-surprise

ライブラリ使用方法

ドキュメントはこちらです。Getting Startedのコードから学習しましょう。

Getting Started — Surprise 1 documentation
from surprise import SVD
from surprise import Dataset
from surprise.model_selection import cross_validate


# Load the movielens-100k dataset (download it if needed),
data = Dataset.load_builtin('ml-100k')

# We'll use the famous SVD algorithm.
algo = SVD()

# Run 5-fold cross-validation and print results
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

映画のデータセットと、アルゴリズムが提供されており最も簡単なコードは
わずか数行で書くことができます。

Evaluating RMSE, MAE of algorithm SVD on 5 split(s).

            Fold 1  Fold 2  Fold 3  Fold 4  Fold 5  Mean    Std
RMSE        0.9311  0.9370  0.9320  0.9317  0.9391  0.9342  0.0032
MAE         0.7350  0.7375  0.7341  0.7342  0.7375  0.7357  0.0015
Fit time    6.53    7.11    7.23    7.15    3.99    6.40    1.23
Test time   0.26    0.26    0.25    0.15    0.13    0.21    0.06

結果例ですが、ランダム化により実行環境によっては数値が異なる場合があります。

load_builtin

メソッドはmovielens-100kのデータセットを未ダウンロードの場合は保存します。

cross_validate

メソッドは、交差検証を行う関数です。交差検証とは、標本データを分割して
先に一部のデータで解析を行い、残りのデータで解析を行い解析そのものの妥当性を確認する手法です。

交差検証のプロセスをスキップしたい場合は下記のコードを利用し
学習データと検証データに分けることができます。
テストサイズは任意のサイズを指定できます。

from surprise import SVD
from surprise import Dataset
from surprise import accuracy
from surprise.model_selection import train_test_split

# Load the movielens-100k dataset (download it if needed),
data = Dataset.load_builtin('ml-100k')

# sample random trainset and testset
# test set is made of 25% of the ratings.
trainset, testset = train_test_split(data, test_size=.25)

# We'll use the famous SVD algorithm.
algo = SVD()

# Train the algorithm on the trainset, and predict ratings for the testset
algo.fit(trainset)
predictions = algo.test(testset)

# Note that you can train and test an algorithm with the following one-line
predictions = algo.fit(trainset).test(testset)

# Then compute RMSE
accuracy.rmse(predictions)

学習と検証

from surprise import KNNBasic
from surprise import Dataset

# Load the movielens-100k dataset
data = Dataset.load_builtin('ml-100k')

# Retrieve the trainset.
trainset = data.build_full_trainset()

# Build an algorithm, and train it.
algo = KNNBasic()
algo.fit(trainset)

uid = str(196)  # raw user id (as in the ratings file). They are **strings**!
iid = str(302)  # raw item id (as in the ratings file). They are **strings**!

# get a prediction for specific users and items.
pred = algo.predict(uid, iid, r_ui=4, verbose=True)

predictメソッドはデータセット全体にアルゴリズムを適合させ、その結果の評価を
予測する際に使用します。
結果としてユーザー196とアイテム302の結果が得られます。

user: 196 item: 302 r_ui = 4.00 est = 4.06 {'actual_k': 40, 'was_impossible': False}

予測アルゴリズムの使用方法

How to build your own prediction algorithm — Surprise 1 documentation

予測アルゴリズムは自由にカスタマイズすることができます。
クラスを宣言し、コンストラクタを定義します。

from surprise import AlgoBase
from surprise import Dataset
from surprise.model_selection import cross_validate


class MyOwnAlgorithm(AlgoBase):

    def __init__(self):

        # Always call base method before doing anything.
        AlgoBase.__init__(self)

    def estimate(self, u, i):

        return 3


data = Dataset.load_builtin('ml-100k')
algo = MyOwnAlgorithm()

cross_validate(algo, data, verbose=True)

予測アルゴリズムの実用

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import GridSearchCV

# Use movielens-100K
data = Dataset.load_builtin('ml-100k')

param_grid = {'n_epochs': [5, 10], 'lr_all': [0.002, 0.005],
              'reg_all': [0.4, 0.6]}
gs = GridSearchCV(SVD, param_grid, measures=['rmse', 'mae'], cv=3)

gs.fit(data)

# best RMSE score
print(gs.best_score['rmse'])

# combination of parameters that gave the best RMSE score
print(gs.best_params['rmse'])

結果

0.961300130118 {'n_epochs': 10, 'lr_all': 0.005, 'reg_all': 0.4}

ここでは、3分割の相互検証手順で平均RMSEとMAEを評価していますが、任意の相互検証反復子を使用できます。

一度fit()呼び出されると、best_estimator属性は最適なパラメーターのセットを持つアルゴリズムインスタンスを提供します。

タイトルとURLをコピーしました