色んなレコメンドアルゴリズムを一瞬で構築できるRecBoleを触る

2022/07/31に公開


(公式ドキュメントより拝借)

RecBoleとは

統一されたインターフェースで、機械学習アルゴリズムの中身をほぼ意識せず、複数のレコメンドアルゴリズムを構築できるライブラリ

モデル名、データセットの設定、その他学習の設定などを渡して実行するだけ。

run_recbole(
            model=model_name,
            dataset=dataset_name,
            config_file_list=[config_files],
            config_dict=parameter_dict,
        )

RecBoleでモデルを作成する際の流れ

  1. データの準備
  2. データのAtomic Files形式へ変換
  3. 学習するモデルを指定してモデルの学習コマンド実行

という工程を踏む必要があります。

ダミーデータで実行

ディレクトリ構成は下記のようにしました

src
├── converter
│   ├── dataset.py
│   └── main.py
└── recbole
    ├── config.yml
    └── execute.py

1. データの準備

下記のデータを使いました。
https://www.kaggle.com/datasets/CooperUnion/anime-recommendations-database

Explicit(ユーザーが明示的に評価している)データですが、普段使う機会が多いのはImplicitなデータだと思います。

なので、今回は無理やり、Implicitなダミーデータに変換します(実際にモデルを構築される際にはやらないでください)

2. データをAtomic Files方式へ変換

dataset.pyファイル以下では、カスタムのデータに対応させるため、BaseDatasetクラスを継承したANIMEDatasetクラスを宣言しています。
BaseDatasetクラスは、下記リポジトリのbase_dataset.pyをほぼそのまま使っています。

https://github.com/RUCAIBox/RecSysDatasets/blob/master/conversion_tools/src/base_dataset.py

ANIMEDatasetクラス内にAtomic Files形式へ変換するための設定を書き込みます。上記リポジトリのextended_dataset.pyに該当する部分を書換えたものです。

src/converter/dataset.py
class ANIMEDataset(BaseDataset):

    def __init__(self, input_path, output_path):
        super(ANIMEDataset, self).__init__(input_path, output_path)
        self.dataset_name = 'anime'

        # input file
        self.inter_file = os.path.join(self.input_path, INTERACTION_FILE_PATH)

        self.sep = ','

        # output file
        output_files = self.get_output_files()
        self.output_inter_file = output_files[0]

        # selected feature fields
        self.inter_fields = {0: 'user_id:token',
                             1: 'item_id:token'}


    def load_inter_data(self):
        return pd.read_csv(self.inter_file, delimiter=self.sep, header=None, engine='python').iloc[1:, :]

その後、変換コマンドを実行します

python src/converter/main.py --dataset anime --input_path data/input --output data/atomic_files --convert_inter  

3. 学習するモデルを指定してモデルの学習コマンド実行

  • 学習のためのconfig.yamlの指定

こちらの記事を参考にさせていただきました

https://techlife.cookpad.com/entry/2021/11/04/090000

  • モデルの実行

使えるモデルの指定と実行する関数を記述するだけ!お手軽

src/recbole/execute.py

()

def main(model_name, dataset_name, config_files):
    if model_name in [
        "MultiVAE",
        "MultiDAE",
        "MacridVAE",
        "RecVAE",
        "ItemKNN", 
        "NeuMF",
        "GCMC",
        "LightGCN"
    ]:
        parameter_dict = {
            "neg_sampling": None,
        }
        run_recbole(
            model=model_name,
            dataset=dataset_name,
            config_file_list=[config_files],
            config_dict=parameter_dict,
        )
	
()

実行を下記コマンドで行います

python src/recbole/execute.py --dataset_name anime --model_name RecVAE --config_files src/recbole/config.yml

学習のログ。学習は進んでそう

(略)
31 Jul 00:29    INFO  valid result: 
recall@10 : 0.0585    mrr@10 : 0.1051    ndcg@10 : 0.0558    hit@10 : 0.3043    precision@10 : 0.0403
(略)
recall@10 : 0.1096    mrr@10 : 0.2126    ndcg@10 : 0.1145    hit@10 : 0.467    precision@10 : 0.0758
(略)
recall@10 : 0.1665    mrr@10 : 0.3029    ndcg@10 : 0.1745    hit@10 : 0.5939    precision@10 : 0.1109
(略)
recall@10 : 0.1824    mrr@10 : 0.3221    ndcg@10 : 0.1896    hit@10 : 0.622    precision@10 : 0.1192
・・・

レコメンド結果の確認(定性)

レコメンドを計算するユーザーがimplicitなフィードバックを与えた作品

レコメンドの結果(スコア順)

レコメンド自体はうまく計算できてそう

今回の目標は簡単に動かすまでだったのでここで終了

さいごに

今回、前から気になっていたRecboleをいじってみました

コード類は気が向いたらgithubで公開します。

以下参考にさせていただいた資料

https://techlife.cookpad.com/entry/2021/11/04/090000

https://techblog.zozo.com/entry/deep-learning-recommendation-improvement

Discussion