systemy_rekomendacyjne/P4. Matrix Factorization.ipynb

1491 lines
67 KiB
Plaintext
Raw Permalink Normal View History

2020-06-13 03:25:51 +02:00
{
"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": 2,
"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": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Epoch 39 RMSE: 0.750963575605171. Training epoch 40...: 100%|██████████| 40/40 [01:38<00:00, 2.45s/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": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fbd8f5ccc50>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"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": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fbd8c4b3da0>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"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": 6,
"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": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"943it [00:00, 7303.87it/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>H2R</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.91573</td>\n",
" <td>0.718921</td>\n",
" <td>0.102227</td>\n",
" <td>0.043137</td>\n",
" <td>0.051981</td>\n",
" <td>0.068872</td>\n",
" <td>0.093562</td>\n",
" <td>0.078057</td>\n",
" <td>0.104828</td>\n",
" <td>0.049448</td>\n",
" <td>0.191243</td>\n",
" <td>0.518286</td>\n",
" <td>0.472959</td>\n",
" <td>0.258749</td>\n",
" <td>0.859279</td>\n",
" <td>0.13925</td>\n",
" <td>3.83152</td>\n",
" <td>0.973234</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" RMSE MAE precision recall F_1 F_05 \\\n",
"0 0.91573 0.718921 0.102227 0.043137 0.051981 0.068872 \n",
"\n",
" precision_super recall_super NDCG mAP MRR LAUC \\\n",
"0 0.093562 0.078057 0.104828 0.049448 0.191243 0.518286 \n",
"\n",
" HR H2R Reco in test Test coverage Shannon Gini \n",
"0 0.472959 0.258749 0.859279 0.13925 3.83152 0.973234 "
]
},
"execution_count": 7,
"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": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"943it [00:00, 6614.64it/s]\n",
"943it [00:00, 6657.91it/s]\n",
"943it [00:00, 6616.31it/s]\n",
"943it [00:00, 7049.97it/s]\n",
"943it [00:00, 7105.27it/s]\n",
"943it [00:00, 7296.68it/s]\n",
"943it [00:00, 6993.15it/s]\n",
"943it [00:00, 7255.64it/s]\n",
"943it [00:00, 6724.45it/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>H2R</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_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>0.492047</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>Self_SVD</td>\n",
" <td>0.915730</td>\n",
" <td>0.718921</td>\n",
" <td>0.102227</td>\n",
" <td>0.043137</td>\n",
" <td>0.051981</td>\n",
" <td>0.068872</td>\n",
" <td>0.093562</td>\n",
" <td>0.078057</td>\n",
" <td>0.104828</td>\n",
" <td>0.049448</td>\n",
" <td>0.191243</td>\n",
" <td>0.518286</td>\n",
" <td>0.472959</td>\n",
" <td>0.258749</td>\n",
" <td>0.859279</td>\n",
" <td>0.139250</td>\n",
" <td>3.831520</td>\n",
" <td>0.973234</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>0.239661</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>0.142100</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.524954</td>\n",
" <td>1.223352</td>\n",
" <td>0.045599</td>\n",
" <td>0.021181</td>\n",
" <td>0.024585</td>\n",
" <td>0.031518</td>\n",
" <td>0.027897</td>\n",
" <td>0.021931</td>\n",
" <td>0.048111</td>\n",
" <td>0.017381</td>\n",
" <td>0.119005</td>\n",
" <td>0.507096</td>\n",
" <td>0.330859</td>\n",
" <td>0.091198</td>\n",
" <td>0.988123</td>\n",
" <td>0.181818</td>\n",
" <td>5.100792</td>\n",
" <td>0.906866</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_TopRated</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.032025</td>\n",
" <td>0.012674</td>\n",
" <td>0.015714</td>\n",
" <td>0.021183</td>\n",
" <td>0.028433</td>\n",
" <td>0.018573</td>\n",
" <td>0.022741</td>\n",
" <td>0.005328</td>\n",
" <td>0.031602</td>\n",
" <td>0.502764</td>\n",
" <td>0.237540</td>\n",
" <td>0.065748</td>\n",
" <td>0.697031</td>\n",
" <td>0.014430</td>\n",
" <td>2.220811</td>\n",
" <td>0.995173</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_KNNSurprisetask</td>\n",
" <td>0.997106</td>\n",
" <td>0.784163</td>\n",
" <td>0.005620</td>\n",
" <td>0.002921</td>\n",
" <td>0.003494</td>\n",
" <td>0.004325</td>\n",
" <td>0.004936</td>\n",
" <td>0.003461</td>\n",
" <td>0.007103</td>\n",
" <td>0.002833</td>\n",
" <td>0.021431</td>\n",
" <td>0.497819</td>\n",
" <td>0.042418</td>\n",
" <td>0.009544</td>\n",
" <td>0.453234</td>\n",
" <td>0.137085</td>\n",
" <td>2.866347</td>\n",
" <td>0.982811</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.000000</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.000000</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_TopPop 2.508258 2.217909 0.188865 0.116919 0.118732 \n",
"0 Self_SVD 0.915730 0.718921 0.102227 0.043137 0.051981 \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.524954 1.223352 0.045599 0.021181 0.024585 \n",
"0 Self_TopRated NaN NaN 0.032025 0.012674 0.015714 \n",
"0 Self_KNNSurprisetask 0.997106 0.784163 0.005620 0.002921 0.003494 \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.141584 0.130472 0.137473 0.214651 0.111707 0.400939 \n",
"0 0.068872 0.093562 0.078057 0.104828 0.049448 0.191243 \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.031518 0.027897 0.021931 0.048111 0.017381 0.119005 \n",
"0 0.021183 0.028433 0.018573 0.022741 0.005328 0.031602 \n",
"0 0.004325 0.004936 0.003461 0.007103 0.002833 0.021431 \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 H2R Reco in test Test coverage Shannon \\\n",
"0 0.555546 0.765642 0.492047 1.000000 0.038961 3.159079 \n",
"0 0.518286 0.472959 0.258749 0.859279 0.139250 3.831520 \n",
"0 0.515501 0.437964 0.239661 1.000000 0.033911 2.836513 \n",
"0 0.509546 0.384942 0.142100 1.000000 0.025974 2.711772 \n",
"0 0.507096 0.330859 0.091198 0.988123 0.181818 5.100792 \n",
"0 0.502764 0.237540 0.065748 0.697031 0.014430 2.220811 \n",
"0 0.497819 0.042418 0.009544 0.453234 0.137085 2.866347 \n",
"0 0.496424 0.009544 0.000000 0.600530 0.005051 1.803126 \n",
"0 0.496391 0.003181 0.000000 0.392153 0.115440 4.174741 \n",
"\n",
" Gini \n",
"0 0.987317 \n",
"0 0.973234 \n",
"0 0.991139 \n",
"0 0.992003 \n",
"0 0.906866 \n",
"0 0.995173 \n",
"0 0.982811 \n",
"0 0.996380 \n",
"0 0.965327 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import evaluation_measures as ev\n",
"\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": 9,
"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": 9,
"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": 10,
"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>1455</td>\n",
" <td>1.000000</td>\n",
" <td>1456</td>\n",
" <td>1456</td>\n",
" <td>Beat the Devil (1954)</td>\n",
" <td>Comedy, Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1523</td>\n",
" <td>0.993083</td>\n",
" <td>1524</td>\n",
" <td>1524</td>\n",
" <td>Kaspar Hauser (1993)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1366</td>\n",
" <td>0.992195</td>\n",
" <td>1367</td>\n",
" <td>1367</td>\n",
" <td>Faust (1994)</td>\n",
" <td>Animation</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1168</td>\n",
" <td>0.992131</td>\n",
" <td>1169</td>\n",
" <td>1169</td>\n",
" <td>Fresh (1994)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1368</td>\n",
" <td>0.991183</td>\n",
" <td>1369</td>\n",
" <td>1369</td>\n",
" <td>Forbidden Christ, The (Cristo proibito, Il) (1...</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1450</td>\n",
" <td>0.990743</td>\n",
" <td>1451</td>\n",
" <td>1451</td>\n",
" <td>Foreign Correspondent (1940)</td>\n",
" <td>Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>926</td>\n",
" <td>0.990661</td>\n",
" <td>927</td>\n",
" <td>927</td>\n",
" <td>Flower of My Secret, The (Flor de mi secreto, ...</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1067</td>\n",
" <td>0.990048</td>\n",
" <td>1068</td>\n",
" <td>1068</td>\n",
" <td>Star Maker, The (Uomo delle stelle, L') (1995)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1399</td>\n",
" <td>0.989842</td>\n",
" <td>1400</td>\n",
" <td>1400</td>\n",
" <td>Picture Bride (1995)</td>\n",
" <td>Drama, Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1204</td>\n",
" <td>0.989625</td>\n",
" <td>1205</td>\n",
" <td>1205</td>\n",
" <td>Secret Agent, The (1996)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" code score item_id id \\\n",
"0 1455 1.000000 1456 1456 \n",
"1 1523 0.993083 1524 1524 \n",
"2 1366 0.992195 1367 1367 \n",
"3 1168 0.992131 1169 1169 \n",
"4 1368 0.991183 1369 1369 \n",
"5 1450 0.990743 1451 1451 \n",
"6 926 0.990661 927 927 \n",
"7 1067 0.990048 1068 1068 \n",
"8 1399 0.989842 1400 1400 \n",
"9 1204 0.989625 1205 1205 \n",
"\n",
" title genres \n",
"0 Beat the Devil (1954) Comedy, Drama \n",
"1 Kaspar Hauser (1993) Drama \n",
"2 Faust (1994) Animation \n",
"3 Fresh (1994) Drama \n",
"4 Forbidden Christ, The (Cristo proibito, Il) (1... Drama \n",
"5 Foreign Correspondent (1940) Thriller \n",
"6 Flower of My Secret, The (Flor de mi secreto, ... Drama \n",
"7 Star Maker, The (Uomo delle stelle, L') (1995) Drama \n",
"8 Picture Bride (1995) Drama, Romance \n",
"9 Secret Agent, The (1996) Drama "
]
},
"execution_count": 10,
"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": 11,
"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": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"class SVD_bias():\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",
" self.bias_u = np.zeros(self.nb_users)\n",
" self.bias_i = np.zeros(self.nb_items)\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",
" bias_u_update=self.learning_rate * (e - self.regularization * self.bias_u[u])\n",
" bias_i_update=self.learning_rate * (e - self.regularization * self.bias_i[i])\n",
" \n",
" self.Pu[u] += Pu_update\n",
" self.Qi[i] += Qi_update\n",
" self.bias_u[u] += bias_u_update\n",
" self.bias_i[i] += bias_i_update\n",
" \n",
" def get_rating(self, u, i):\n",
" prediction = self.bias_u[u] + self.bias_i[i] + 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",
" self.bias_u[:,np.newaxis] + self.bias_i[np.newaxis:,] + 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": "markdown",
"metadata": {},
"source": [
"# Ready-made SVD - Surprise implementation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SVD"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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": 14,
"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": 15,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"943it [00:00, 5926.84it/s]\n",
"943it [00:00, 6314.27it/s]\n",
"943it [00:00, 5917.48it/s]\n",
"943it [00:00, 6138.94it/s]\n",
"943it [00:00, 6278.83it/s]\n",
"943it [00:00, 6319.68it/s]\n",
"943it [00:00, 4892.96it/s]\n",
"943it [00:00, 6955.58it/s]\n",
"943it [00:00, 4946.53it/s]\n",
"943it [00:00, 6823.16it/s]\n",
"943it [00:00, 6276.95it/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>H2R</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_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>0.492047</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.952247</td>\n",
" <td>0.751185</td>\n",
" <td>0.094168</td>\n",
" <td>0.044167</td>\n",
" <td>0.050919</td>\n",
" <td>0.065391</td>\n",
" <td>0.083047</td>\n",
" <td>0.069330</td>\n",
" <td>0.104266</td>\n",
" <td>0.047629</td>\n",
" <td>0.227719</td>\n",
" <td>0.518783</td>\n",
" <td>0.493107</td>\n",
" <td>0.238600</td>\n",
" <td>0.995016</td>\n",
" <td>0.212121</td>\n",
" <td>4.452947</td>\n",
" <td>0.951495</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_SVD</td>\n",
" <td>0.915730</td>\n",
" <td>0.718921</td>\n",
" <td>0.102227</td>\n",
" <td>0.043137</td>\n",
" <td>0.051981</td>\n",
" <td>0.068872</td>\n",
" <td>0.093562</td>\n",
" <td>0.078057</td>\n",
" <td>0.104828</td>\n",
" <td>0.049448</td>\n",
" <td>0.191243</td>\n",
" <td>0.518286</td>\n",
" <td>0.472959</td>\n",
" <td>0.258749</td>\n",
" <td>0.859279</td>\n",
" <td>0.139250</td>\n",
" <td>3.831520</td>\n",
" <td>0.973234</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>0.239661</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>Ready_SVDBiased</td>\n",
" <td>0.939053</td>\n",
" <td>0.740840</td>\n",
" <td>0.083881</td>\n",
" <td>0.034033</td>\n",
" <td>0.041862</td>\n",
" <td>0.055808</td>\n",
" <td>0.074356</td>\n",
" <td>0.051753</td>\n",
" <td>0.092123</td>\n",
" <td>0.042224</td>\n",
" <td>0.199165</td>\n",
" <td>0.513679</td>\n",
" <td>0.434783</td>\n",
" <td>0.203606</td>\n",
" <td>0.996501</td>\n",
" <td>0.170274</td>\n",
" <td>4.190739</td>\n",
" <td>0.963349</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>0.142100</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.524954</td>\n",
" <td>1.223352</td>\n",
" <td>0.045599</td>\n",
" <td>0.021181</td>\n",
" <td>0.024585</td>\n",
" <td>0.031518</td>\n",
" <td>0.027897</td>\n",
" <td>0.021931</td>\n",
" <td>0.048111</td>\n",
" <td>0.017381</td>\n",
" <td>0.119005</td>\n",
" <td>0.507096</td>\n",
" <td>0.330859</td>\n",
" <td>0.091198</td>\n",
" <td>0.988123</td>\n",
" <td>0.181818</td>\n",
" <td>5.100792</td>\n",
" <td>0.906866</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_TopRated</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.032025</td>\n",
" <td>0.012674</td>\n",
" <td>0.015714</td>\n",
" <td>0.021183</td>\n",
" <td>0.028433</td>\n",
" <td>0.018573</td>\n",
" <td>0.022741</td>\n",
" <td>0.005328</td>\n",
" <td>0.031602</td>\n",
" <td>0.502764</td>\n",
" <td>0.237540</td>\n",
" <td>0.065748</td>\n",
" <td>0.697031</td>\n",
" <td>0.014430</td>\n",
" <td>2.220811</td>\n",
" <td>0.995173</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Self_KNNSurprisetask</td>\n",
" <td>0.997106</td>\n",
" <td>0.784163</td>\n",
" <td>0.005620</td>\n",
" <td>0.002921</td>\n",
" <td>0.003494</td>\n",
" <td>0.004325</td>\n",
" <td>0.004936</td>\n",
" <td>0.003461</td>\n",
" <td>0.007103</td>\n",
" <td>0.002833</td>\n",
" <td>0.021431</td>\n",
" <td>0.497819</td>\n",
" <td>0.042418</td>\n",
" <td>0.009544</td>\n",
" <td>0.453234</td>\n",
" <td>0.137085</td>\n",
" <td>2.866347</td>\n",
" <td>0.982811</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.000000</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.000000</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_TopPop 2.508258 2.217909 0.188865 0.116919 0.118732 \n",
"0 Ready_SVD 0.952247 0.751185 0.094168 0.044167 0.050919 \n",
"0 Self_SVD 0.915730 0.718921 0.102227 0.043137 0.051981 \n",
"0 Ready_Baseline 0.949459 0.752487 0.091410 0.037652 0.046030 \n",
"0 Ready_SVDBiased 0.939053 0.740840 0.083881 0.034033 0.041862 \n",
"0 Self_GlobalAvg 1.125760 0.943534 0.061188 0.025968 0.031383 \n",
"0 Ready_Random 1.524954 1.223352 0.045599 0.021181 0.024585 \n",
"0 Self_TopRated NaN NaN 0.032025 0.012674 0.015714 \n",
"0 Self_KNNSurprisetask 0.997106 0.784163 0.005620 0.002921 0.003494 \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.141584 0.130472 0.137473 0.214651 0.111707 0.400939 \n",
"0 0.065391 0.083047 0.069330 0.104266 0.047629 0.227719 \n",
"0 0.068872 0.093562 0.078057 0.104828 0.049448 0.191243 \n",
"0 0.061286 0.079614 0.056463 0.095957 0.043178 0.198193 \n",
"0 0.055808 0.074356 0.051753 0.092123 0.042224 0.199165 \n",
"0 0.041343 0.040558 0.032107 0.067695 0.027470 0.171187 \n",
"0 0.031518 0.027897 0.021931 0.048111 0.017381 0.119005 \n",
"0 0.021183 0.028433 0.018573 0.022741 0.005328 0.031602 \n",
"0 0.004325 0.004936 0.003461 0.007103 0.002833 0.021431 \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 H2R Reco in test Test coverage Shannon \\\n",
"0 0.555546 0.765642 0.492047 1.000000 0.038961 3.159079 \n",
"0 0.518783 0.493107 0.238600 0.995016 0.212121 4.452947 \n",
"0 0.518286 0.472959 0.258749 0.859279 0.139250 3.831520 \n",
"0 0.515501 0.437964 0.239661 1.000000 0.033911 2.836513 \n",
"0 0.513679 0.434783 0.203606 0.996501 0.170274 4.190739 \n",
"0 0.509546 0.384942 0.142100 1.000000 0.025974 2.711772 \n",
"0 0.507096 0.330859 0.091198 0.988123 0.181818 5.100792 \n",
"0 0.502764 0.237540 0.065748 0.697031 0.014430 2.220811 \n",
"0 0.497819 0.042418 0.009544 0.453234 0.137085 2.866347 \n",
"0 0.496424 0.009544 0.000000 0.600530 0.005051 1.803126 \n",
"0 0.496391 0.003181 0.000000 0.392153 0.115440 4.174741 \n",
"\n",
" Gini \n",
"0 0.987317 \n",
"0 0.951495 \n",
"0 0.973234 \n",
"0 0.991139 \n",
"0 0.963349 \n",
"0 0.992003 \n",
"0 0.906866 \n",
"0 0.995173 \n",
"0 0.982811 \n",
"0 0.996380 \n",
"0 0.965327 "
]
},
"execution_count": 15,
"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": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}