色んなレコメンドアルゴリズムを一瞬で構築できるRecBoleを触る
(公式ドキュメントより拝借)
RecBoleとは
統一されたインターフェースで、機械学習アルゴリズムの中身をほぼ意識せず、複数のレコメンドアルゴリズムを構築できるライブラリ
モデル名、データセットの設定、その他学習の設定などを渡して実行するだけ。
run_recbole(
model=model_name,
dataset=dataset_name,
config_file_list=[config_files],
config_dict=parameter_dict,
)
RecBoleでモデルを作成する際の流れ
- データの準備
- データのAtomic Files形式へ変換
- 学習するモデルを指定してモデルの学習コマンド実行
という工程を踏む必要があります。
ダミーデータで実行
ディレクトリ構成は下記のようにしました
src
├── converter
│ ├── dataset.py
│ └── main.py
└── recbole
├── config.yml
└── execute.py
1. データの準備
下記のデータを使いました。
Explicit(ユーザーが明示的に評価している)データですが、普段使う機会が多いのはImplicitなデータだと思います。
なので、今回は無理やり、Implicitなダミーデータに変換します(実際にモデルを構築される際にはやらないでください)
2. データをAtomic Files方式へ変換
dataset.pyファイル以下では、カスタムのデータに対応させるため、BaseDatasetクラスを継承したANIMEDatasetクラスを宣言しています。
BaseDatasetクラスは、下記リポジトリのbase_dataset.pyをほぼそのまま使っています。
ANIMEDatasetクラス内にAtomic Files形式へ変換するための設定を書き込みます。上記リポジトリのextended_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の指定
こちらの記事を参考にさせていただきました
- モデルの実行
使えるモデルの指定と実行する関数を記述するだけ!お手軽
(略)
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で公開します。
以下参考にさせていただいた資料
Discussion