1058 lines
35 KiB
Plaintext
1058 lines
35 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Self made simplified I-KNN"
|
|
]
|
|
},
|
|
{
|
|
"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",
|
|
"(\n",
|
|
" train_ui,\n",
|
|
" test_ui,\n",
|
|
" user_code_id,\n",
|
|
" user_id_code,\n",
|
|
" item_code_id,\n",
|
|
" item_id_code,\n",
|
|
") = helpers.data_to_csr(train_read, test_read)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"class IKNN:\n",
|
|
" def fit(self, train_ui):\n",
|
|
" self.train_ui = train_ui\n",
|
|
"\n",
|
|
" train_iu = train_ui.transpose()\n",
|
|
" norms = np.linalg.norm(\n",
|
|
" train_iu.A, axis=1\n",
|
|
" ) # here we compute length of each item ratings vector\n",
|
|
" norms = np.vectorize(lambda x: max(x, 1))(\n",
|
|
" norms[:, None]\n",
|
|
" ) # to avoid dividing by zero\n",
|
|
"\n",
|
|
" normalized_train_iu = sparse.csr_matrix(train_iu / norms)\n",
|
|
"\n",
|
|
" self.similarity_matrix_ii = (\n",
|
|
" normalized_train_iu * normalized_train_iu.transpose()\n",
|
|
" )\n",
|
|
"\n",
|
|
" self.estimations = np.array(\n",
|
|
" train_ui\n",
|
|
" * self.similarity_matrix_ii\n",
|
|
" / ((train_ui > 0) * self.similarity_matrix_ii)\n",
|
|
" )\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[\n",
|
|
" self.train_ui.indptr[nb_user] : self.train_ui.indptr[nb_user + 1]\n",
|
|
" ]\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(\n",
|
|
" [\n",
|
|
" user_code_id[user],\n",
|
|
" item_code_id[item],\n",
|
|
" self.estimations[user, item]\n",
|
|
" if not np.isnan(self.estimations[user, item])\n",
|
|
" else 1,\n",
|
|
" ]\n",
|
|
" )\n",
|
|
" return result"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"toy train ui:\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([[3, 4, 0, 0, 5, 0, 0, 4],\n",
|
|
" [0, 1, 2, 3, 0, 0, 0, 0],\n",
|
|
" [0, 0, 0, 5, 0, 3, 4, 0]])"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"similarity matrix:\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([[1. , 0.9701425 , 0. , 0. , 1. ,\n",
|
|
" 0. , 0. , 1. ],\n",
|
|
" [0.9701425 , 1. , 0.24253563, 0.12478355, 0.9701425 ,\n",
|
|
" 0. , 0. , 0.9701425 ],\n",
|
|
" [0. , 0.24253563, 1. , 0.51449576, 0. ,\n",
|
|
" 0. , 0. , 0. ],\n",
|
|
" [0. , 0.12478355, 0.51449576, 1. , 0. ,\n",
|
|
" 0.85749293, 0.85749293, 0. ],\n",
|
|
" [1. , 0.9701425 , 0. , 0. , 1. ,\n",
|
|
" 0. , 0. , 1. ],\n",
|
|
" [0. , 0. , 0. , 0.85749293, 0. ,\n",
|
|
" 1. , 1. , 0. ],\n",
|
|
" [0. , 0. , 0. , 0.85749293, 0. ,\n",
|
|
" 1. , 1. , 0. ],\n",
|
|
" [1. , 0.9701425 , 0. , 0. , 1. ,\n",
|
|
" 0. , 0. , 1. ]])"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"estimations matrix:\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([[4. , 4. , 4. , 4. , 4. ,\n",
|
|
" nan, nan, 4. ],\n",
|
|
" [1. , 1.35990333, 2.15478388, 2.53390319, 1. ,\n",
|
|
" 3. , 3. , 1. ],\n",
|
|
" [ nan, 5. , 5. , 4.05248907, nan,\n",
|
|
" 3.95012863, 3.95012863, nan]])"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[[0, 20, 4.0, 30, 4.0],\n",
|
|
" [10, 50, 3.0, 60, 3.0, 0, 1.0, 40, 1.0, 70, 1.0],\n",
|
|
" [20, 10, 5.0, 20, 5.0]]"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# toy example\n",
|
|
"toy_train_read = pd.read_csv(\n",
|
|
" \"./Datasets/toy-example/train.csv\",\n",
|
|
" sep=\"\\t\",\n",
|
|
" header=None,\n",
|
|
" names=[\"user\", \"item\", \"rating\", \"timestamp\"],\n",
|
|
")\n",
|
|
"toy_test_read = pd.read_csv(\n",
|
|
" \"./Datasets/toy-example/test.csv\",\n",
|
|
" sep=\"\\t\",\n",
|
|
" header=None,\n",
|
|
" names=[\"user\", \"item\", \"rating\", \"timestamp\"],\n",
|
|
")\n",
|
|
"\n",
|
|
"(\n",
|
|
" toy_train_ui,\n",
|
|
" toy_test_ui,\n",
|
|
" toy_user_code_id,\n",
|
|
" toy_user_id_code,\n",
|
|
" toy_item_code_id,\n",
|
|
" toy_item_id_code,\n",
|
|
") = helpers.data_to_csr(toy_train_read, toy_test_read)\n",
|
|
"\n",
|
|
"\n",
|
|
"model = IKNN()\n",
|
|
"model.fit(toy_train_ui)\n",
|
|
"\n",
|
|
"print(\"toy train ui:\")\n",
|
|
"display(toy_train_ui.A)\n",
|
|
"\n",
|
|
"print(\"similarity matrix:\")\n",
|
|
"display(model.similarity_matrix_ii.A)\n",
|
|
"\n",
|
|
"print(\"estimations matrix:\")\n",
|
|
"display(model.estimations)\n",
|
|
"\n",
|
|
"model.recommend(toy_user_code_id, toy_item_code_id)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"model = IKNN()\n",
|
|
"model.fit(train_ui)\n",
|
|
"\n",
|
|
"top_n = pd.DataFrame(model.recommend(user_code_id, item_code_id, topK=10))\n",
|
|
"\n",
|
|
"top_n.to_csv(\n",
|
|
" \"Recommendations generated/ml-100k/Self_IKNN_reco.csv\", index=False, header=False\n",
|
|
")\n",
|
|
"\n",
|
|
"estimations = pd.DataFrame(model.estimate(user_code_id, item_code_id, test_ui))\n",
|
|
"estimations.to_csv(\n",
|
|
" \"Recommendations generated/ml-100k/Self_IKNN_estimations.csv\",\n",
|
|
" index=False,\n",
|
|
" header=False,\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"943it [00:00, 9004.71it/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>1.018363</td>\n",
|
|
" <td>0.808793</td>\n",
|
|
" <td>0.000318</td>\n",
|
|
" <td>0.000108</td>\n",
|
|
" <td>0.00014</td>\n",
|
|
" <td>0.000189</td>\n",
|
|
" <td>0.0</td>\n",
|
|
" <td>0.0</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.11544</td>\n",
|
|
" <td>4.174741</td>\n",
|
|
" <td>0.965327</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" RMSE MAE precision recall F_1 F_05 \\\n",
|
|
"0 1.018363 0.808793 0.000318 0.000108 0.00014 0.000189 \n",
|
|
"\n",
|
|
" precision_super recall_super NDCG mAP MRR LAUC \\\n",
|
|
"0 0.0 0.0 0.000214 0.000037 0.000368 0.496391 \n",
|
|
"\n",
|
|
" HR Reco in test Test coverage Shannon Gini \n",
|
|
"0 0.003181 0.392153 0.11544 4.174741 0.965327 "
|
|
]
|
|
},
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"import evaluation_measures as ev\n",
|
|
"\n",
|
|
"estimations_df = pd.read_csv(\n",
|
|
" \"Recommendations generated/ml-100k/Self_IKNN_estimations.csv\", header=None\n",
|
|
")\n",
|
|
"reco = np.loadtxt(\"Recommendations generated/ml-100k/Self_IKNN_reco.csv\", delimiter=\",\")\n",
|
|
"\n",
|
|
"ev.evaluate(\n",
|
|
" 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],\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"943it [00:00, 8517.83it/s]\n",
|
|
"943it [00:00, 11438.64it/s]\n",
|
|
"943it [00:00, 11933.36it/s]\n",
|
|
"943it [00:00, 10307.81it/s]\n",
|
|
"943it [00:00, 12250.41it/s]\n",
|
|
"943it [00:00, 12064.07it/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_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_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>Ready_Random</td>\n",
|
|
" <td>1.521845</td>\n",
|
|
" <td>1.225949</td>\n",
|
|
" <td>0.047190</td>\n",
|
|
" <td>0.020753</td>\n",
|
|
" <td>0.024810</td>\n",
|
|
" <td>0.032269</td>\n",
|
|
" <td>0.029506</td>\n",
|
|
" <td>0.023707</td>\n",
|
|
" <td>0.050075</td>\n",
|
|
" <td>0.018728</td>\n",
|
|
" <td>0.121957</td>\n",
|
|
" <td>0.506893</td>\n",
|
|
" <td>0.329799</td>\n",
|
|
" <td>0.986532</td>\n",
|
|
" <td>0.184704</td>\n",
|
|
" <td>5.099706</td>\n",
|
|
" <td>0.907217</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>Self_TopRated</td>\n",
|
|
" <td>1.030712</td>\n",
|
|
" <td>0.820904</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_TopPop 2.508258 2.217909 0.188865 0.116919 0.118732 \n",
|
|
"0 Ready_Baseline 0.949459 0.752487 0.091410 0.037652 0.046030 \n",
|
|
"0 Ready_Random 1.521845 1.225949 0.047190 0.020753 0.024810 \n",
|
|
"0 Self_TopRated 1.030712 0.820904 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.141584 0.130472 0.137473 0.214651 0.111707 0.400939 \n",
|
|
"0 0.061286 0.079614 0.056463 0.095957 0.043178 0.198193 \n",
|
|
"0 0.032269 0.029506 0.023707 0.050075 0.018728 0.121957 \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.555546 0.765642 1.000000 0.038961 3.159079 0.987317 \n",
|
|
"0 0.515501 0.437964 1.000000 0.033911 2.836513 0.991139 \n",
|
|
"0 0.506893 0.329799 0.986532 0.184704 5.099706 0.907217 \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": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"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": [
|
|
"# Ready-made KNNs - Surprise implementation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### I-KNN - basic"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Computing the cosine similarity matrix...\n",
|
|
"Done computing similarity matrix.\n",
|
|
"Generating predictions...\n",
|
|
"Generating top N recommendations...\n",
|
|
"Generating predictions...\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import helpers\n",
|
|
"import surprise as sp\n",
|
|
"\n",
|
|
"sim_options = {\n",
|
|
" \"name\": \"cosine\",\n",
|
|
" \"user_based\": False,\n",
|
|
"} # compute similarities between items\n",
|
|
"algo = sp.KNNBasic(sim_options=sim_options)\n",
|
|
"\n",
|
|
"helpers.ready_made(\n",
|
|
" algo,\n",
|
|
" reco_path=\"Recommendations generated/ml-100k/Ready_I-KNN_reco.csv\",\n",
|
|
" estimations_path=\"Recommendations generated/ml-100k/Ready_I-KNN_estimations.csv\",\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### U-KNN - basic"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Computing the cosine similarity matrix...\n",
|
|
"Done computing similarity matrix.\n",
|
|
"Generating predictions...\n",
|
|
"Generating top N recommendations...\n",
|
|
"Generating predictions...\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"sim_options = {\n",
|
|
" \"name\": \"cosine\",\n",
|
|
" \"user_based\": True,\n",
|
|
"} # compute similarities between users\n",
|
|
"algo = sp.KNNBasic(sim_options=sim_options)\n",
|
|
"\n",
|
|
"helpers.ready_made(\n",
|
|
" algo,\n",
|
|
" reco_path=\"Recommendations generated/ml-100k/Ready_U-KNN_reco.csv\",\n",
|
|
" estimations_path=\"Recommendations generated/ml-100k/Ready_U-KNN_estimations.csv\",\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### I-KNN - on top baseline"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Estimating biases using als...\n",
|
|
"Computing the msd similarity matrix...\n",
|
|
"Done computing similarity matrix.\n",
|
|
"Generating predictions...\n",
|
|
"Generating top N recommendations...\n",
|
|
"Generating predictions...\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"sim_options = {\n",
|
|
" \"name\": \"cosine\",\n",
|
|
" \"user_based\": False,\n",
|
|
"} # compute similarities between items\n",
|
|
"algo = sp.KNNBaseline()\n",
|
|
"\n",
|
|
"helpers.ready_made(\n",
|
|
" algo,\n",
|
|
" reco_path=\"Recommendations generated/ml-100k/Ready_I-KNNBaseline_reco.csv\",\n",
|
|
" estimations_path=\"Recommendations generated/ml-100k/Ready_I-KNNBaseline_estimations.csv\",\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"943it [00:00, 11286.27it/s]\n",
|
|
"943it [00:00, 10874.86it/s]\n",
|
|
"943it [00:00, 11509.97it/s]\n",
|
|
"943it [00:00, 11855.81it/s]\n",
|
|
"943it [00:00, 11574.00it/s]\n",
|
|
"943it [00:00, 11080.19it/s]\n",
|
|
"943it [00:00, 11550.84it/s]\n",
|
|
"943it [00:00, 12148.14it/s]\n",
|
|
"943it [00:00, 10779.39it/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_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_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>Ready_Random</td>\n",
|
|
" <td>1.521845</td>\n",
|
|
" <td>1.225949</td>\n",
|
|
" <td>0.047190</td>\n",
|
|
" <td>0.020753</td>\n",
|
|
" <td>0.024810</td>\n",
|
|
" <td>0.032269</td>\n",
|
|
" <td>0.029506</td>\n",
|
|
" <td>0.023707</td>\n",
|
|
" <td>0.050075</td>\n",
|
|
" <td>0.018728</td>\n",
|
|
" <td>0.121957</td>\n",
|
|
" <td>0.506893</td>\n",
|
|
" <td>0.329799</td>\n",
|
|
" <td>0.986532</td>\n",
|
|
" <td>0.184704</td>\n",
|
|
" <td>5.099706</td>\n",
|
|
" <td>0.907217</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_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.030712</td>\n",
|
|
" <td>0.820904</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_TopPop 2.508258 2.217909 0.188865 0.116919 0.118732 \n",
|
|
"0 Ready_Baseline 0.949459 0.752487 0.091410 0.037652 0.046030 \n",
|
|
"0 Ready_Random 1.521845 1.225949 0.047190 0.020753 0.024810 \n",
|
|
"0 Ready_I-KNN 1.030386 0.813067 0.026087 0.006908 0.010593 \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.030712 0.820904 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.141584 0.130472 0.137473 0.214651 0.111707 0.400939 \n",
|
|
"0 0.061286 0.079614 0.056463 0.095957 0.043178 0.198193 \n",
|
|
"0 0.032269 0.029506 0.023707 0.050075 0.018728 0.121957 \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.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.555546 0.765642 1.000000 0.038961 3.159079 0.987317 \n",
|
|
"0 0.515501 0.437964 1.000000 0.033911 2.836513 0.991139 \n",
|
|
"0 0.506893 0.329799 0.986532 0.184704 5.099706 0.907217 \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.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": 10,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"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": [
|
|
"# project task 3: use a version of your choice of Surprise KNNalgorithm"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# read the docs and try to find best parameter configuration (let say in terms of RMSE)\n",
|
|
"# https://surprise.readthedocs.io/en/stable/knn_inspired.html##surprise.prediction_algorithms.knns.KNNBaseline\n",
|
|
"# the solution here can be similar to examples above\n",
|
|
"# please save the output in 'Recommendations generated/ml-100k/Self_KNNSurprisetask_reco.csv' and\n",
|
|
"# 'Recommendations generated/ml-100k/Self_KNNSurprisetask_estimations.csv'"
|
|
]
|
|
}
|
|
],
|
|
"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.8.5"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|