<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: fufufukakaka</title>
    <description>The latest articles on DEV Community by fufufukakaka (@fufufukakaka).</description>
    <link>https://dev.to/fufufukakaka</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F779306%2F1aa74320-8966-4b15-b05a-5081453ddb6f.jpeg</url>
      <title>DEV Community: fufufukakaka</title>
      <link>https://dev.to/fufufukakaka</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fufufukakaka"/>
    <language>en</language>
    <item>
      <title>Observe differences in the behavior of recommendation models using RecBole</title>
      <dc:creator>fufufukakaka</dc:creator>
      <pubDate>Wed, 05 Jan 2022 08:57:56 +0000</pubDate>
      <link>https://dev.to/fufufukakaka/observe-differences-in-the-behavior-of-recommendation-models-using-recbole-4b0i</link>
      <guid>https://dev.to/fufufukakaka/observe-differences-in-the-behavior-of-recommendation-models-using-recbole-4b0i</guid>
      <description>&lt;p&gt;This post is translation(DeepL &amp;amp; Human) of this qiita article. &lt;a href="https://qiita.com/fufufukakaka/items/77878c1e23338345d4fa" rel="noopener noreferrer"&gt;RecBole を使ってレコメンドモデルの挙動の違いを観察する&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article, I will focus on recommendation. Specifically, I'm going to talk about RecBole.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is RecBole?
&lt;/h2&gt;

&lt;p&gt;I wrote a similar article on &lt;a href="https://techlife.cookpad.com/entry/2021/11/04/090000" rel="noopener noreferrer"&gt;company blog&lt;/a&gt;, so I'll quote this part of the explanation from there.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://recbole.io/" rel="noopener noreferrer"&gt;RecBole&lt;/a&gt; seems to be a joint project started by the laboratories of Renmin University of China and Peking University, and it &lt;a href="https://arxiv.org/abs/2011.01731" rel="noopener noreferrer"&gt;appeared on arxiv&lt;/a&gt; in November 2020. In August 2021, the module that we provide reached v1.0, and it seems to be used by various people in earnest.&lt;/p&gt;

&lt;p&gt;The most attractive feature of RecBole is that it implements a lot of recommendation models with a unified interface for comparison. The number of models implemented and datasets that can be applied is tremendous. There are currently more than 70 models (&lt;a href="https://recbole.io/model_list.html" rel="noopener noreferrer"&gt;model list&lt;/a&gt;) and more than 20 datasets (&lt;a href="https://recbole.io/dataset_list.html" rel="noopener noreferrer"&gt;dataset list&lt;/a&gt;) that can be tested immediately. You can try instantly.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;recbole&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;run_recbole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;favorite&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt; &lt;span class="n"&gt;ml&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;That's all. Instantly you can try out over 70 models (some models require additional configuration) against the MovieLens-100k dataset, the most famous benchmark in the recommendation community. There are not many environments where you can try this many models and data. All of the 70+ models in the collection have been carefully reimplemented in PyTorch and are very reliable, and the basic interfaces, such as the predict function, are standardized to make it easy to experiment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In summary, RecBole provides an ecosystem to try out an unusual number of recommendation models (more than 70) on an unusual number of datasets (about 20) immediately.&lt;/p&gt;

&lt;p&gt;In the RecBole paper, there is a comparison with other similarly positioned products.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4p69duax18ib6ah85oon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4p69duax18ib6ah85oon.png" alt="recbole_paper_figure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(nits: I don't understand why they compare Fork and Star/Issue numbers...)&lt;/p&gt;

&lt;h2&gt;
  
  
  "I have no idea which model to use for this recommendation task."
&lt;/h2&gt;

&lt;p&gt;If you are working on a recommendation task, you may have faced this a lot.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I often see State of the Art in recommendation tasks.

&lt;ul&gt;
&lt;li&gt;However, the benchmark data is not 100K MovieLens, which makes it difficult to compare.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Even if I try to use a public model implementation, I can't have data with rating (Explicit Feedback) like MovieLens, but only data with purchase (Implicit Feedback)&lt;/li&gt;

&lt;li&gt;I don't know how to split Train, valid, and test, so I don't do offline testing. without doing any offline testing, so I create a model and submit it for online evaluation.&lt;/li&gt;

&lt;li&gt;We manage to implement model A and get a good result, but we are told that model B is actually better. But I don't have the time to reproduce and implement Model B (e.g., change the implementation to fit my company's data). Since we haven't done any offline evaluation, there is no way to make a decision.&lt;/li&gt;

&lt;li&gt;In the first place, our own data is too big to train!&lt;/li&gt;

&lt;li&gt;Model A was good for our service α, so we tried to apply it to service β, but the results were not so good (the pattern was that we had to use model C to get good results).&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;I'm sure you must have experienced various hardships. I always thought the same thing: "I don't know which model I should use for the recommendation task.&lt;br&gt;
I like the recommendation task itself, but the only models I understand were Item2Vec, which I could do by using gensim, and MatrixFactorization, so I couldn't expand my knowledge at all. I think I picked up some information like VAEs are strong, there are graph based models, and you can use Transformers to make recommendations, but I didn't have the time (or room) to understand and implement them to be able to use them at any time... I've been making excuses.&lt;/p&gt;

&lt;p&gt;However, with RecBole, we can leave the implementation to RecBole and try it out right away. It is also quite easy to make RecBole work with your own data.&lt;/p&gt;

&lt;p&gt;With RecBole, you'll have one less question about working on a recommendation task.&lt;br&gt;
So, the question has now moved to the next stage.&lt;/p&gt;
&lt;h2&gt;
  
  
  "Why does the recommendation task vary so much in terms of which models are strong depending on the data?"
&lt;/h2&gt;

&lt;p&gt;When you start using RecBole to test various models on various data, you will notice that the distribution of strong and weak models is completely different depending on the data.&lt;/p&gt;

&lt;p&gt;I'm sure you've all heard that the strongest models in machine learning differ depending on the task. I'm not sure if this is appropriate as a concrete example, but if I were to write it down, I'd say that CNNs are generally strong when dealing with images (although the accuracy of "generally" has dropped a lot recently due to Vision in Transformer, I think it can be acknowledged that CNN-like structures have been effective), and when dealing with linguistic data When dealing with linguistic data, neural networks with sequential structure are stronger, and when dealing with table data, gradient boosting trees are stronger than neural networks. It is like this.&lt;/p&gt;

&lt;p&gt;I understand that the strongest model for each task is different. However, I don't understand why the top models change when the data is different...&lt;br&gt;
In this article, I have tried to confirm that the strong model differs depending on the dataset through recbole datasets. &lt;br&gt;
First, We will introduce the results of our experiments with two datasets.&lt;/p&gt;
&lt;h3&gt;
  
  
  Case1. MovieLens 1M
&lt;/h3&gt;

&lt;p&gt;First dataset: MovieLens. It is a well-known dataset where users give grades to movies. In this case, we use 1M records of grade history data.&lt;/p&gt;

&lt;p&gt;This can be used in RecBole without any special procedures.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;recbole.quick_start&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;run_recbole&lt;/span&gt;
&lt;span class="nf"&gt;run_recbole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;movielens-1m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will download the MovieLens data on its own. This is great.&lt;br&gt;
However, If this is all, the settings you want to add will not be reflected, so you need to prepare the following yaml.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# general&lt;/span&gt;
&lt;span class="na"&gt;gpu_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="na"&gt;use_gpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="na"&gt;seed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2020&lt;/span&gt;
&lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;INFO&lt;/span&gt;
&lt;span class="na"&gt;reproducibility&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="na"&gt;data_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dataset/'&lt;/span&gt;
&lt;span class="na"&gt;checkpoint_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;saved/movielens-1m'&lt;/span&gt;
&lt;span class="na"&gt;show_progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="na"&gt;save_dataset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="na"&gt;save_dataloaders&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;

&lt;span class="c1"&gt;# Atomic File Format&lt;/span&gt;
&lt;span class="na"&gt;field_separator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="na"&gt;seq_separator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@"&lt;/span&gt;

&lt;span class="c1"&gt;# Common Features&lt;/span&gt;
&lt;span class="na"&gt;USER_ID_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;user_id&lt;/span&gt;
&lt;span class="na"&gt;ITEM_ID_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;item_id&lt;/span&gt;
&lt;span class="na"&gt;RATING_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rating&lt;/span&gt;
&lt;span class="na"&gt;TIME_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;timestamp&lt;/span&gt;
&lt;span class="na"&gt;seq_len&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="c1"&gt;# Label for Point-wise DataLoader&lt;/span&gt;
&lt;span class="na"&gt;LABEL_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;label&lt;/span&gt;
&lt;span class="c1"&gt;# NegSample Prefix for Pair-wise DataLoader&lt;/span&gt;
&lt;span class="na"&gt;NEG_PREFIX&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;neg_&lt;/span&gt;
&lt;span class="c1"&gt;# Sequential Model Needed&lt;/span&gt;
&lt;span class="na"&gt;ITEM_LIST_LENGTH_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;item_length&lt;/span&gt;
&lt;span class="na"&gt;LIST_SUFFIX&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;_list&lt;/span&gt;
&lt;span class="na"&gt;MAX_ITEM_LIST_LENGTH&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
&lt;span class="na"&gt;POSITION_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;position_id&lt;/span&gt;
&lt;span class="c1"&gt;# Knowledge-based Model Needed&lt;/span&gt;
&lt;span class="na"&gt;HEAD_ENTITY_ID_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;head_id&lt;/span&gt;
&lt;span class="na"&gt;TAIL_ENTITY_ID_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tail_id&lt;/span&gt;
&lt;span class="na"&gt;RELATION_ID_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;relation_id&lt;/span&gt;
&lt;span class="na"&gt;ENTITY_ID_FIELD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;entity_id&lt;/span&gt;

&lt;span class="c1"&gt;# Selectively Loading&lt;/span&gt;
&lt;span class="na"&gt;load_col&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;user_id&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;item_id&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;timestamp&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rating&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;user_id&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;gender&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;occupation&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;zip_code&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;item_id&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;movie_title&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;release_year&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;genre&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;unused_col&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;timestamp&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rating&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Filtering&lt;/span&gt;
&lt;span class="na"&gt;rm_dup_inter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;val_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;filter_inter_by_user_or_item&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="na"&gt;user_inter_num_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[1,inf]"&lt;/span&gt;
&lt;span class="na"&gt;item_inter_num_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[1,inf]"&lt;/span&gt;

&lt;span class="c1"&gt;# Preprocessing&lt;/span&gt;
&lt;span class="na"&gt;alias_of_user_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;alias_of_item_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;alias_of_entity_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;alias_of_relation_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;preload_weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;normalize_field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~&lt;/span&gt;
&lt;span class="na"&gt;normalize_all&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# Training and evaluation config&lt;/span&gt;
&lt;span class="na"&gt;epochs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
&lt;span class="na"&gt;stopping_step&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;train_batch_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4096&lt;/span&gt;
&lt;span class="na"&gt;eval_batch_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4096&lt;/span&gt;
&lt;span class="na"&gt;neg_sampling&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;uniform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;eval_args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;group_by&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;user&lt;/span&gt;
    &lt;span class="na"&gt;order&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TO&lt;/span&gt;
    &lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RS'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;0.8&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;0.1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;0.1&lt;/span&gt;&lt;span class="pi"&gt;]}&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;full&lt;/span&gt;
&lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Recall'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MRR'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;NDCG'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hit'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Precision'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;topk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;valid_metric&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MRR@10&lt;/span&gt;
&lt;span class="na"&gt;metric_decimal_place&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this as &lt;code&gt;config/movielens-1m.yml&lt;/code&gt; or something similar and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;run_recbole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;movielens-1m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config_file_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;config/movielens-1m.yml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and execute it.&lt;/p&gt;

&lt;p&gt;About yaml↓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you don't set &lt;code&gt;seq_separator&lt;/code&gt;, it will be separated with a blank. I think this is fine for model training, but it makes it impossible to correctly pull item names when analyzing topk later, so I put in characters that are not likely to be separated (but I think this is not the right way to do it, since you can just avoid it in another way when pulling item names). I don't think this is the right way to do it.)&lt;/li&gt;
&lt;li&gt;You need to pay special attention to &lt;code&gt;ITEM_ID_FIELD&lt;/code&gt;, because the column name of item id is different for each data.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;MAX_ITEM_LIST_LENGTH&lt;/code&gt;, &lt;code&gt;user_inter_num_interval&lt;/code&gt; and &lt;code&gt;item_inter_num_interval&lt;/code&gt; are all settings that cut off data. If you can't run the model because of too many data, set these settings to loosen the model (sometimes there is no way to loosen them).&lt;/li&gt;
&lt;li&gt;(Most important) In &lt;code&gt;eval_args&lt;/code&gt;, set &lt;code&gt;order&lt;/code&gt; to &lt;code&gt;TO&lt;/code&gt; and &lt;code&gt;group_by&lt;/code&gt; to &lt;code&gt;user&lt;/code&gt;! This will put in the process of groupbying the items by user and arranging them into timeseries. After that, the &lt;code&gt;split&lt;/code&gt; setting comes into effect, and in this case, it creates a train:valid:test at 80%:10%:10%. I think this is the most realistic way to split the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case, I used this experimental setup to test 36 models, and in terms of RecBole categories, I used General and Context-Aware (Factorization Machine) models. The reason I am not working on Sequential models is that there is a bug that causes errors when outputting topk, and about knowledge-base models, I think it would be quite difficult to prepare required data in real. Also, each model was tested with default parameters. I didn't have time to tune them all...&lt;/p&gt;

&lt;p&gt;Now, RecBole will show us the basic statistics of the data, so let's check that first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1084&lt;/span&gt;
&lt;span class="n"&gt;Average&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;84.04801477377654&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;38334&lt;/span&gt;
&lt;span class="n"&gt;Average&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.374559778780685&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;inters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;91024&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;sparsity&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;99.78095038424168&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The number of users and items is not that large. The average number of items acted on by one user is 165, and the average number of users acting on one item is 269.&lt;/p&gt;

&lt;p&gt;Let's take a look at the experimental results of the 36 models. The results are as follows, sorted in descending order by NDCG@10.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;recall@10&lt;/th&gt;
&lt;th&gt;precision@10&lt;/th&gt;
&lt;th&gt;ndcg@10&lt;/th&gt;
&lt;th&gt;mrr@10&lt;/th&gt;
&lt;th&gt;hit@10&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NGCF&lt;/td&gt;
&lt;td&gt;0.0581&lt;/td&gt;
&lt;td&gt;0.0647&lt;/td&gt;
&lt;td&gt;0.0813&lt;/td&gt;
&lt;td&gt;0.1616&lt;/td&gt;
&lt;td&gt;0.3745&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LightGCN&lt;/td&gt;
&lt;td&gt;0.0578&lt;/td&gt;
&lt;td&gt;0.0644&lt;/td&gt;
&lt;td&gt;0.081&lt;/td&gt;
&lt;td&gt;0.1594&lt;/td&gt;
&lt;td&gt;0.3671&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DGCF&lt;/td&gt;
&lt;td&gt;0.0587&lt;/td&gt;
&lt;td&gt;0.0633&lt;/td&gt;
&lt;td&gt;0.0802&lt;/td&gt;
&lt;td&gt;0.1585&lt;/td&gt;
&lt;td&gt;0.3608&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLIMElastic&lt;/td&gt;
&lt;td&gt;0.0631&lt;/td&gt;
&lt;td&gt;0.0612&lt;/td&gt;
&lt;td&gt;0.0801&lt;/td&gt;
&lt;td&gt;0.1546&lt;/td&gt;
&lt;td&gt;0.3664&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BPR&lt;/td&gt;
&lt;td&gt;0.0572&lt;/td&gt;
&lt;td&gt;0.0638&lt;/td&gt;
&lt;td&gt;0.0798&lt;/td&gt;
&lt;td&gt;0.1566&lt;/td&gt;
&lt;td&gt;0.3618&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoInt&lt;/td&gt;
&lt;td&gt;0.0552&lt;/td&gt;
&lt;td&gt;0.0635&lt;/td&gt;
&lt;td&gt;0.0797&lt;/td&gt;
&lt;td&gt;0.1588&lt;/td&gt;
&lt;td&gt;0.3591&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCMC&lt;/td&gt;
&lt;td&gt;0.0567&lt;/td&gt;
&lt;td&gt;0.0631&lt;/td&gt;
&lt;td&gt;0.0793&lt;/td&gt;
&lt;td&gt;0.1571&lt;/td&gt;
&lt;td&gt;0.3596&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AFM&lt;/td&gt;
&lt;td&gt;0.0535&lt;/td&gt;
&lt;td&gt;0.0637&lt;/td&gt;
&lt;td&gt;0.0789&lt;/td&gt;
&lt;td&gt;0.1592&lt;/td&gt;
&lt;td&gt;0.3652&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NNCF&lt;/td&gt;
&lt;td&gt;0.0554&lt;/td&gt;
&lt;td&gt;0.0626&lt;/td&gt;
&lt;td&gt;0.0788&lt;/td&gt;
&lt;td&gt;0.1583&lt;/td&gt;
&lt;td&gt;0.3609&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAIS&lt;/td&gt;
&lt;td&gt;0.0592&lt;/td&gt;
&lt;td&gt;0.0608&lt;/td&gt;
&lt;td&gt;0.0782&lt;/td&gt;
&lt;td&gt;0.1528&lt;/td&gt;
&lt;td&gt;0.3589&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EASE&lt;/td&gt;
&lt;td&gt;0.0658&lt;/td&gt;
&lt;td&gt;0.0583&lt;/td&gt;
&lt;td&gt;0.0779&lt;/td&gt;
&lt;td&gt;0.1473&lt;/td&gt;
&lt;td&gt;0.3598&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepFM&lt;/td&gt;
&lt;td&gt;0.054&lt;/td&gt;
&lt;td&gt;0.0621&lt;/td&gt;
&lt;td&gt;0.0779&lt;/td&gt;
&lt;td&gt;0.1579&lt;/td&gt;
&lt;td&gt;0.3566&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCN&lt;/td&gt;
&lt;td&gt;0.0548&lt;/td&gt;
&lt;td&gt;0.0618&lt;/td&gt;
&lt;td&gt;0.0775&lt;/td&gt;
&lt;td&gt;0.1538&lt;/td&gt;
&lt;td&gt;0.3505&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WideDeep&lt;/td&gt;
&lt;td&gt;0.0534&lt;/td&gt;
&lt;td&gt;0.062&lt;/td&gt;
&lt;td&gt;0.0774&lt;/td&gt;
&lt;td&gt;0.1564&lt;/td&gt;
&lt;td&gt;0.356&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Item2Vec&lt;/td&gt;
&lt;td&gt;0.0591&lt;/td&gt;
&lt;td&gt;0.0609&lt;/td&gt;
&lt;td&gt;0.0773&lt;/td&gt;
&lt;td&gt;0.1477&lt;/td&gt;
&lt;td&gt;0.3598&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FM&lt;/td&gt;
&lt;td&gt;0.0553&lt;/td&gt;
&lt;td&gt;0.0611&lt;/td&gt;
&lt;td&gt;0.0773&lt;/td&gt;
&lt;td&gt;0.1557&lt;/td&gt;
&lt;td&gt;0.3611&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SpectralCF&lt;/td&gt;
&lt;td&gt;0.0527&lt;/td&gt;
&lt;td&gt;0.0608&lt;/td&gt;
&lt;td&gt;0.0768&lt;/td&gt;
&lt;td&gt;0.1575&lt;/td&gt;
&lt;td&gt;0.3531&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RecVAE&lt;/td&gt;
&lt;td&gt;0.0563&lt;/td&gt;
&lt;td&gt;0.0602&lt;/td&gt;
&lt;td&gt;0.0765&lt;/td&gt;
&lt;td&gt;0.1499&lt;/td&gt;
&lt;td&gt;0.347&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NeuMF&lt;/td&gt;
&lt;td&gt;0.055&lt;/td&gt;
&lt;td&gt;0.0606&lt;/td&gt;
&lt;td&gt;0.0763&lt;/td&gt;
&lt;td&gt;0.152&lt;/td&gt;
&lt;td&gt;0.3543&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FFM&lt;/td&gt;
&lt;td&gt;0.0551&lt;/td&gt;
&lt;td&gt;0.0612&lt;/td&gt;
&lt;td&gt;0.076&lt;/td&gt;
&lt;td&gt;0.1507&lt;/td&gt;
&lt;td&gt;0.3614&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xDeepFM&lt;/td&gt;
&lt;td&gt;0.0532&lt;/td&gt;
&lt;td&gt;0.0599&lt;/td&gt;
&lt;td&gt;0.0754&lt;/td&gt;
&lt;td&gt;0.1545&lt;/td&gt;
&lt;td&gt;0.3551&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NFM&lt;/td&gt;
&lt;td&gt;0.0515&lt;/td&gt;
&lt;td&gt;0.0605&lt;/td&gt;
&lt;td&gt;0.075&lt;/td&gt;
&lt;td&gt;0.153&lt;/td&gt;
&lt;td&gt;0.3543&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMF&lt;/td&gt;
&lt;td&gt;0.0575&lt;/td&gt;
&lt;td&gt;0.0582&lt;/td&gt;
&lt;td&gt;0.0748&lt;/td&gt;
&lt;td&gt;0.1455&lt;/td&gt;
&lt;td&gt;0.345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNN&lt;/td&gt;
&lt;td&gt;0.0524&lt;/td&gt;
&lt;td&gt;0.06&lt;/td&gt;
&lt;td&gt;0.0745&lt;/td&gt;
&lt;td&gt;0.1509&lt;/td&gt;
&lt;td&gt;0.3518&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ItemKNN&lt;/td&gt;
&lt;td&gt;0.0558&lt;/td&gt;
&lt;td&gt;0.0549&lt;/td&gt;
&lt;td&gt;0.0716&lt;/td&gt;
&lt;td&gt;0.1376&lt;/td&gt;
&lt;td&gt;0.3243&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FNN&lt;/td&gt;
&lt;td&gt;0.0476&lt;/td&gt;
&lt;td&gt;0.058&lt;/td&gt;
&lt;td&gt;0.0711&lt;/td&gt;
&lt;td&gt;0.1434&lt;/td&gt;
&lt;td&gt;0.3296&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MultiDAE&lt;/td&gt;
&lt;td&gt;0.0513&lt;/td&gt;
&lt;td&gt;0.0566&lt;/td&gt;
&lt;td&gt;0.0707&lt;/td&gt;
&lt;td&gt;0.1403&lt;/td&gt;
&lt;td&gt;0.3336&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MacridVAE&lt;/td&gt;
&lt;td&gt;0.0493&lt;/td&gt;
&lt;td&gt;0.0536&lt;/td&gt;
&lt;td&gt;0.0666&lt;/td&gt;
&lt;td&gt;0.1341&lt;/td&gt;
&lt;td&gt;0.3321&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDAE&lt;/td&gt;
&lt;td&gt;0.0384&lt;/td&gt;
&lt;td&gt;0.0532&lt;/td&gt;
&lt;td&gt;0.0632&lt;/td&gt;
&lt;td&gt;0.1293&lt;/td&gt;
&lt;td&gt;0.2965&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FwFM&lt;/td&gt;
&lt;td&gt;0.0386&lt;/td&gt;
&lt;td&gt;0.0532&lt;/td&gt;
&lt;td&gt;0.063&lt;/td&gt;
&lt;td&gt;0.1262&lt;/td&gt;
&lt;td&gt;0.2921&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LR&lt;/td&gt;
&lt;td&gt;0.0381&lt;/td&gt;
&lt;td&gt;0.0534&lt;/td&gt;
&lt;td&gt;0.0628&lt;/td&gt;
&lt;td&gt;0.1271&lt;/td&gt;
&lt;td&gt;0.2949&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pop&lt;/td&gt;
&lt;td&gt;0.0358&lt;/td&gt;
&lt;td&gt;0.0494&lt;/td&gt;
&lt;td&gt;0.0556&lt;/td&gt;
&lt;td&gt;0.1095&lt;/td&gt;
&lt;td&gt;0.2891&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LINE&lt;/td&gt;
&lt;td&gt;0.0253&lt;/td&gt;
&lt;td&gt;0.0485&lt;/td&gt;
&lt;td&gt;0.054&lt;/td&gt;
&lt;td&gt;0.1185&lt;/td&gt;
&lt;td&gt;0.2609&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DSSM&lt;/td&gt;
&lt;td&gt;0.0305&lt;/td&gt;
&lt;td&gt;0.0411&lt;/td&gt;
&lt;td&gt;0.0483&lt;/td&gt;
&lt;td&gt;0.104&lt;/td&gt;
&lt;td&gt;0.2627&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ENMF&lt;/td&gt;
&lt;td&gt;0.0115&lt;/td&gt;
&lt;td&gt;0.0176&lt;/td&gt;
&lt;td&gt;0.0193&lt;/td&gt;
&lt;td&gt;0.0461&lt;/td&gt;
&lt;td&gt;0.1442&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It would be too hard for me to explain all what each model represents, so I hope you will take a look at &lt;a href="https://recbole.io/docs/user_guide/model_intro.html" rel="noopener noreferrer"&gt;RecBole's page&lt;/a&gt; and look at the table.&lt;/p&gt;

&lt;p&gt;There are four things I want to say here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NGCF, LightGCN, DGCF, GCMC graph-based models dominate the top.&lt;/li&gt;
&lt;li&gt;Long-established models such as SLIMElastic and BPR are also at the top.&lt;/li&gt;
&lt;li&gt;The only context-aware models near the top are AutoInt and AFM.&lt;/li&gt;
&lt;li&gt;RecVAE and other VAEs that I was hoping are not doing so well.

&lt;ul&gt;
&lt;li&gt;The reason why I was hoping this is because RecVAE was overwhelming in the &lt;a href="https://techlife.cookpad.com/entry/2021/11/04/090000" rel="noopener noreferrer"&gt;experimental results I wrote about in my company's blog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Case2. FourSquare NYC
&lt;/h3&gt;

&lt;p&gt;Now, let's continue to try out RecBole on another data set, the second one being FourSquare NYC. I quote the description from &lt;a href="https://github.com/RUCAIBox/RecSysDatasets" rel="noopener noreferrer"&gt;https://github.com/RUCAIBox/RecSysDatasets&lt;/a&gt; ↓&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This dataset contains check-ins in NYC and Tokyo collected for about 10 month. Each check-in is associated with its time stamp, its GPS coordinates and its semantic meaning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As with MovieLens, we'll first look at the underlying statistics of the data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1084&lt;/span&gt;
&lt;span class="n"&gt;Average&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;84.04801477377654&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;38334&lt;/span&gt;
&lt;span class="n"&gt;Average&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.374559778780685&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;inters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;91024&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;sparsity&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;99.78095038424168&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this dataset, the number of users and the number of items are not balanced at all. The average number of items interacted on by one user is 84, but the average number of users interacting on one item is 2, so it's obvious that there is a long tail. sparsity is also 95% for MovieLens, but 99% for sparsity.&lt;/p&gt;

&lt;p&gt;This yaml is almost the same as MovieLens, but the selectively loading part and item_id are different.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Selectively Loading
&lt;/span&gt;&lt;span class="n"&gt;load_col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;inter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;venue_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;unused_col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;inter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please note that item_id has been changed to venue_id. And I didn't use any of the item information this time because I wasn't sure which one to use. So the result of context-aware model might be quite different depending on this setting.&lt;/p&gt;

&lt;p&gt;Let's look at the results of the experiment in the same way. We have 33 experimental results(The number of models is slightly reduced).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;hit@10&lt;/th&gt;
&lt;th&gt;mrr@10&lt;/th&gt;
&lt;th&gt;ndcg@10&lt;/th&gt;
&lt;th&gt;precision@10&lt;/th&gt;
&lt;th&gt;recall@10&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LightGCN&lt;/td&gt;
&lt;td&gt;0.2004&lt;/td&gt;
&lt;td&gt;0.1089&lt;/td&gt;
&lt;td&gt;0.0401&lt;/td&gt;
&lt;td&gt;0.0243&lt;/td&gt;
&lt;td&gt;0.0323&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLIMElastic&lt;/td&gt;
&lt;td&gt;0.205&lt;/td&gt;
&lt;td&gt;0.1071&lt;/td&gt;
&lt;td&gt;0.0399&lt;/td&gt;
&lt;td&gt;0.0246&lt;/td&gt;
&lt;td&gt;0.0332&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RecVAE&lt;/td&gt;
&lt;td&gt;0.1958&lt;/td&gt;
&lt;td&gt;0.0979&lt;/td&gt;
&lt;td&gt;0.0373&lt;/td&gt;
&lt;td&gt;0.0236&lt;/td&gt;
&lt;td&gt;0.0316&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FNN&lt;/td&gt;
&lt;td&gt;0.1884&lt;/td&gt;
&lt;td&gt;0.098&lt;/td&gt;
&lt;td&gt;0.0367&lt;/td&gt;
&lt;td&gt;0.0224&lt;/td&gt;
&lt;td&gt;0.0303&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMF&lt;/td&gt;
&lt;td&gt;0.1911&lt;/td&gt;
&lt;td&gt;0.0953&lt;/td&gt;
&lt;td&gt;0.0364&lt;/td&gt;
&lt;td&gt;0.023&lt;/td&gt;
&lt;td&gt;0.0307&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepFM&lt;/td&gt;
&lt;td&gt;0.1911&lt;/td&gt;
&lt;td&gt;0.0931&lt;/td&gt;
&lt;td&gt;0.0359&lt;/td&gt;
&lt;td&gt;0.0229&lt;/td&gt;
&lt;td&gt;0.0312&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCMC&lt;/td&gt;
&lt;td&gt;0.1819&lt;/td&gt;
&lt;td&gt;0.0955&lt;/td&gt;
&lt;td&gt;0.0359&lt;/td&gt;
&lt;td&gt;0.0222&lt;/td&gt;
&lt;td&gt;0.0297&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MacridVAE&lt;/td&gt;
&lt;td&gt;0.1911&lt;/td&gt;
&lt;td&gt;0.0934&lt;/td&gt;
&lt;td&gt;0.0358&lt;/td&gt;
&lt;td&gt;0.0228&lt;/td&gt;
&lt;td&gt;0.0306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MultiVAE&lt;/td&gt;
&lt;td&gt;0.1745&lt;/td&gt;
&lt;td&gt;0.0936&lt;/td&gt;
&lt;td&gt;0.0349&lt;/td&gt;
&lt;td&gt;0.0211&lt;/td&gt;
&lt;td&gt;0.0282&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NeuMF&lt;/td&gt;
&lt;td&gt;0.1791&lt;/td&gt;
&lt;td&gt;0.0867&lt;/td&gt;
&lt;td&gt;0.0343&lt;/td&gt;
&lt;td&gt;0.0223&lt;/td&gt;
&lt;td&gt;0.0299&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MultiDAE&lt;/td&gt;
&lt;td&gt;0.1671&lt;/td&gt;
&lt;td&gt;0.0928&lt;/td&gt;
&lt;td&gt;0.0341&lt;/td&gt;
&lt;td&gt;0.0203&lt;/td&gt;
&lt;td&gt;0.0281&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xDeepFM&lt;/td&gt;
&lt;td&gt;0.1662&lt;/td&gt;
&lt;td&gt;0.0948&lt;/td&gt;
&lt;td&gt;0.034&lt;/td&gt;
&lt;td&gt;0.0198&lt;/td&gt;
&lt;td&gt;0.026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FwFM&lt;/td&gt;
&lt;td&gt;0.169&lt;/td&gt;
&lt;td&gt;0.0931&lt;/td&gt;
&lt;td&gt;0.0335&lt;/td&gt;
&lt;td&gt;0.0202&lt;/td&gt;
&lt;td&gt;0.0264&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WideDeep&lt;/td&gt;
&lt;td&gt;0.1616&lt;/td&gt;
&lt;td&gt;0.0937&lt;/td&gt;
&lt;td&gt;0.0335&lt;/td&gt;
&lt;td&gt;0.0192&lt;/td&gt;
&lt;td&gt;0.0259&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LR&lt;/td&gt;
&lt;td&gt;0.1801&lt;/td&gt;
&lt;td&gt;0.086&lt;/td&gt;
&lt;td&gt;0.0329&lt;/td&gt;
&lt;td&gt;0.0219&lt;/td&gt;
&lt;td&gt;0.0292&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoInt&lt;/td&gt;
&lt;td&gt;0.1644&lt;/td&gt;
&lt;td&gt;0.0914&lt;/td&gt;
&lt;td&gt;0.0323&lt;/td&gt;
&lt;td&gt;0.0189&lt;/td&gt;
&lt;td&gt;0.0253&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SpectralCF&lt;/td&gt;
&lt;td&gt;0.1653&lt;/td&gt;
&lt;td&gt;0.0888&lt;/td&gt;
&lt;td&gt;0.0322&lt;/td&gt;
&lt;td&gt;0.0194&lt;/td&gt;
&lt;td&gt;0.026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNN&lt;/td&gt;
&lt;td&gt;0.1717&lt;/td&gt;
&lt;td&gt;0.0827&lt;/td&gt;
&lt;td&gt;0.0319&lt;/td&gt;
&lt;td&gt;0.0209&lt;/td&gt;
&lt;td&gt;0.0283&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AFM&lt;/td&gt;
&lt;td&gt;0.1717&lt;/td&gt;
&lt;td&gt;0.0802&lt;/td&gt;
&lt;td&gt;0.0315&lt;/td&gt;
&lt;td&gt;0.0208&lt;/td&gt;
&lt;td&gt;0.0281&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCN&lt;/td&gt;
&lt;td&gt;0.169&lt;/td&gt;
&lt;td&gt;0.0839&lt;/td&gt;
&lt;td&gt;0.0315&lt;/td&gt;
&lt;td&gt;0.0207&lt;/td&gt;
&lt;td&gt;0.0271&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FFM&lt;/td&gt;
&lt;td&gt;0.1634&lt;/td&gt;
&lt;td&gt;0.0829&lt;/td&gt;
&lt;td&gt;0.0308&lt;/td&gt;
&lt;td&gt;0.0191&lt;/td&gt;
&lt;td&gt;0.0257&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pop&lt;/td&gt;
&lt;td&gt;0.1791&lt;/td&gt;
&lt;td&gt;0.0711&lt;/td&gt;
&lt;td&gt;0.0301&lt;/td&gt;
&lt;td&gt;0.0214&lt;/td&gt;
&lt;td&gt;0.0289&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FM&lt;/td&gt;
&lt;td&gt;0.1468&lt;/td&gt;
&lt;td&gt;0.0594&lt;/td&gt;
&lt;td&gt;0.0243&lt;/td&gt;
&lt;td&gt;0.0172&lt;/td&gt;
&lt;td&gt;0.0244&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BPR&lt;/td&gt;
&lt;td&gt;0.1505&lt;/td&gt;
&lt;td&gt;0.0557&lt;/td&gt;
&lt;td&gt;0.0237&lt;/td&gt;
&lt;td&gt;0.0173&lt;/td&gt;
&lt;td&gt;0.0238&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NNCF&lt;/td&gt;
&lt;td&gt;0.1274&lt;/td&gt;
&lt;td&gt;0.063&lt;/td&gt;
&lt;td&gt;0.0232&lt;/td&gt;
&lt;td&gt;0.0144&lt;/td&gt;
&lt;td&gt;0.0204&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NFM&lt;/td&gt;
&lt;td&gt;0.0822&lt;/td&gt;
&lt;td&gt;0.022&lt;/td&gt;
&lt;td&gt;0.0098&lt;/td&gt;
&lt;td&gt;0.0084&lt;/td&gt;
&lt;td&gt;0.0106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LINE&lt;/td&gt;
&lt;td&gt;0.0683&lt;/td&gt;
&lt;td&gt;0.0225&lt;/td&gt;
&lt;td&gt;0.0094&lt;/td&gt;
&lt;td&gt;0.0074&lt;/td&gt;
&lt;td&gt;0.0098&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NGCF&lt;/td&gt;
&lt;td&gt;0.0572&lt;/td&gt;
&lt;td&gt;0.023&lt;/td&gt;
&lt;td&gt;0.0093&lt;/td&gt;
&lt;td&gt;0.0059&lt;/td&gt;
&lt;td&gt;0.0086&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ItemKNN&lt;/td&gt;
&lt;td&gt;0.0406&lt;/td&gt;
&lt;td&gt;0.0178&lt;/td&gt;
&lt;td&gt;0.0062&lt;/td&gt;
&lt;td&gt;0.0043&lt;/td&gt;
&lt;td&gt;0.0054&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Item2Vec&lt;/td&gt;
&lt;td&gt;0.0194&lt;/td&gt;
&lt;td&gt;0.007&lt;/td&gt;
&lt;td&gt;0.0026&lt;/td&gt;
&lt;td&gt;0.0021&lt;/td&gt;
&lt;td&gt;0.0024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DSSM&lt;/td&gt;
&lt;td&gt;0.0037&lt;/td&gt;
&lt;td&gt;0.0015&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;td&gt;0.0004&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ENMF&lt;/td&gt;
&lt;td&gt;0.0028&lt;/td&gt;
&lt;td&gt;0.0013&lt;/td&gt;
&lt;td&gt;0.0005&lt;/td&gt;
&lt;td&gt;0.0003&lt;/td&gt;
&lt;td&gt;0.0005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDAE&lt;/td&gt;
&lt;td&gt;0.0009&lt;/td&gt;
&lt;td&gt;0.0003&lt;/td&gt;
&lt;td&gt;0.0001&lt;/td&gt;
&lt;td&gt;0.0001&lt;/td&gt;
&lt;td&gt;0.0001&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;LightGCN is at the top, but NGCF and GCMC have fallen (I forgot to calculate DGCF ).&lt;/li&gt;
&lt;li&gt;Similarly, SLIMElastic is at the top, but BPR has fallen to the lower rank.

&lt;ul&gt;
&lt;li&gt;I was surprised because I had a feeling that BPR was always at the top rank.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;VAEsVansVasesVanesVatsValesViesVAXesAESBAESCAES such as RecVAE and MacridVAE are getting higher rank.
FNN, DeepFM and other context-aware systems are also in the top rank.&lt;/li&gt;

&lt;li&gt;However, NDCG@10 is only 0.04 at the top, and the task is unusually difficult to begin with.
MovieLens had 0.08.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This result is not the definitive version because it is not tuned, but I think you can understand that the results are completely different depending on data even though they were compared under the same conditions. We were able to show in actual figures that "which model is stronger in the recommendation task varies considerably depending on the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualize how similar the recommended models are to each other as a network graph
&lt;/h2&gt;

&lt;p&gt;From now on, I would like to discuss about the recommendation models obtained from the two datasets.&lt;br&gt;
Each recommendation model has a list of top 10 items for each user, and you can use that list to indicate “this model and this model match this much ” or“ they don't match ”.&lt;/p&gt;

&lt;p&gt;Interesting points I think ...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the model of a similar system, such as a model of a graph system or a model of a factorization machine system, has a high degree of coincidence.&lt;/li&gt;
&lt;li&gt;Does the top-performing (lower-performing) model make very different recommendations?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It may possibly help you to understand the behavior of recommendation model.&lt;br&gt;
This time, we call it "recommendation list match degree", and try to calculate it.&lt;/p&gt;

&lt;p&gt;First, we get the topk list from the RecBole model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;click&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;recbole.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;recbole.data&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_preparation&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;recbole.quick_start.quick_start&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_data_and_model&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;recbole.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_model&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;recbole.utils.case_study&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;full_sort_topk&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.custom_models.Item2Vec&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Item2Vec&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;calculate_indicators&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tqdm.auto&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt;

&lt;span class="nd"&gt;@click.command&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nd"&gt;@click.option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--model_file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example. saved/ckpd_recipe/Item2Vec-Nov-06-2021_02-41-35.pth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@click.option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--output_file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example. pop.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@click.option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--is_item2vec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;is_flag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_item2vec&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=====&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=====&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# for get Item title
&lt;/span&gt;    &lt;span class="c1"&gt;# e.g. foursquare
&lt;/span&gt;    &lt;span class="n"&gt;_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataset/foursquare-nyc-merged/foursquare-nyc-merged.item&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;internal_id_to_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;venue_category_name:token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# custom model(Item2Vec)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_item2vec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;checkpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;checkpoint&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seq_separator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;train_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valid_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;data_preparation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Item2Vec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;train_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;device&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_state_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkpoint&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;state_dict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_other_parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;other_parameter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# when not custom model
&lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;train_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valid_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_data_and_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model_file&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ground_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;uid_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;batch_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batched_data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;positive_u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;positive_i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;batched_data&lt;/span&gt;
        &lt;span class="n"&gt;ground_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;positive_i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;
        &lt;span class="n"&gt;uid_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;ranked_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;tqdm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uid_list&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;topk_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;topk_iid_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;full_sort_topk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cuda&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ranked_list&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;topk_iid_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;all_metrics_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r_list&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uid_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ground_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ranked_list&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;external_uid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id2token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid_field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;all_metrics_results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;external_uid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ground_list_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id2token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iid_field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g_list&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;predict_list_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id2token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iid_field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r_list&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ground_list&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;internal_id_to_title&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;g_list&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;predict_list&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;internal_id_to_title&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_metrics_results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Item2Vec is a custom model that &lt;a href="https://github.com/fufufukakaka/recbole-item2vec-model" rel="noopener noreferrer"&gt;I implemented&lt;/a&gt;, so I'm taking special care of it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;from recbole.utils.case_study import&lt;/code&gt; The function full_sort_topk allows for topk output, so I used in this script.&lt;br&gt;
(The name of the module &lt;code&gt;recbole.utils.case_study&lt;/code&gt; suggests that topk output is not the main purpose of RecBole.)&lt;/p&gt;

&lt;p&gt;And I use the output topk list to see the recommendation list match degree per model from the following script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;itertools&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tqdm.auto&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;filelist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output/foursquare_nyc_case_study/*.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;model_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;tqdm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filelist&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
            &lt;span class="n"&gt;model_results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_model&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_df&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; read is failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;_models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;combis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;combinations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_models&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;model_similarities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;tqdm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combis&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;model1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;model2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;model1_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;model2_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;model1_predict_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model1_result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;predict_list_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;
        &lt;span class="n"&gt;model2_predict_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model2_result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;predict_list_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;
        &lt;span class="n"&gt;sims&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m1_preds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m2_preds&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model1_predict_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model2_predict_list&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;_sim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m1_preds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m2_preds&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m1_preds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;sims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_sim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sims&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;model_similarities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;model1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model_similarities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source_model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dest_model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;foursquare_nyc_survey_with_recbole.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Doing this will generate a table like the one below. This is a result from foursquare.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fv29dvshjjjqwmexe43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fv29dvshjjjqwmexe43.png" alt="similarity_list"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full spreadsheet link is &lt;a href="https://docs.google.com/spreadsheets/d/1m-AEFbiEQF0kGwkxnUCZnbcusM6nFqA8J2WUnh91P14/edit?usp=sharing" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We will visualize this similarity list a a network graph. If the similarity is more than 0.5, we put an edge between the models(node).&lt;br&gt;
So the network graph looks like this. The result of modularity clustering is reflected in the colors. And the layout algorithm is Yifan Hu Multilevel.&lt;/p&gt;

&lt;h3&gt;
  
  
  MovieLens
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9q4t108e8qhsckz71rt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9q4t108e8qhsckz71rt.png" alt="network_movielens"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  FourSquare
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskctyfxcyxi8a1xwa8af.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskctyfxcyxi8a1xwa8af.png" alt="network_four_square"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Discussion
&lt;/h3&gt;

&lt;p&gt;Totally different results.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overall, the shape of the network is completely different&lt;/li&gt;
&lt;li&gt;In MovieLens Network, Factorization Machine is part of the same community. but not so for FourSquare Network.&lt;/li&gt;
&lt;li&gt;LightGCN, GCMC, and DGCF (graph-based model) seem to be relatively in the same community

&lt;ul&gt;
&lt;li&gt;I forgot to calculate DGCF on FourSquare, so I don't have one. 😭&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;The centrality of LightGCN, which was high NDCG in both, was high in MovieLens Network but low in FourSquare Network

&lt;ul&gt;
&lt;li&gt;eigenvector centrality: 0.97(movielens) -&amp;gt; 0.34(foursquare)&lt;/li&gt;
&lt;li&gt;By the way, the number one centrality is DGCF and BPR for MovieLens, and DMF and Pop (which just puts out the most popular items) for FourSquare!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;There are significantly more nodes that don't have an edge in FourSquare Network compared to MovieLens Network&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;I found that as the recommended data changes, the behavior of the model seems to change greatly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the cause?
&lt;/h2&gt;

&lt;p&gt;Through the analysis so far, we have found that the top models are being replaced because the behavior of the models is changing significantly depending on the data. What is the cause of this in the end?&lt;/p&gt;

&lt;p&gt;As mentioned above, we don't know anything yet, but from the basic statistics of the data, it is clear that the number of users, items, and sparsity are different, and this time we compared the data, so I think it is probably because of the influence (bias) of the nature of the service that produced the data. I think.&lt;br&gt;
The fact that we were able to confirm this hypothesis with multiple model data sets was a great achievement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Work
&lt;/h2&gt;

&lt;p&gt;I'd like to be able to express the bias of the data described above in some kind of index. If we can express the bias in the form of an index, we can make guesses such as "Model A or B seems to be strong because the index is this high.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;It is thanks to RecBole that we can now aim at such a prospect. Let's try RecBole!&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>recommendation</category>
      <category>recbole</category>
    </item>
  </channel>
</rss>
