workshops_recommender_systems/P4. Matrix Factorization.ipynb
2020-05-21 13:42:50 +02:00

1642 lines
82 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Self made SVD"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import helpers\n",
"import pandas as pd\n",
"import numpy as np\n",
"import scipy.sparse as sparse\n",
"from collections import defaultdict\n",
"from itertools import chain\n",
"import random\n",
"\n",
"train_read=pd.read_csv('./Datasets/ml-100k/train.csv', sep='\\t', header=None)\n",
"test_read=pd.read_csv('./Datasets/ml-100k/test.csv', sep='\\t', header=None)\n",
"train_ui, test_ui, user_code_id, user_id_code, item_code_id, item_id_code = helpers.data_to_csr(train_read, test_read)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Done similarly to https://github.com/albertauyeung/matrix-factorization-in-python\n",
"from tqdm import tqdm\n",
"\n",
"class SVD():\n",
" \n",
" def __init__(self, train_ui, learning_rate, regularization, nb_factors, iterations):\n",
" self.train_ui=train_ui\n",
" self.uir=list(zip(*[train_ui.nonzero()[0],train_ui.nonzero()[1], train_ui.data]))\n",
" \n",
" self.learning_rate=learning_rate\n",
" self.regularization=regularization\n",
" self.iterations=iterations\n",
" self.nb_users, self.nb_items=train_ui.shape\n",
" self.nb_ratings=train_ui.nnz\n",
" self.nb_factors=nb_factors\n",
" \n",
" self.Pu=np.random.normal(loc=0, scale=1./self.nb_factors, size=(self.nb_users, self.nb_factors))\n",
" self.Qi=np.random.normal(loc=0, scale=1./self.nb_factors, size=(self.nb_items, self.nb_factors))\n",
"\n",
" def train(self, test_ui=None):\n",
" if test_ui!=None:\n",
" self.test_uir=list(zip(*[test_ui.nonzero()[0],test_ui.nonzero()[1], test_ui.data]))\n",
" \n",
" self.learning_process=[]\n",
" pbar = tqdm(range(self.iterations))\n",
" for i in pbar:\n",
" pbar.set_description(f'Epoch {i} RMSE: {self.learning_process[-1][1] if i>0 else 0}. Training epoch {i+1}...')\n",
" np.random.shuffle(self.uir)\n",
" self.sgd(self.uir)\n",
" if test_ui==None:\n",
" self.learning_process.append([i+1, self.RMSE_total(self.uir)])\n",
" else:\n",
" self.learning_process.append([i+1, self.RMSE_total(self.uir), self.RMSE_total(self.test_uir)])\n",
" \n",
" def sgd(self, uir):\n",
" \n",
" for u, i, score in uir:\n",
" # Computer prediction and error\n",
" prediction = self.get_rating(u,i)\n",
" e = (score - prediction)\n",
" \n",
" # Update user and item latent feature matrices\n",
" Pu_update=self.learning_rate * (e * self.Qi[i] - self.regularization * self.Pu[u])\n",
" Qi_update=self.learning_rate * (e * self.Pu[u] - self.regularization * self.Qi[i])\n",
" \n",
" self.Pu[u] += Pu_update\n",
" self.Qi[i] += Qi_update\n",
" \n",
" def get_rating(self, u, i):\n",
" prediction = self.Pu[u].dot(self.Qi[i].T)\n",
" return prediction\n",
" \n",
" def RMSE_total(self, uir):\n",
" RMSE=0\n",
" for u,i, score in uir:\n",
" prediction = self.get_rating(u,i)\n",
" RMSE+=(score - prediction)**2\n",
" return np.sqrt(RMSE/len(uir))\n",
" \n",
" def estimations(self):\n",
" self.estimations=\\\n",
" np.dot(self.Pu,self.Qi.T)\n",
"\n",
" def recommend(self, user_code_id, item_code_id, topK=10):\n",
" \n",
" top_k = defaultdict(list)\n",
" for nb_user, user in enumerate(self.estimations):\n",
" \n",
" user_rated=self.train_ui.indices[self.train_ui.indptr[nb_user]:self.train_ui.indptr[nb_user+1]]\n",
" for item, score in enumerate(user):\n",
" if item not in user_rated and not np.isnan(score):\n",
" top_k[user_code_id[nb_user]].append((item_code_id[item], score))\n",
" result=[]\n",
" # Let's choose k best items in the format: (user, item1, score1, item2, score2, ...)\n",
" for uid, item_scores in top_k.items():\n",
" item_scores.sort(key=lambda x: x[1], reverse=True)\n",
" result.append([uid]+list(chain(*item_scores[:topK])))\n",
" return result\n",
" \n",
" def estimate(self, user_code_id, item_code_id, test_ui):\n",
" result=[]\n",
" for user, item in zip(*test_ui.nonzero()):\n",
" result.append([user_code_id[user], item_code_id[item], \n",
" self.estimations[user,item] if not np.isnan(self.estimations[user,item]) else 1])\n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Epoch 39 RMSE: 0.7493723517098142. Training epoch 40...: 100%|██████████| 40/40 [02:06<00:00, 3.16s/it]\n"
]
}
],
"source": [
"model=SVD(train_ui, learning_rate=0.005, regularization=0.02, nb_factors=100, iterations=40)\n",
"model.train(test_ui)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f39a01f7c50>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"df=pd.DataFrame(model.learning_process).iloc[:,:2]\n",
"df.columns=['epoch', 'train_RMSE']\n",
"plt.plot('epoch', 'train_RMSE', data=df, color='blue')\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f399be5f518>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3de5yOdf7H8dfHIYeUxNTKOCUd5DBqqH4ppHLISich20nZLVZt2NLarbTbKrXJLpVKRUXnTSelKLWpjOMi5xwGG0s6Uivf3x+fa7hpcBszcx/m/Xw8rsfc93Xdh+/lHp/7mu/38/18LYSAiIikr1KJboCIiBQtBXoRkTSnQC8ikuYU6EVE0pwCvYhImiuT6Absrlq1aqFOnTqJboaISEqZMWPGf0MIGfkd22egN7PRQEdgfQihYT7HDXgA6AB8D1wZQpgZHbsCGBQ99M8hhCf39X516tQhJydnXw8TEZEYZrZyT8fi6bp5Ami3l+PtgfrR1gt4MHrTw4HbgFOA5sBtZlYlviaLiEhh2WegDyFMBTbt5SHnA2OC+xg4zMyqA22BSSGETSGEL4FJ7P0LQ0REikBhDMbWAFbH3M+N9u1pv4iIFKOkGIw1s154tw+1atVKcGtEZH/973//Izc3l61btya6KWmvfPnyZGZmUrZs2bifUxiBfg1QM+Z+ZrRvDdBqt/3v5fcCIYRRwCiA7OxsFd8RSTG5ubkccsgh1KlTB8/PkKIQQmDjxo3k5uZSt27duJ9XGF03E4DLzZ0KfBVCWAe8BZxrZlWiQdhzo30ikma2bt1K1apVFeSLmJlRtWrV/f7LKZ70ynH4lXk1M8vFM2nKAoQQHgLewFMrl+LplVdFxzaZ2Z3A9OilBocQ9jaoKyIpTEG+eBTk33mfgT6E0G0fxwPQew/HRgOj97tVBfYt/n2TVXxvKSKS5NKsBMJDQFM841OTrkREIO0C/TXAYOADoBneo/RxQlskIkVv8+bNjBw5cr+f16FDBzZv3rzfz7vyyiupW7cuWVlZNGnShHfffXfHsVatWlGrVi1iF3Xq3LkzlSpVAmD79u307duXhg0b0qhRI5o1a8bnn38OeGWARo0akZWVRVZWFn379t3vtuUnKdIrC89hwB+BG4CRwL3ArcDkRDZKRIpYXqC//vrrd9m/bds2ypTZc5h74403CvyeQ4cO5eKLL2bKlCn06tWLJUuW7Dh22GGH8a9//YsWLVqwefNm1q1bt+PYs88+y9q1a5k7dy6lSpUiNzeXgw8+eMfxKVOmUK1atQK3Kz9pFujzHArcAvQB/hvtWwNcDQwEWgIaOBIpCjfeCLNnF+5rZmXBsGF7Pn7LLbewbNkysrKyKFu2LOXLl6dKlSosXLiQxYsX07lzZ1avXs3WrVu54YYb6NWrF7Cztta3335L+/btadGiBR999BE1atTglVdeoUKFCvts22mnncaaNWt22de1a1fGjx9PixYteOmll7jwwguZP38+AOvWraN69eqUKuUdKpmZmQX8V4lfmnXd7K4SUCe6vQT4N9AaOBPP9FTKvkg6GDJkCPXq1WP27NkMHTqUmTNn8sADD7B48WIARo8ezYwZM8jJyWH48OFs3LjxZ6+xZMkSevfuzfz58znssMN48cUX43rviRMn0rlz5132tWnThqlTp/LTTz8xfvx4Lr300h3HunTpwquvvkpWVhb9+vVj1qxZuzy3devWO7pu7r///v39p8hXml7R56cVsBx4DBiCl91pCnxClC0qIoVgb1fexaV58+a7TCgaPnw4L7/8MgCrV69myZIlVK1adZfn5PW5A5x88smsWLFir+8xYMAAbr31VnJzc5k2bdoux0qXLk2LFi0YP348W7ZsIbb0emZmJosWLWLy5MlMnjyZNm3a8Pzzz9OmTRugaLpu0vyKfnfl8UzQpXhRzvPYGeSfBNYnplkiUqhi+7zfe+893nnnHaZNm8acOXNo2rRpvhOOypUrt+N26dKl2bZt217fY+jQoSxevJi7776bq6+++mfHu3btSt++fenSpUu+79W+fXuGDh3Krbfeyj//+c/9Ob39VsICfZ5ywBXAndH9lfg8r1p45s68BLVLRArikEMO4Ztvvsn32FdffUWVKlWoWLEiCxcu5OOPCzcTr0+fPmzfvp233tp14v8ZZ5zBwIED6dZt16lIM2fOZO3atYBn4MydO5fatWsXapt2V4K6bvamNrAAXz/lSbx751w8c6deAtslIvGoWrUqp59+Og0bNqRChQoceeSRO461a9eOhx56iBNOOIHjjjuOU089tVDf28wYNGgQ99xzD23btt1lf//+/X/2+PXr13Pttdfyww8/AN7N1KdPnx3HW7duTenSpQFo3LgxY8aM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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"df=pd.DataFrame(model.learning_process[10:], columns=['epoch', 'train_RMSE', 'test_RMSE'])\n",
"plt.plot('epoch', 'train_RMSE', data=df, color='blue')\n",
"plt.plot('epoch', 'test_RMSE', data=df, color='yellow', linestyle='dashed')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Saving and evaluating recommendations"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"model.estimations()\n",
"\n",
"top_n=pd.DataFrame(model.recommend(user_code_id, item_code_id, topK=10))\n",
"\n",
"top_n.to_csv('Recommendations generated/ml-100k/Self_SVD_reco.csv', index=False, header=False)\n",
"\n",
"estimations=pd.DataFrame(model.estimate(user_code_id, item_code_id, test_ui))\n",
"estimations.to_csv('Recommendations generated/ml-100k/Self_SVD_estimations.csv', index=False, header=False)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"943it [00:00, 4912.25it/s]\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>RMSE</th>\n",
" <th>MAE</th>\n",
" <th>precision</th>\n",
" <th>recall</th>\n",
" <th>F_1</th>\n",
" <th>F_05</th>\n",
" <th>precision_super</th>\n",
" <th>recall_super</th>\n",
" <th>NDCG</th>\n",
" <th>mAP</th>\n",
" <th>MRR</th>\n",
" <th>LAUC</th>\n",
" <th>HR</th>\n",
" <th>Reco in test</th>\n",
" <th>Test coverage</th>\n",
" <th>Shannon</th>\n",
" <th>Gini</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.9144</td>\n",
" <td>0.718047</td>\n",
" <td>0.103393</td>\n",
" <td>0.043404</td>\n",
" <td>0.05292</td>\n",
" <td>0.070119</td>\n",
" <td>0.093455</td>\n",
" <td>0.074901</td>\n",
" <td>0.107441</td>\n",
" <td>0.05077</td>\n",
" <td>0.200719</td>\n",
" <td>0.518433</td>\n",
" <td>0.4772</td>\n",
" <td>0.866384</td>\n",
" <td>0.145743</td>\n",
" <td>3.860721</td>\n",
" <td>0.972299</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" RMSE MAE precision recall F_1 F_05 precision_super \\\n",
"0 0.9144 0.718047 0.103393 0.043404 0.05292 0.070119 0.093455 \n",
"\n",
" recall_super NDCG mAP MRR LAUC HR Reco in test \\\n",
"0 0.074901 0.107441 0.05077 0.200719 0.518433 0.4772 0.866384 \n",
"\n",
" Test coverage Shannon Gini \n",
"0 0.145743 3.860721 0.972299 "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import evaluation_measures as ev\n",
"\n",
"estimations_df=pd.read_csv('Recommendations generated/ml-100k/Self_SVD_estimations.csv', header=None)\n",
"reco=np.loadtxt('Recommendations generated/ml-100k/Self_SVD_reco.csv', delimiter=',')\n",
"\n",
"ev.evaluate(test=pd.read_csv('./Datasets/ml-100k/test.csv', sep='\\t', header=None),\n",
" estimations_df=estimations_df, \n",
" reco=reco,\n",
" super_reactions=[4,5])"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"943it [00:00, 4816.30it/s]\n",
"943it [00:00, 4733.95it/s]\n",
"943it [00:00, 4623.19it/s]\n",
"943it [00:00, 5099.59it/s]\n",
"943it [00:00, 4968.40it/s]\n",
"943it [00:00, 5056.01it/s]\n",
"943it [00:00, 5009.35it/s]\n",
"943it [00:00, 3610.70it/s]\n",
"943it [00:00, 4280.45it/s]\n",
"943it [00:00, 4473.91it/s]\n",
"943it [00:00, 4438.83it/s]\n",
"943it [00:00, 5165.96it/s]\n",
"943it [00:00, 5259.28it/s]\n",
"943it [00:00, 4607.07it/s]\n",
"943it [00:00, 4329.45it/s]\n",
"943it [00:00, 4693.81it/s]\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Model</th>\n",
" <th>RMSE</th>\n",
" <th>MAE</th>\n",
" <th>precision</th>\n",
" <th>recall</th>\n",
" <th>F_1</th>\n",
" <th>F_05</th>\n",
" <th>precision_super</th>\n",
" <th>recall_super</th>\n",
" <th>NDCG</th>\n",
" <th>mAP</th>\n",
" <th>MRR</th>\n",
" <th>LAUC</th>\n",
" <th>HR</th>\n",
" <th>Reco in test</th>\n",
" <th>Test coverage</th>\n",
" <th>Shannon</th>\n",
" <th>Gini</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_RP3Beta</td>\n",
" <td>3.702446</td>\n",
" <td>3.527273</td>\n",
" <td>0.282185</td>\n",
" <td>0.192092</td>\n",
" <td>0.186749</td>\n",
" <td>0.216980</td>\n",
" <td>0.204185</td>\n",
" <td>0.240096</td>\n",
" <td>0.339114</td>\n",
" <td>0.204905</td>\n",
" <td>0.572157</td>\n",
" <td>0.593544</td>\n",
" <td>0.875928</td>\n",
" <td>1.000000</td>\n",
" <td>0.077201</td>\n",
" <td>3.875892</td>\n",
" <td>0.974947</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_TopPop</td>\n",
" <td>2.508258</td>\n",
" <td>2.217909</td>\n",
" <td>0.188865</td>\n",
" <td>0.116919</td>\n",
" <td>0.118732</td>\n",
" <td>0.141584</td>\n",
" <td>0.130472</td>\n",
" <td>0.137473</td>\n",
" <td>0.214651</td>\n",
" <td>0.111707</td>\n",
" <td>0.400939</td>\n",
" <td>0.555546</td>\n",
" <td>0.765642</td>\n",
" <td>1.000000</td>\n",
" <td>0.038961</td>\n",
" <td>3.159079</td>\n",
" <td>0.987317</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_SVD</td>\n",
" <td>0.952784</td>\n",
" <td>0.750597</td>\n",
" <td>0.095228</td>\n",
" <td>0.047497</td>\n",
" <td>0.053142</td>\n",
" <td>0.067082</td>\n",
" <td>0.084871</td>\n",
" <td>0.076457</td>\n",
" <td>0.109075</td>\n",
" <td>0.050124</td>\n",
" <td>0.241366</td>\n",
" <td>0.520459</td>\n",
" <td>0.499470</td>\n",
" <td>0.992047</td>\n",
" <td>0.217893</td>\n",
" <td>4.405246</td>\n",
" <td>0.953484</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_SVDBaseline</td>\n",
" <td>0.913380</td>\n",
" <td>0.719974</td>\n",
" <td>0.105726</td>\n",
" <td>0.045055</td>\n",
" <td>0.054233</td>\n",
" <td>0.071579</td>\n",
" <td>0.096674</td>\n",
" <td>0.075899</td>\n",
" <td>0.119979</td>\n",
" <td>0.059709</td>\n",
" <td>0.251389</td>\n",
" <td>0.519270</td>\n",
" <td>0.476140</td>\n",
" <td>0.999788</td>\n",
" <td>0.115440</td>\n",
" <td>3.578129</td>\n",
" <td>0.980463</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_SVD</td>\n",
" <td>0.914400</td>\n",
" <td>0.718047</td>\n",
" <td>0.103393</td>\n",
" <td>0.043404</td>\n",
" <td>0.052920</td>\n",
" <td>0.070119</td>\n",
" <td>0.093455</td>\n",
" <td>0.074901</td>\n",
" <td>0.107441</td>\n",
" <td>0.050770</td>\n",
" <td>0.200719</td>\n",
" <td>0.518433</td>\n",
" <td>0.477200</td>\n",
" <td>0.866384</td>\n",
" <td>0.145743</td>\n",
" <td>3.860721</td>\n",
" <td>0.972299</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_SVDBiased</td>\n",
" <td>0.940375</td>\n",
" <td>0.742264</td>\n",
" <td>0.092153</td>\n",
" <td>0.039645</td>\n",
" <td>0.046804</td>\n",
" <td>0.061886</td>\n",
" <td>0.079399</td>\n",
" <td>0.055967</td>\n",
" <td>0.102017</td>\n",
" <td>0.047972</td>\n",
" <td>0.216876</td>\n",
" <td>0.516515</td>\n",
" <td>0.441145</td>\n",
" <td>0.997455</td>\n",
" <td>0.167388</td>\n",
" <td>4.235348</td>\n",
" <td>0.962085</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_Baseline</td>\n",
" <td>0.949459</td>\n",
" <td>0.752487</td>\n",
" <td>0.091410</td>\n",
" <td>0.037652</td>\n",
" <td>0.046030</td>\n",
" <td>0.061286</td>\n",
" <td>0.079614</td>\n",
" <td>0.056463</td>\n",
" <td>0.095957</td>\n",
" <td>0.043178</td>\n",
" <td>0.198193</td>\n",
" <td>0.515501</td>\n",
" <td>0.437964</td>\n",
" <td>1.000000</td>\n",
" <td>0.033911</td>\n",
" <td>2.836513</td>\n",
" <td>0.991139</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_GlobalAvg</td>\n",
" <td>1.125760</td>\n",
" <td>0.943534</td>\n",
" <td>0.061188</td>\n",
" <td>0.025968</td>\n",
" <td>0.031383</td>\n",
" <td>0.041343</td>\n",
" <td>0.040558</td>\n",
" <td>0.032107</td>\n",
" <td>0.067695</td>\n",
" <td>0.027470</td>\n",
" <td>0.171187</td>\n",
" <td>0.509546</td>\n",
" <td>0.384942</td>\n",
" <td>1.000000</td>\n",
" <td>0.025974</td>\n",
" <td>2.711772</td>\n",
" <td>0.992003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_Random</td>\n",
" <td>1.518551</td>\n",
" <td>1.218784</td>\n",
" <td>0.050583</td>\n",
" <td>0.024085</td>\n",
" <td>0.027323</td>\n",
" <td>0.034826</td>\n",
" <td>0.031223</td>\n",
" <td>0.026436</td>\n",
" <td>0.054902</td>\n",
" <td>0.020652</td>\n",
" <td>0.137928</td>\n",
" <td>0.508570</td>\n",
" <td>0.353128</td>\n",
" <td>0.987699</td>\n",
" <td>0.183261</td>\n",
" <td>5.093805</td>\n",
" <td>0.908215</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_I-KNN</td>\n",
" <td>1.030386</td>\n",
" <td>0.813067</td>\n",
" <td>0.026087</td>\n",
" <td>0.006908</td>\n",
" <td>0.010593</td>\n",
" <td>0.016046</td>\n",
" <td>0.021137</td>\n",
" <td>0.009522</td>\n",
" <td>0.024214</td>\n",
" <td>0.008958</td>\n",
" <td>0.048068</td>\n",
" <td>0.499885</td>\n",
" <td>0.154825</td>\n",
" <td>0.402333</td>\n",
" <td>0.434343</td>\n",
" <td>5.133650</td>\n",
" <td>0.877999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_U-KNNBaseline</td>\n",
" <td>0.935327</td>\n",
" <td>0.737424</td>\n",
" <td>0.002545</td>\n",
" <td>0.000755</td>\n",
" <td>0.001105</td>\n",
" <td>0.001602</td>\n",
" <td>0.002253</td>\n",
" <td>0.000930</td>\n",
" <td>0.003444</td>\n",
" <td>0.001362</td>\n",
" <td>0.011760</td>\n",
" <td>0.496724</td>\n",
" <td>0.021209</td>\n",
" <td>0.482821</td>\n",
" <td>0.059885</td>\n",
" <td>2.232578</td>\n",
" <td>0.994487</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_I-KNNBaseline</td>\n",
" <td>0.935327</td>\n",
" <td>0.737424</td>\n",
" <td>0.002545</td>\n",
" <td>0.000755</td>\n",
" <td>0.001105</td>\n",
" <td>0.001602</td>\n",
" <td>0.002253</td>\n",
" <td>0.000930</td>\n",
" <td>0.003444</td>\n",
" <td>0.001362</td>\n",
" <td>0.011760</td>\n",
" <td>0.496724</td>\n",
" <td>0.021209</td>\n",
" <td>0.482821</td>\n",
" <td>0.059885</td>\n",
" <td>2.232578</td>\n",
" <td>0.994487</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_U-KNN</td>\n",
" <td>1.023495</td>\n",
" <td>0.807913</td>\n",
" <td>0.000742</td>\n",
" <td>0.000205</td>\n",
" <td>0.000305</td>\n",
" <td>0.000449</td>\n",
" <td>0.000536</td>\n",
" <td>0.000198</td>\n",
" <td>0.000845</td>\n",
" <td>0.000274</td>\n",
" <td>0.002744</td>\n",
" <td>0.496441</td>\n",
" <td>0.007423</td>\n",
" <td>0.602121</td>\n",
" <td>0.010823</td>\n",
" <td>2.089186</td>\n",
" <td>0.995706</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_TopRated</td>\n",
" <td>1.033085</td>\n",
" <td>0.822057</td>\n",
" <td>0.000954</td>\n",
" <td>0.000188</td>\n",
" <td>0.000298</td>\n",
" <td>0.000481</td>\n",
" <td>0.000644</td>\n",
" <td>0.000223</td>\n",
" <td>0.001043</td>\n",
" <td>0.000335</td>\n",
" <td>0.003348</td>\n",
" <td>0.496433</td>\n",
" <td>0.009544</td>\n",
" <td>0.699046</td>\n",
" <td>0.005051</td>\n",
" <td>1.945910</td>\n",
" <td>0.995669</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_BaselineUI</td>\n",
" <td>0.967585</td>\n",
" <td>0.762740</td>\n",
" <td>0.000954</td>\n",
" <td>0.000170</td>\n",
" <td>0.000278</td>\n",
" <td>0.000463</td>\n",
" <td>0.000644</td>\n",
" <td>0.000189</td>\n",
" <td>0.000752</td>\n",
" <td>0.000168</td>\n",
" <td>0.001677</td>\n",
" <td>0.496424</td>\n",
" <td>0.009544</td>\n",
" <td>0.600530</td>\n",
" <td>0.005051</td>\n",
" <td>1.803126</td>\n",
" <td>0.996380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_IKNN</td>\n",
" <td>1.018363</td>\n",
" <td>0.808793</td>\n",
" <td>0.000318</td>\n",
" <td>0.000108</td>\n",
" <td>0.000140</td>\n",
" <td>0.000189</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000214</td>\n",
" <td>0.000037</td>\n",
" <td>0.000368</td>\n",
" <td>0.496391</td>\n",
" <td>0.003181</td>\n",
" <td>0.392153</td>\n",
" <td>0.115440</td>\n",
" <td>4.174741</td>\n",
" <td>0.965327</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Model RMSE MAE precision recall F_1 \\\n",
"0 Self_RP3Beta 3.702446 3.527273 0.282185 0.192092 0.186749 \n",
"0 Self_TopPop 2.508258 2.217909 0.188865 0.116919 0.118732 \n",
"0 Ready_SVD 0.952784 0.750597 0.095228 0.047497 0.053142 \n",
"0 Self_SVDBaseline 0.913380 0.719974 0.105726 0.045055 0.054233 \n",
"0 Self_SVD 0.914400 0.718047 0.103393 0.043404 0.052920 \n",
"0 Ready_SVDBiased 0.940375 0.742264 0.092153 0.039645 0.046804 \n",
"0 Ready_Baseline 0.949459 0.752487 0.091410 0.037652 0.046030 \n",
"0 Self_GlobalAvg 1.125760 0.943534 0.061188 0.025968 0.031383 \n",
"0 Ready_Random 1.518551 1.218784 0.050583 0.024085 0.027323 \n",
"0 Ready_I-KNN 1.030386 0.813067 0.026087 0.006908 0.010593 \n",
"0 Ready_U-KNNBaseline 0.935327 0.737424 0.002545 0.000755 0.001105 \n",
"0 Ready_I-KNNBaseline 0.935327 0.737424 0.002545 0.000755 0.001105 \n",
"0 Ready_U-KNN 1.023495 0.807913 0.000742 0.000205 0.000305 \n",
"0 Self_TopRated 1.033085 0.822057 0.000954 0.000188 0.000298 \n",
"0 Self_BaselineUI 0.967585 0.762740 0.000954 0.000170 0.000278 \n",
"0 Self_IKNN 1.018363 0.808793 0.000318 0.000108 0.000140 \n",
"\n",
" F_05 precision_super recall_super NDCG mAP MRR \\\n",
"0 0.216980 0.204185 0.240096 0.339114 0.204905 0.572157 \n",
"0 0.141584 0.130472 0.137473 0.214651 0.111707 0.400939 \n",
"0 0.067082 0.084871 0.076457 0.109075 0.050124 0.241366 \n",
"0 0.071579 0.096674 0.075899 0.119979 0.059709 0.251389 \n",
"0 0.070119 0.093455 0.074901 0.107441 0.050770 0.200719 \n",
"0 0.061886 0.079399 0.055967 0.102017 0.047972 0.216876 \n",
"0 0.061286 0.079614 0.056463 0.095957 0.043178 0.198193 \n",
"0 0.041343 0.040558 0.032107 0.067695 0.027470 0.171187 \n",
"0 0.034826 0.031223 0.026436 0.054902 0.020652 0.137928 \n",
"0 0.016046 0.021137 0.009522 0.024214 0.008958 0.048068 \n",
"0 0.001602 0.002253 0.000930 0.003444 0.001362 0.011760 \n",
"0 0.001602 0.002253 0.000930 0.003444 0.001362 0.011760 \n",
"0 0.000449 0.000536 0.000198 0.000845 0.000274 0.002744 \n",
"0 0.000481 0.000644 0.000223 0.001043 0.000335 0.003348 \n",
"0 0.000463 0.000644 0.000189 0.000752 0.000168 0.001677 \n",
"0 0.000189 0.000000 0.000000 0.000214 0.000037 0.000368 \n",
"\n",
" LAUC HR Reco in test Test coverage Shannon Gini \n",
"0 0.593544 0.875928 1.000000 0.077201 3.875892 0.974947 \n",
"0 0.555546 0.765642 1.000000 0.038961 3.159079 0.987317 \n",
"0 0.520459 0.499470 0.992047 0.217893 4.405246 0.953484 \n",
"0 0.519270 0.476140 0.999788 0.115440 3.578129 0.980463 \n",
"0 0.518433 0.477200 0.866384 0.145743 3.860721 0.972299 \n",
"0 0.516515 0.441145 0.997455 0.167388 4.235348 0.962085 \n",
"0 0.515501 0.437964 1.000000 0.033911 2.836513 0.991139 \n",
"0 0.509546 0.384942 1.000000 0.025974 2.711772 0.992003 \n",
"0 0.508570 0.353128 0.987699 0.183261 5.093805 0.908215 \n",
"0 0.499885 0.154825 0.402333 0.434343 5.133650 0.877999 \n",
"0 0.496724 0.021209 0.482821 0.059885 2.232578 0.994487 \n",
"0 0.496724 0.021209 0.482821 0.059885 2.232578 0.994487 \n",
"0 0.496441 0.007423 0.602121 0.010823 2.089186 0.995706 \n",
"0 0.496433 0.009544 0.699046 0.005051 1.945910 0.995669 \n",
"0 0.496424 0.009544 0.600530 0.005051 1.803126 0.996380 \n",
"0 0.496391 0.003181 0.392153 0.115440 4.174741 0.965327 "
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import imp\n",
"imp.reload(ev)\n",
"\n",
"import evaluation_measures as ev\n",
"dir_path=\"Recommendations generated/ml-100k/\"\n",
"super_reactions=[4,5]\n",
"test=pd.read_csv('./Datasets/ml-100k/test.csv', sep='\\t', header=None)\n",
"\n",
"ev.evaluate_all(test, dir_path, super_reactions)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Embeddings"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1, 2],\n",
" [3, 4]])"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"array([[0.4472136 , 0.89442719],\n",
" [0.6 , 0.8 ]])"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x=np.array([[1,2],[3,4]])\n",
"display(x)\n",
"x/np.linalg.norm(x, axis=1)[:,None]"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>code</th>\n",
" <th>score</th>\n",
" <th>item_id</th>\n",
" <th>id</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>257</td>\n",
" <td>1.000000</td>\n",
" <td>258</td>\n",
" <td>258</td>\n",
" <td>Contact (1997)</td>\n",
" <td>Drama, Sci-Fi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>221</td>\n",
" <td>0.739090</td>\n",
" <td>222</td>\n",
" <td>222</td>\n",
" <td>Star Trek: First Contact (1996)</td>\n",
" <td>Action, Adventure, Sci-Fi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>63</td>\n",
" <td>0.736794</td>\n",
" <td>64</td>\n",
" <td>64</td>\n",
" <td>Shawshank Redemption, The (1994)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1162</td>\n",
" <td>0.736777</td>\n",
" <td>1163</td>\n",
" <td>1163</td>\n",
" <td>Portrait of a Lady, The (1996)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>125</td>\n",
" <td>0.736246</td>\n",
" <td>126</td>\n",
" <td>126</td>\n",
" <td>Spitfire Grill, The (1996)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>309</td>\n",
" <td>0.734523</td>\n",
" <td>310</td>\n",
" <td>310</td>\n",
" <td>Rainmaker, The (1997)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1605</td>\n",
" <td>0.733826</td>\n",
" <td>1606</td>\n",
" <td>1606</td>\n",
" <td>Deceiver (1997)</td>\n",
" <td>Crime</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>238</td>\n",
" <td>0.731338</td>\n",
" <td>239</td>\n",
" <td>239</td>\n",
" <td>Sneakers (1992)</td>\n",
" <td>Crime, Drama, Sci-Fi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>222</td>\n",
" <td>0.724939</td>\n",
" <td>223</td>\n",
" <td>223</td>\n",
" <td>Sling Blade (1996)</td>\n",
" <td>Drama, Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>266</td>\n",
" <td>0.724812</td>\n",
" <td>267</td>\n",
" <td>267</td>\n",
" <td>unknown</td>\n",
" <td>unknown</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" code score item_id id title \\\n",
"0 257 1.000000 258 258 Contact (1997) \n",
"1 221 0.739090 222 222 Star Trek: First Contact (1996) \n",
"2 63 0.736794 64 64 Shawshank Redemption, The (1994) \n",
"3 1162 0.736777 1163 1163 Portrait of a Lady, The (1996) \n",
"4 125 0.736246 126 126 Spitfire Grill, The (1996) \n",
"5 309 0.734523 310 310 Rainmaker, The (1997) \n",
"6 1605 0.733826 1606 1606 Deceiver (1997) \n",
"7 238 0.731338 239 239 Sneakers (1992) \n",
"8 222 0.724939 223 223 Sling Blade (1996) \n",
"9 266 0.724812 267 267 unknown \n",
"\n",
" genres \n",
"0 Drama, Sci-Fi \n",
"1 Action, Adventure, Sci-Fi \n",
"2 Drama \n",
"3 Drama \n",
"4 Drama \n",
"5 Drama \n",
"6 Crime \n",
"7 Crime, Drama, Sci-Fi \n",
"8 Drama, Thriller \n",
"9 unknown "
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"item=random.choice(list(set(train_ui.indices)))\n",
"\n",
"embeddings_norm=model.Qi/np.linalg.norm(model.Qi, axis=1)[:,None] # we do not mean-center here\n",
"# omitting normalization also makes sense, but items with a greater magnitude will be recommended more often\n",
"\n",
"similarity_scores=np.dot(embeddings_norm,embeddings_norm[item].T)\n",
"top_similar_items=pd.DataFrame(enumerate(similarity_scores), columns=['code', 'score'])\\\n",
".sort_values(by=['score'], ascending=[False])[:10]\n",
"\n",
"top_similar_items['item_id']=top_similar_items['code'].apply(lambda x: item_code_id[x])\n",
"\n",
"items=pd.read_csv('./Datasets/ml-100k/movies.csv')\n",
"\n",
"result=pd.merge(top_similar_items, items, left_on='item_id', right_on='id')\n",
"\n",
"result"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# project task 5: implement SVD on top baseline (as it is in Surprise library)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"# making changes to our implementation by considering additional parameters in the gradient descent procedure \n",
"# seems to be the fastest option\n",
"# please save the output in 'Recommendations generated/ml-100k/Self_SVDBaseline_reco.csv' and\n",
"# 'Recommendations generated/ml-100k/Self_SVDBaseline_estimations.csv'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ready-made SVD - Surprise implementation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SVD"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generating predictions...\n",
"Generating top N recommendations...\n",
"Generating predictions...\n"
]
}
],
"source": [
"import helpers\n",
"import surprise as sp\n",
"import imp\n",
"imp.reload(helpers)\n",
"\n",
"algo = sp.SVD(biased=False) # to use unbiased version\n",
"\n",
"helpers.ready_made(algo, reco_path='Recommendations generated/ml-100k/Ready_SVD_reco.csv',\n",
" estimations_path='Recommendations generated/ml-100k/Ready_SVD_estimations.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SVD biased - on top baseline"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generating predictions...\n",
"Generating top N recommendations...\n",
"Generating predictions...\n"
]
}
],
"source": [
"import helpers\n",
"import surprise as sp\n",
"import imp\n",
"imp.reload(helpers)\n",
"\n",
"algo = sp.SVD() # default is biased=True\n",
"\n",
"helpers.ready_made(algo, reco_path='Recommendations generated/ml-100k/Ready_SVDBiased_reco.csv',\n",
" estimations_path='Recommendations generated/ml-100k/Ready_SVDBiased_estimations.csv')"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"943it [00:00, 4850.60it/s]\n",
"943it [00:00, 4963.77it/s]\n",
"943it [00:00, 4500.32it/s]\n",
"943it [00:00, 5033.32it/s]\n",
"943it [00:00, 4491.41it/s]\n",
"943it [00:00, 5213.78it/s]\n",
"943it [00:00, 4930.11it/s]\n",
"943it [00:00, 4835.44it/s]\n",
"943it [00:00, 4567.62it/s]\n",
"943it [00:00, 4836.97it/s]\n",
"943it [00:00, 3965.34it/s]\n",
"943it [00:00, 4790.98it/s]\n",
"943it [00:00, 4721.85it/s]\n",
"943it [00:00, 4756.99it/s]\n",
"943it [00:00, 5004.97it/s]\n",
"943it [00:00, 4844.54it/s]\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Model</th>\n",
" <th>RMSE</th>\n",
" <th>MAE</th>\n",
" <th>precision</th>\n",
" <th>recall</th>\n",
" <th>F_1</th>\n",
" <th>F_05</th>\n",
" <th>precision_super</th>\n",
" <th>recall_super</th>\n",
" <th>NDCG</th>\n",
" <th>mAP</th>\n",
" <th>MRR</th>\n",
" <th>LAUC</th>\n",
" <th>HR</th>\n",
" <th>Reco in test</th>\n",
" <th>Test coverage</th>\n",
" <th>Shannon</th>\n",
" <th>Gini</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_RP3Beta</td>\n",
" <td>3.702446</td>\n",
" <td>3.527273</td>\n",
" <td>0.282185</td>\n",
" <td>0.192092</td>\n",
" <td>0.186749</td>\n",
" <td>0.216980</td>\n",
" <td>0.204185</td>\n",
" <td>0.240096</td>\n",
" <td>0.339114</td>\n",
" <td>0.204905</td>\n",
" <td>0.572157</td>\n",
" <td>0.593544</td>\n",
" <td>0.875928</td>\n",
" <td>1.000000</td>\n",
" <td>0.077201</td>\n",
" <td>3.875892</td>\n",
" <td>0.974947</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_TopPop</td>\n",
" <td>2.508258</td>\n",
" <td>2.217909</td>\n",
" <td>0.188865</td>\n",
" <td>0.116919</td>\n",
" <td>0.118732</td>\n",
" <td>0.141584</td>\n",
" <td>0.130472</td>\n",
" <td>0.137473</td>\n",
" <td>0.214651</td>\n",
" <td>0.111707</td>\n",
" <td>0.400939</td>\n",
" <td>0.555546</td>\n",
" <td>0.765642</td>\n",
" <td>1.000000</td>\n",
" <td>0.038961</td>\n",
" <td>3.159079</td>\n",
" <td>0.987317</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_SVD</td>\n",
" <td>0.951985</td>\n",
" <td>0.749904</td>\n",
" <td>0.105832</td>\n",
" <td>0.054287</td>\n",
" <td>0.059099</td>\n",
" <td>0.074448</td>\n",
" <td>0.093562</td>\n",
" <td>0.085108</td>\n",
" <td>0.124663</td>\n",
" <td>0.060089</td>\n",
" <td>0.275660</td>\n",
" <td>0.523903</td>\n",
" <td>0.527041</td>\n",
" <td>0.999682</td>\n",
" <td>0.214286</td>\n",
" <td>4.410890</td>\n",
" <td>0.953748</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_SVDBaseline</td>\n",
" <td>0.913380</td>\n",
" <td>0.719974</td>\n",
" <td>0.105726</td>\n",
" <td>0.045055</td>\n",
" <td>0.054233</td>\n",
" <td>0.071579</td>\n",
" <td>0.096674</td>\n",
" <td>0.075899</td>\n",
" <td>0.119979</td>\n",
" <td>0.059709</td>\n",
" <td>0.251389</td>\n",
" <td>0.519270</td>\n",
" <td>0.476140</td>\n",
" <td>0.999788</td>\n",
" <td>0.115440</td>\n",
" <td>3.578129</td>\n",
" <td>0.980463</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_SVD</td>\n",
" <td>0.914400</td>\n",
" <td>0.718047</td>\n",
" <td>0.103393</td>\n",
" <td>0.043404</td>\n",
" <td>0.052920</td>\n",
" <td>0.070119</td>\n",
" <td>0.093455</td>\n",
" <td>0.074901</td>\n",
" <td>0.107441</td>\n",
" <td>0.050770</td>\n",
" <td>0.200719</td>\n",
" <td>0.518433</td>\n",
" <td>0.477200</td>\n",
" <td>0.866384</td>\n",
" <td>0.145743</td>\n",
" <td>3.860721</td>\n",
" <td>0.972299</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_SVDBiased</td>\n",
" <td>0.940375</td>\n",
" <td>0.742264</td>\n",
" <td>0.092153</td>\n",
" <td>0.039645</td>\n",
" <td>0.046804</td>\n",
" <td>0.061886</td>\n",
" <td>0.079399</td>\n",
" <td>0.055967</td>\n",
" <td>0.102017</td>\n",
" <td>0.047972</td>\n",
" <td>0.216876</td>\n",
" <td>0.516515</td>\n",
" <td>0.441145</td>\n",
" <td>0.997455</td>\n",
" <td>0.167388</td>\n",
" <td>4.235348</td>\n",
" <td>0.962085</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_Baseline</td>\n",
" <td>0.949459</td>\n",
" <td>0.752487</td>\n",
" <td>0.091410</td>\n",
" <td>0.037652</td>\n",
" <td>0.046030</td>\n",
" <td>0.061286</td>\n",
" <td>0.079614</td>\n",
" <td>0.056463</td>\n",
" <td>0.095957</td>\n",
" <td>0.043178</td>\n",
" <td>0.198193</td>\n",
" <td>0.515501</td>\n",
" <td>0.437964</td>\n",
" <td>1.000000</td>\n",
" <td>0.033911</td>\n",
" <td>2.836513</td>\n",
" <td>0.991139</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_GlobalAvg</td>\n",
" <td>1.125760</td>\n",
" <td>0.943534</td>\n",
" <td>0.061188</td>\n",
" <td>0.025968</td>\n",
" <td>0.031383</td>\n",
" <td>0.041343</td>\n",
" <td>0.040558</td>\n",
" <td>0.032107</td>\n",
" <td>0.067695</td>\n",
" <td>0.027470</td>\n",
" <td>0.171187</td>\n",
" <td>0.509546</td>\n",
" <td>0.384942</td>\n",
" <td>1.000000</td>\n",
" <td>0.025974</td>\n",
" <td>2.711772</td>\n",
" <td>0.992003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_Random</td>\n",
" <td>1.518551</td>\n",
" <td>1.218784</td>\n",
" <td>0.050583</td>\n",
" <td>0.024085</td>\n",
" <td>0.027323</td>\n",
" <td>0.034826</td>\n",
" <td>0.031223</td>\n",
" <td>0.026436</td>\n",
" <td>0.054902</td>\n",
" <td>0.020652</td>\n",
" <td>0.137928</td>\n",
" <td>0.508570</td>\n",
" <td>0.353128</td>\n",
" <td>0.987699</td>\n",
" <td>0.183261</td>\n",
" <td>5.093805</td>\n",
" <td>0.908215</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_I-KNN</td>\n",
" <td>1.030386</td>\n",
" <td>0.813067</td>\n",
" <td>0.026087</td>\n",
" <td>0.006908</td>\n",
" <td>0.010593</td>\n",
" <td>0.016046</td>\n",
" <td>0.021137</td>\n",
" <td>0.009522</td>\n",
" <td>0.024214</td>\n",
" <td>0.008958</td>\n",
" <td>0.048068</td>\n",
" <td>0.499885</td>\n",
" <td>0.154825</td>\n",
" <td>0.402333</td>\n",
" <td>0.434343</td>\n",
" <td>5.133650</td>\n",
" <td>0.877999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_U-KNNBaseline</td>\n",
" <td>0.935327</td>\n",
" <td>0.737424</td>\n",
" <td>0.002545</td>\n",
" <td>0.000755</td>\n",
" <td>0.001105</td>\n",
" <td>0.001602</td>\n",
" <td>0.002253</td>\n",
" <td>0.000930</td>\n",
" <td>0.003444</td>\n",
" <td>0.001362</td>\n",
" <td>0.011760</td>\n",
" <td>0.496724</td>\n",
" <td>0.021209</td>\n",
" <td>0.482821</td>\n",
" <td>0.059885</td>\n",
" <td>2.232578</td>\n",
" <td>0.994487</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_I-KNNBaseline</td>\n",
" <td>0.935327</td>\n",
" <td>0.737424</td>\n",
" <td>0.002545</td>\n",
" <td>0.000755</td>\n",
" <td>0.001105</td>\n",
" <td>0.001602</td>\n",
" <td>0.002253</td>\n",
" <td>0.000930</td>\n",
" <td>0.003444</td>\n",
" <td>0.001362</td>\n",
" <td>0.011760</td>\n",
" <td>0.496724</td>\n",
" <td>0.021209</td>\n",
" <td>0.482821</td>\n",
" <td>0.059885</td>\n",
" <td>2.232578</td>\n",
" <td>0.994487</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Ready_U-KNN</td>\n",
" <td>1.023495</td>\n",
" <td>0.807913</td>\n",
" <td>0.000742</td>\n",
" <td>0.000205</td>\n",
" <td>0.000305</td>\n",
" <td>0.000449</td>\n",
" <td>0.000536</td>\n",
" <td>0.000198</td>\n",
" <td>0.000845</td>\n",
" <td>0.000274</td>\n",
" <td>0.002744</td>\n",
" <td>0.496441</td>\n",
" <td>0.007423</td>\n",
" <td>0.602121</td>\n",
" <td>0.010823</td>\n",
" <td>2.089186</td>\n",
" <td>0.995706</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_TopRated</td>\n",
" <td>1.033085</td>\n",
" <td>0.822057</td>\n",
" <td>0.000954</td>\n",
" <td>0.000188</td>\n",
" <td>0.000298</td>\n",
" <td>0.000481</td>\n",
" <td>0.000644</td>\n",
" <td>0.000223</td>\n",
" <td>0.001043</td>\n",
" <td>0.000335</td>\n",
" <td>0.003348</td>\n",
" <td>0.496433</td>\n",
" <td>0.009544</td>\n",
" <td>0.699046</td>\n",
" <td>0.005051</td>\n",
" <td>1.945910</td>\n",
" <td>0.995669</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_BaselineUI</td>\n",
" <td>0.967585</td>\n",
" <td>0.762740</td>\n",
" <td>0.000954</td>\n",
" <td>0.000170</td>\n",
" <td>0.000278</td>\n",
" <td>0.000463</td>\n",
" <td>0.000644</td>\n",
" <td>0.000189</td>\n",
" <td>0.000752</td>\n",
" <td>0.000168</td>\n",
" <td>0.001677</td>\n",
" <td>0.496424</td>\n",
" <td>0.009544</td>\n",
" <td>0.600530</td>\n",
" <td>0.005051</td>\n",
" <td>1.803126</td>\n",
" <td>0.996380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_IKNN</td>\n",
" <td>1.018363</td>\n",
" <td>0.808793</td>\n",
" <td>0.000318</td>\n",
" <td>0.000108</td>\n",
" <td>0.000140</td>\n",
" <td>0.000189</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000214</td>\n",
" <td>0.000037</td>\n",
" <td>0.000368</td>\n",
" <td>0.496391</td>\n",
" <td>0.003181</td>\n",
" <td>0.392153</td>\n",
" <td>0.115440</td>\n",
" <td>4.174741</td>\n",
" <td>0.965327</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Model RMSE MAE precision recall F_1 \\\n",
"0 Self_RP3Beta 3.702446 3.527273 0.282185 0.192092 0.186749 \n",
"0 Self_TopPop 2.508258 2.217909 0.188865 0.116919 0.118732 \n",
"0 Ready_SVD 0.951985 0.749904 0.105832 0.054287 0.059099 \n",
"0 Self_SVDBaseline 0.913380 0.719974 0.105726 0.045055 0.054233 \n",
"0 Self_SVD 0.914400 0.718047 0.103393 0.043404 0.052920 \n",
"0 Ready_SVDBiased 0.940375 0.742264 0.092153 0.039645 0.046804 \n",
"0 Ready_Baseline 0.949459 0.752487 0.091410 0.037652 0.046030 \n",
"0 Self_GlobalAvg 1.125760 0.943534 0.061188 0.025968 0.031383 \n",
"0 Ready_Random 1.518551 1.218784 0.050583 0.024085 0.027323 \n",
"0 Ready_I-KNN 1.030386 0.813067 0.026087 0.006908 0.010593 \n",
"0 Ready_U-KNNBaseline 0.935327 0.737424 0.002545 0.000755 0.001105 \n",
"0 Ready_I-KNNBaseline 0.935327 0.737424 0.002545 0.000755 0.001105 \n",
"0 Ready_U-KNN 1.023495 0.807913 0.000742 0.000205 0.000305 \n",
"0 Self_TopRated 1.033085 0.822057 0.000954 0.000188 0.000298 \n",
"0 Self_BaselineUI 0.967585 0.762740 0.000954 0.000170 0.000278 \n",
"0 Self_IKNN 1.018363 0.808793 0.000318 0.000108 0.000140 \n",
"\n",
" F_05 precision_super recall_super NDCG mAP MRR \\\n",
"0 0.216980 0.204185 0.240096 0.339114 0.204905 0.572157 \n",
"0 0.141584 0.130472 0.137473 0.214651 0.111707 0.400939 \n",
"0 0.074448 0.093562 0.085108 0.124663 0.060089 0.275660 \n",
"0 0.071579 0.096674 0.075899 0.119979 0.059709 0.251389 \n",
"0 0.070119 0.093455 0.074901 0.107441 0.050770 0.200719 \n",
"0 0.061886 0.079399 0.055967 0.102017 0.047972 0.216876 \n",
"0 0.061286 0.079614 0.056463 0.095957 0.043178 0.198193 \n",
"0 0.041343 0.040558 0.032107 0.067695 0.027470 0.171187 \n",
"0 0.034826 0.031223 0.026436 0.054902 0.020652 0.137928 \n",
"0 0.016046 0.021137 0.009522 0.024214 0.008958 0.048068 \n",
"0 0.001602 0.002253 0.000930 0.003444 0.001362 0.011760 \n",
"0 0.001602 0.002253 0.000930 0.003444 0.001362 0.011760 \n",
"0 0.000449 0.000536 0.000198 0.000845 0.000274 0.002744 \n",
"0 0.000481 0.000644 0.000223 0.001043 0.000335 0.003348 \n",
"0 0.000463 0.000644 0.000189 0.000752 0.000168 0.001677 \n",
"0 0.000189 0.000000 0.000000 0.000214 0.000037 0.000368 \n",
"\n",
" LAUC HR Reco in test Test coverage Shannon Gini \n",
"0 0.593544 0.875928 1.000000 0.077201 3.875892 0.974947 \n",
"0 0.555546 0.765642 1.000000 0.038961 3.159079 0.987317 \n",
"0 0.523903 0.527041 0.999682 0.214286 4.410890 0.953748 \n",
"0 0.519270 0.476140 0.999788 0.115440 3.578129 0.980463 \n",
"0 0.518433 0.477200 0.866384 0.145743 3.860721 0.972299 \n",
"0 0.516515 0.441145 0.997455 0.167388 4.235348 0.962085 \n",
"0 0.515501 0.437964 1.000000 0.033911 2.836513 0.991139 \n",
"0 0.509546 0.384942 1.000000 0.025974 2.711772 0.992003 \n",
"0 0.508570 0.353128 0.987699 0.183261 5.093805 0.908215 \n",
"0 0.499885 0.154825 0.402333 0.434343 5.133650 0.877999 \n",
"0 0.496724 0.021209 0.482821 0.059885 2.232578 0.994487 \n",
"0 0.496724 0.021209 0.482821 0.059885 2.232578 0.994487 \n",
"0 0.496441 0.007423 0.602121 0.010823 2.089186 0.995706 \n",
"0 0.496433 0.009544 0.699046 0.005051 1.945910 0.995669 \n",
"0 0.496424 0.009544 0.600530 0.005051 1.803126 0.996380 \n",
"0 0.496391 0.003181 0.392153 0.115440 4.174741 0.965327 "
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import imp\n",
"imp.reload(ev)\n",
"\n",
"import evaluation_measures as ev\n",
"dir_path=\"Recommendations generated/ml-100k/\"\n",
"super_reactions=[4,5]\n",
"test=pd.read_csv('./Datasets/ml-100k/test.csv', sep='\\t', header=None)\n",
"\n",
"ev.evaluate_all(test, dir_path, super_reactions)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}