From f4284e1c2b398494512db1b686c6c3f3ec8bd072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=EA=B7=9C=28DG=20Lee=29?= Date: Sun, 17 Jan 2021 21:03:57 +0900 Subject: [PATCH] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8_CDAE.ipynb | 532 ++++++++++++++++++++++++++------------------------- 1 file changed, 274 insertions(+), 258 deletions(-) diff --git a/8_CDAE.ipynb b/8_CDAE.ipynb index 10acc39..ab28795 100644 --- a/8_CDAE.ipynb +++ b/8_CDAE.ipynb @@ -6,7 +6,7 @@ "name": "8_CDAE.ipynb", "provenance": [], "collapsed_sections": [], - "authorship_tag": "ABX9TyN1t1t2P7ygMLPXP9q3dC0x", + "authorship_tag": "ABX9TyNt8gL/1sWqXbJbrYCwByMm", "include_colab_link": true }, "kernelspec": { @@ -16,7 +16,7 @@ "accelerator": "GPU", "widgets": { "application/vnd.jupyter.widget-state+json": { - "4dc2f72c86064dbcb1eb810b97cfa3ce": { + "dadbd5fe9c0b4dff8941fedb33d635db": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { @@ -28,15 +28,15 @@ "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", - "layout": "IPY_MODEL_72646934c6ae4e1aad66ad0d8eaff5be", + "layout": "IPY_MODEL_f54207c913374817bb0cf263d5debde5", "_model_module": "@jupyter-widgets/controls", "children": [ - "IPY_MODEL_22f92bfb890c432087f4f5804525d852", - "IPY_MODEL_4ebc9e091cb4434e946004c006d00786" + "IPY_MODEL_97616305e3e64579b7ad0f26225cde5e", + "IPY_MODEL_73873a221c3e4abd877b6b9eaa837922" ] } }, - "72646934c6ae4e1aad66ad0d8eaff5be": { + "f54207c913374817bb0cf263d5debde5": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { @@ -87,12 +87,12 @@ "left": null } }, - "22f92bfb890c432087f4f5804525d852": { + "97616305e3e64579b7ad0f26225cde5e": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", - "style": "IPY_MODEL_ca4c371cd61b4b939c23d394c143ebb2", + "style": "IPY_MODEL_5f4b4396153344ce88578ba71d1a200a", "_dom_classes": [], "description": "100%", "_model_name": "FloatProgressModel", @@ -107,30 +107,30 @@ "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_d6097ad1653d4245bffa3b0ff0214f7a" + "layout": "IPY_MODEL_016f93f1bf0742b1965e4bce883e52b0" } }, - "4ebc9e091cb4434e946004c006d00786": { + "73873a221c3e4abd877b6b9eaa837922": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", - "style": "IPY_MODEL_1c928a5ac188462dab05a681633123a0", + "style": "IPY_MODEL_366df5abd92f483ab9dff36c4a1e8faa", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", - "value": " 604/604 [00:00<00:00, 605.59it/s]", + "value": " 604/604 [00:02<00:00, 293.49it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_65e588450c964d5bbf1709f80cbd1ae3" + "layout": "IPY_MODEL_f009643e91124475bdd99756c667dbfb" } }, - "ca4c371cd61b4b939c23d394c143ebb2": { + "5f4b4396153344ce88578ba71d1a200a": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { @@ -145,7 +145,7 @@ "_model_module": "@jupyter-widgets/controls" } }, - "d6097ad1653d4245bffa3b0ff0214f7a": { + "016f93f1bf0742b1965e4bce883e52b0": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { @@ -196,7 +196,7 @@ "left": null } }, - "1c928a5ac188462dab05a681633123a0": { + "366df5abd92f483ab9dff36c4a1e8faa": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { @@ -210,7 +210,7 @@ "_model_module": "@jupyter-widgets/controls" } }, - "65e588450c964d5bbf1709f80cbd1ae3": { + "f009643e91124475bdd99756c667dbfb": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { @@ -261,7 +261,7 @@ "left": null } }, - "ad93aaddcc5f4ccc9e3e8eac42c7a093": { + "e846966c624c4682b0f79363ac8479c9": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { @@ -273,15 +273,15 @@ "_view_count": null, "_view_module_version": "1.5.0", "box_style": "", - "layout": "IPY_MODEL_fbe796bfd1204ba5b32575dc1871be92", + "layout": "IPY_MODEL_6fd2afa2419142fc8d8ef438b635f3c2", "_model_module": "@jupyter-widgets/controls", "children": [ - "IPY_MODEL_ea7c28fbb86547cebdd4066ffed40a40", - "IPY_MODEL_83372642802c4278973109cb7140a029" + "IPY_MODEL_5f5d832d1e0a4afe9f8942fba2f52377", + "IPY_MODEL_eccf7aaa739f42c19029ac2e767edf7f" ] } }, - "fbe796bfd1204ba5b32575dc1871be92": { + "6fd2afa2419142fc8d8ef438b635f3c2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { @@ -332,12 +332,12 @@ "left": null } }, - "ea7c28fbb86547cebdd4066ffed40a40": { + "5f5d832d1e0a4afe9f8942fba2f52377": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_view_name": "ProgressView", - "style": "IPY_MODEL_77615147668546b081411b5b76e82064", + "style": "IPY_MODEL_9e22efc51ee74aad92c80cb38fd7dc39", "_dom_classes": [], "description": "100%", "_model_name": "FloatProgressModel", @@ -352,30 +352,30 @@ "min": 0, "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_6c79103bf5e14ed28d36d89151be6f15" + "layout": "IPY_MODEL_df73889712a340d88ecb41cb76a008c2" } }, - "83372642802c4278973109cb7140a029": { + "eccf7aaa739f42c19029ac2e767edf7f": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_view_name": "HTMLView", - "style": "IPY_MODEL_f6ea46f926be49ac869203a9f2a742c2", + "style": "IPY_MODEL_16fab20433094fc78aa462d4c2a47eba", "_dom_classes": [], "description": "", "_model_name": "HTMLModel", "placeholder": "​", "_view_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", - "value": " 604/604 [00:01<00:00, 415.02it/s]", + "value": " 604/604 [00:01<00:00, 351.48it/s]", "_view_count": null, "_view_module_version": "1.5.0", "description_tooltip": null, "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_3924ea40d8684294af48f1e4e0b2b256" + "layout": "IPY_MODEL_54ba2f8216864e069ca7fec652ba900f" } }, - "77615147668546b081411b5b76e82064": { + "9e22efc51ee74aad92c80cb38fd7dc39": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { @@ -390,7 +390,7 @@ "_model_module": "@jupyter-widgets/controls" } }, - "6c79103bf5e14ed28d36d89151be6f15": { + "df73889712a340d88ecb41cb76a008c2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { @@ -441,7 +441,7 @@ "left": null } }, - "f6ea46f926be49ac869203a9f2a742c2": { + "16fab20433094fc78aa462d4c2a47eba": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { @@ -455,7 +455,7 @@ "_model_module": "@jupyter-widgets/controls" } }, - "3924ea40d8684294af48f1e4e0b2b256": { + "54ba2f8216864e069ca7fec652ba900f": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { @@ -530,9 +530,7 @@ "\n", "- [Collaborative Denoising Auto-Encoders for Top-N Recommender Systems](https://alicezheng.org/papers/wsdm16-cdae.pdf)\n", "\n", - "## Experiment\n", - "\n", - "- K-fold 사용" + "## Experiment" ] }, { @@ -551,8 +549,7 @@ "%matplotlib inline\n", "plt.style.use('ggplot')\n", "\n", - "from sklearn.model_selection import train_test_split, KFold\n", - "from scipy.sparse import csr_matrix\n", + "from sklearn.model_selection import train_test_split\n", "\n", "import tensorflow as tf\n", "import tensorflow.keras.backend as K\n", @@ -560,9 +557,7 @@ "from tensorflow.keras.layers import Input, Dense\n", "from tensorflow.keras.models import Model, load_model\n", "from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\n", - "from tensorflow.keras.optimizers import SGD, RMSprop, Adam\n", - "from tensorflow.keras.optimizers.schedules import ExponentialDecay\n", - "from tensorflow.keras.initializers import TruncatedNormal, RandomNormal\n", + "from tensorflow.keras.optimizers import Adam\n", "from tensorflow.keras.regularizers import l2\n", "\n", "from tensorflow.keras.utils import get_file\n", @@ -603,7 +598,7 @@ "\n", " col_names = ['user_id', 'movie_id', 'rating', 'timestamp']\n", " if data_size in ['20m', '25m']:\n", - " ratings = pd.read_csv(data, engine = 'python')\n", + " ratings = pd.read_csv(data, names = col_names, engine = 'python')\n", " else:\n", " ratings = pd.read_csv(data, sep = '|', delimiter = '::', names = col_names, engine = 'python')\n", " print(ratings.shape)\n", @@ -618,9 +613,9 @@ "id": "RZf8Gzf0VhYV", "colab": { "base_uri": "https://localhost:8080/", - "height": 213 + "height": 248 }, - "outputId": "31090a79-39eb-407b-d91f-bec51850db79" + "outputId": "5100f5bc-03fe-43bc-c0bd-d4bfdf1e1730" }, "source": [ "ratings = load_data('1m')\n", @@ -631,6 +626,8 @@ { "output_type": "stream", "text": [ + "Downloading data from http://files.grouplens.org/datasets/movielens/ml-1m.zip\n", + "5922816/5917549 [==============================] - 0s 0us/step\n", "(1000209, 4)\n" ], "name": "stdout" @@ -726,7 +723,7 @@ "colab": { "base_uri": "https://localhost:8080/" }, - "outputId": "a07b6ac4-0673-4dbf-ee5d-1cd29d9ac8d4" + "outputId": "db6b685e-41df-4bff-fdef-fed1b98aa675" }, "source": [ "user_list = ratings.user_id.unique()\n", @@ -759,7 +756,7 @@ "height": 195 }, "id": "r2QLtUIHbVta", - "outputId": "89ba4928-e90e-4460-946f-81601006788a" + "outputId": "3ff99422-e3cd-468f-9189-54699fb8708c" }, "source": [ "ratings = ratings.assign(\r\n", @@ -901,7 +898,7 @@ "height": 195 }, "id": "PAMuwTZjbfQU", - "outputId": "85777a05-264a-4223-d38e-e63854005b48" + "outputId": "b45e160c-375d-434c-f358-85f37df4e777" }, "source": [ "data = binarizer(ratings)\r\n", @@ -1137,32 +1134,33 @@ " super(CDAE, self).__init__()\r\n", " self.input_dim = input_dim\r\n", " self.latent_dim = latent_dim\r\n", - " self.hidden_layer = Dense(self.latent_dim, \r\n", - " activation = 'linear',\r\n", - " kernel_initializer = 'glorot_uniform',\r\n", - " bias_initializer = 'zeros',\r\n", - " kernel_regularizer = l2,\r\n", - " name = 'encoder')\r\n", - " self.output_layer = Dense(self.input_dim,\r\n", - " activation = 'sigmoid',\r\n", - " kernel_initializer = 'glorot_uniform',\r\n", - " bias_initializer = 'zeros',\r\n", - " kernel_regularizer = l2,\r\n", - " name = 'decoder')\r\n", + "\r\n", + " self.encoder = Dense(self.latent_dim, \r\n", + " activation = 'linear',\r\n", + " kernel_initializer = 'glorot_uniform',\r\n", + " bias_initializer = 'zeros',\r\n", + " kernel_regularizer = l2(1e-3),\r\n", + " name = 'encoder')\r\n", + " self.decoder = Dense(self.input_dim,\r\n", + " activation = 'sigmoid',\r\n", + " kernel_initializer = 'glorot_uniform',\r\n", + " bias_initializer = 'zeros',\r\n", + " kernel_regularizer = l2(1e-3),\r\n", + " name = 'decoder')\r\n", " \r\n", " _ = self.call(Input(shape = (self.input_dim, )))\r\n", " self.build(input_shape = (None, self.input_dim))\r\n", "\r\n", " def call(self, inputs):\r\n", - " h = self.hidden_layer(inputs)\r\n", - " return self.output_layer(h)\r\n", + " h = self.encoder(inputs)\r\n", + " return self.decoder(h)\r\n", "\r\n", " def train_step(self, inputs):\r\n", " with tf.GradientTape() as tape:\r\n", " outputs = self(inputs)\r\n", " loss = self.loss(inputs, outputs)\r\n", - " gradients = tape.gradient(loss, self.trainable_variables)\r\n", - " self.optimizer.apply_gradients(zip(gradients, self.trainable_variables))\r\n", + " grads = tape.gradient(loss, self.trainable_variables)\r\n", + " self.optimizer.apply_gradients(zip(grads, self.trainable_variables))\r\n", " return {'loss': loss}\r\n", "\r\n", " def test_step(self, data):\r\n", @@ -1200,6 +1198,119 @@ "execution_count": 13, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "NHoctUBox1Z4" + }, + "source": [ + "def test_predictor(query: pd.DataFrame, \n", + " model: Callable,\n", + " n_item: int, \n", + " batch_size: int, \n", + " N = 100) -> float:\n", + "\n", + " query = list_agg(query)\n", + "\n", + " n_data = query.index.size\n", + " ids = np.arange(n_data)\n", + " profile = query['movie_id']\n", + "\n", + " pred = []\n", + " n_batch = int(np.ceil(n_data / batch_size))\n", + " for batch_step in range(n_batch):\n", + " lower = batch_size * batch_step\n", + " upper = batch_size + lower\n", + "\n", + " batch_id = ids[lower: upper]\n", + " batch = np.zeros(shape = (batch_id.size, n_item))\n", + " for i, idx in enumerate(batch_id):\n", + " batch[i, profile[idx]] = 1.0\n", + "\n", + " pred_batch = model.predict(batch, verbose = 0)\n", + " \n", + " rec = np.argsort(np.where(batch == 1.0, -1.0, pred_batch), axis = 1)[:, :-N-1:-1]\n", + " pred.append(rec)\n", + " pred = np.concatenate(pred)\n", + " pred = [{'user_id': query.at[i, 'user_id'], 'movie_id': pred[i]} for i in range(n_data)]\n", + " return pd.DataFrame(pred)" + ], + "execution_count": 14, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "G05LGp9eAfE0" + }, + "source": [ + "class evaluate:\n", + " def __init__(self, true: pd.DataFrame, pred: pd.DataFrame):\n", + " self.true = true\n", + " self.pred = pred\n", + " self.max_K = 10000\n", + " self.idcg = np.cumsum([1.0 / np.log(i+2) for i in range(self.max_K)])\n", + "\n", + " def _recall(self, gt: List, rec: List, K = None) -> float:\n", + " K = K if K else self.max_K\n", + " res = [r for r in rec[:K] if r in gt]\n", + " return len(res) / np.min([K, len(gt)])\n", + " \n", + " def _precision(self, gt: List, rec: List, K = None) -> float:\n", + " K = K if K else self.max_K\n", + " res = [r for r in rec[:K] if r in gt]\n", + " return len(res) / len(rec[:K])\n", + "\n", + " def _AP(self, gt: List, rec: List, K = None) -> float: # Average Precision\n", + " K = K if K else self.max_K\n", + " res = 0.0\n", + " for i, r in enumerate(rec[:K]):\n", + " if r in gt:\n", + " res += self._precision(gt, rec[:K], i+1)\n", + " return res / np.min([K, len(gt)])\n", + "\n", + " def _RR(self, gt: List, rec: List, K = None) -> float: # Reciprocal Rank\n", + " K = K if K else self.max_K\n", + " for i, r in enumerate(rec[:K]):\n", + " if r in gt:\n", + " return 1.0 / (i+1)\n", + " return 0\n", + "\n", + " def _nDCG(self, gt: List, rec: List, K = None) -> float: # normalized Discounted Cumulative Gain\n", + " K = K if K else self.max_K\n", + " dcg = 0.0\n", + " for i, r in enumerate(rec[:K]):\n", + " if r in gt:\n", + " dcg += 1.0 / np.log(i+2)\n", + " idcg = self.idcg[min([len(gt), K])-1]\n", + " return dcg / idcg\n", + " \n", + " def __call__(self, K = None):\n", + " self.K = K\n", + " self.recall = 0\n", + " self.precision = 0\n", + " self.MAP = 0\n", + " self.MRR = 0\n", + " self.nDCG = 0\n", + " n = self.true.index.size\n", + " for gt, rec in zip(tqdm(self.true.movie_id), self.pred.movie_id):\n", + " self.recall += self._recall(gt, rec, K) / n\n", + " self.precision += self._precision(gt, rec, K) / n\n", + " self.MAP += self._AP(gt, rec, K) / n\n", + " self.MRR += self._RR(gt, rec, K) / n\n", + " self.nDCG += self._nDCG(gt, rec, K) / n\n", + "\n", + " def print_all(self):\n", + " K = '@' + str(self.K) if self.K else ''\n", + " print(f'{\"Recall\":>12}{K} : {self.recall:.5f}',\n", + " f'\\n{\"Precision\":>12}{K} : {self.precision:.5f}',\n", + " f'\\n{\"MAP\":>12}{K} : {self.MAP:.5f}',\n", + " f'\\n{\"MRR\":>12}{K} : {self.MRR:.5f}',\n", + " f'\\n{\"nDCG\":>12}{K} : {self.nDCG:.5f}')" + ], + "execution_count": 15, + "outputs": [] + }, { "cell_type": "code", "metadata": { @@ -1215,7 +1326,7 @@ "steps_per_epoch = train.user_id.nunique() // batch_size + 1\r\n", "validation_steps = valid.user_id.nunique() // batch_size + 1" ], - "execution_count": 14, + "execution_count": 16, "outputs": [] }, { @@ -1225,7 +1336,7 @@ "base_uri": "https://localhost:8080/" }, "id": "EfDSYBod6ZuU", - "outputId": "81dca71e-08df-40e9-f4e5-41d746fad8dd" + "outputId": "3ed0e14f-234b-4ae3-f9d6-0a84a126fb18" }, "source": [ "model = CDAE(n_item, 256)\r\n", @@ -1233,7 +1344,7 @@ "\r\n", "model.summary()" ], - "execution_count": 15, + "execution_count": 17, "outputs": [ { "output_type": "stream", @@ -1263,11 +1374,11 @@ "height": 1000 }, "id": "aOSh_Etb0Ldx", - "outputId": "deccc1a7-8716-4e2d-9a20-1a481cb92cad" + "outputId": "115b5e8b-d0d9-4dc6-f065-4554260fb7ce" }, "source": [ "%%time\r\n", - "early_stopping = EarlyStopping(monitor = 'val_ndcg', mode = 'max', verbose = 1, patience = epochs // 10)\r\n", + "early_stopping = EarlyStopping(monitor = 'val_ndcg', mode = 'max', verbose = 1, patience = epochs // 5)\r\n", "model_checkpoint = ModelCheckpoint('CDAE.h5', monitor = 'val_ndcg', mode = 'max', save_best_only = True)\r\n", "\r\n", "hist = model.fit(x = train_gen, validation_data = valid_gen, epochs = epochs,\r\n", @@ -1275,85 +1386,103 @@ " verbose = 1, callbacks = [early_stopping, model_checkpoint])\r\n", "show_history(hist, 'loss', 'ndcg')" ], - "execution_count": 16, + "execution_count": 18, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/100\n", - "38/38 [==============================] - 2s 27ms/step - loss: 208.5770 - val_ndcg: 0.1543\n", + "38/38 [==============================] - 3s 32ms/step - loss: 208.5770 - val_ndcg: 0.1543\n", "Epoch 2/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 149.9780 - val_ndcg: 0.1685\n", + "38/38 [==============================] - 1s 19ms/step - loss: 149.9780 - val_ndcg: 0.1685\n", "Epoch 3/100\n", - "38/38 [==============================] - 1s 16ms/step - loss: 135.3889 - val_ndcg: 0.2032\n", + "38/38 [==============================] - 1s 19ms/step - loss: 135.3889 - val_ndcg: 0.2032\n", "Epoch 4/100\n", - "38/38 [==============================] - 1s 16ms/step - loss: 124.9517 - val_ndcg: 0.1969\n", + "38/38 [==============================] - 1s 19ms/step - loss: 124.9517 - val_ndcg: 0.1969\n", "Epoch 5/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 117.9963 - val_ndcg: 0.1989\n", + "38/38 [==============================] - 1s 19ms/step - loss: 117.9963 - val_ndcg: 0.1989\n", "Epoch 6/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 113.1876 - val_ndcg: 0.1971\n", + "38/38 [==============================] - 1s 19ms/step - loss: 113.1876 - val_ndcg: 0.1971\n", "Epoch 7/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 108.9551 - val_ndcg: 0.2139\n", + "38/38 [==============================] - 1s 19ms/step - loss: 108.9551 - val_ndcg: 0.2139\n", "Epoch 8/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 105.9449 - val_ndcg: 0.1957\n", + "38/38 [==============================] - 1s 20ms/step - loss: 105.9449 - val_ndcg: 0.1957\n", "Epoch 9/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 102.3983 - val_ndcg: 0.2160\n", + "38/38 [==============================] - 1s 19ms/step - loss: 102.3983 - val_ndcg: 0.2160\n", "Epoch 10/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 100.2072 - val_ndcg: 0.1903\n", + "38/38 [==============================] - 1s 19ms/step - loss: 100.2072 - val_ndcg: 0.1903\n", "Epoch 11/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 99.3186 - val_ndcg: 0.2096\n", + "38/38 [==============================] - 1s 19ms/step - loss: 99.3186 - val_ndcg: 0.2096\n", "Epoch 12/100\n", - "38/38 [==============================] - 1s 16ms/step - loss: 97.1446 - val_ndcg: 0.2179\n", + "38/38 [==============================] - 1s 20ms/step - loss: 97.1446 - val_ndcg: 0.2179\n", "Epoch 13/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 93.2603 - val_ndcg: 0.2287\n", + "38/38 [==============================] - 1s 19ms/step - loss: 93.2603 - val_ndcg: 0.2287\n", "Epoch 14/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 91.5599 - val_ndcg: 0.2057\n", + "38/38 [==============================] - 1s 19ms/step - loss: 91.5599 - val_ndcg: 0.2057\n", "Epoch 15/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 87.8517 - val_ndcg: 0.2054\n", + "38/38 [==============================] - 1s 19ms/step - loss: 87.8517 - val_ndcg: 0.2054\n", "Epoch 16/100\n", - "38/38 [==============================] - 1s 18ms/step - loss: 86.0323 - val_ndcg: 0.2165\n", + "38/38 [==============================] - 1s 19ms/step - loss: 86.0323 - val_ndcg: 0.1993\n", "Epoch 17/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 82.8589 - val_ndcg: 0.2139\n", + "38/38 [==============================] - 1s 19ms/step - loss: 82.9082 - val_ndcg: 0.2249\n", "Epoch 18/100\n", - "38/38 [==============================] - 1s 18ms/step - loss: 80.6921 - val_ndcg: 0.2141\n", + "38/38 [==============================] - 1s 19ms/step - loss: 80.6807 - val_ndcg: 0.2085\n", "Epoch 19/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 77.9737 - val_ndcg: 0.2194\n", + "38/38 [==============================] - 1s 19ms/step - loss: 77.9304 - val_ndcg: 0.2202\n", "Epoch 20/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 75.3450 - val_ndcg: 0.2085\n", + "38/38 [==============================] - 1s 19ms/step - loss: 75.3276 - val_ndcg: 0.2233\n", "Epoch 21/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 73.5766 - val_ndcg: 0.2173\n", + "38/38 [==============================] - 1s 19ms/step - loss: 73.6036 - val_ndcg: 0.2346\n", "Epoch 22/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 71.7702 - val_ndcg: 0.2457\n", + "38/38 [==============================] - 1s 19ms/step - loss: 71.7989 - val_ndcg: 0.2144\n", "Epoch 23/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 69.2620 - val_ndcg: 0.2087\n", + "38/38 [==============================] - 1s 19ms/step - loss: 69.2702 - val_ndcg: 0.2028\n", "Epoch 24/100\n", - "38/38 [==============================] - 1s 18ms/step - loss: 66.9776 - val_ndcg: 0.2188\n", + "38/38 [==============================] - 1s 18ms/step - loss: 66.9875 - val_ndcg: 0.2043\n", "Epoch 25/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 64.7022 - val_ndcg: 0.2139\n", + "38/38 [==============================] - 1s 19ms/step - loss: 64.7183 - val_ndcg: 0.2000\n", "Epoch 26/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 62.5899 - val_ndcg: 0.2235\n", + "38/38 [==============================] - 1s 19ms/step - loss: 62.5964 - val_ndcg: 0.2261\n", "Epoch 27/100\n", - "38/38 [==============================] - 1s 18ms/step - loss: 60.5899 - val_ndcg: 0.2139\n", + "38/38 [==============================] - 1s 18ms/step - loss: 60.5953 - val_ndcg: 0.1954\n", "Epoch 28/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 58.4070 - val_ndcg: 0.2301\n", + "38/38 [==============================] - 1s 19ms/step - loss: 58.4034 - val_ndcg: 0.2204\n", "Epoch 29/100\n", - "38/38 [==============================] - 1s 18ms/step - loss: 56.5882 - val_ndcg: 0.2190\n", + "38/38 [==============================] - 1s 19ms/step - loss: 56.5949 - val_ndcg: 0.2182\n", "Epoch 30/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 55.1418 - val_ndcg: 0.2046\n", + "38/38 [==============================] - 1s 18ms/step - loss: 55.1459 - val_ndcg: 0.2030\n", "Epoch 31/100\n", - "38/38 [==============================] - 1s 17ms/step - loss: 53.0997 - val_ndcg: 0.2261\n", + "38/38 [==============================] - 1s 19ms/step - loss: 53.0630 - val_ndcg: 0.2124\n", "Epoch 32/100\n", - "38/38 [==============================] - 1s 18ms/step - loss: 51.0516 - val_ndcg: 0.2107\n", - "Epoch 00032: early stopping\n", - "CPU times: user 24.7 s, sys: 1.38 s, total: 26.1 s\n", - "Wall time: 21.9 s\n" + "38/38 [==============================] - 1s 19ms/step - loss: 51.0702 - val_ndcg: 0.2072\n", + "Epoch 33/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 49.4300 - val_ndcg: 0.2048\n", + "Epoch 34/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 47.8774 - val_ndcg: 0.2122\n", + "Epoch 35/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 46.3600 - val_ndcg: 0.2222\n", + "Epoch 36/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 44.7628 - val_ndcg: 0.2218\n", + "Epoch 37/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 43.4769 - val_ndcg: 0.2236\n", + "Epoch 38/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 41.8874 - val_ndcg: 0.2176\n", + "Epoch 39/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 40.5426 - val_ndcg: 0.2035\n", + "Epoch 40/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 39.3065 - val_ndcg: 0.2127\n", + "Epoch 41/100\n", + "38/38 [==============================] - 1s 19ms/step - loss: 38.1707 - val_ndcg: 0.2311\n", + "Epoch 00041: early stopping\n", + "CPU times: user 34.7 s, sys: 1.8 s, total: 36.5 s\n", + "Wall time: 32.2 s\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1365,119 +1494,6 @@ } ] }, - { - "cell_type": "code", - "metadata": { - "id": "NHoctUBox1Z4" - }, - "source": [ - "def test_predictor(query: pd.DataFrame, \n", - " model: Callable,\n", - " n_item: int, \n", - " batch_size: int, \n", - " N = 100) -> float:\n", - "\n", - " query = list_agg(query)\n", - "\n", - " n_data = query.index.size\n", - " ids = np.arange(n_data)\n", - " profile = query['movie_id']\n", - "\n", - " pred = []\n", - " n_batch = int(np.ceil(n_data / batch_size))\n", - " for batch_step in range(n_batch):\n", - " lower = batch_size * batch_step\n", - " upper = batch_size + lower\n", - "\n", - " batch_id = ids[lower: upper]\n", - " batch = np.zeros(shape = (batch_id.size, n_item))\n", - " for i, idx in enumerate(batch_id):\n", - " batch[i, profile[idx]] = 1.0\n", - "\n", - " pred_batch = model.predict(batch, verbose = 0)\n", - " \n", - " rec = np.argsort(np.where(batch == 1.0, -1.0, pred_batch), axis = 1)[:, :-N-1:-1]\n", - " pred.append(rec)\n", - " pred = np.concatenate(pred)\n", - " pred = [{'user_id': query.at[i, 'user_id'], 'movie_id': pred[i]} for i in range(n_data)]\n", - " return pd.DataFrame(pred)" - ], - "execution_count": 17, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "G05LGp9eAfE0" - }, - "source": [ - "class evaluate:\n", - " def __init__(self, true: pd.DataFrame, pred: pd.DataFrame):\n", - " self.true = true\n", - " self.pred = pred\n", - " self.max_K = 10000\n", - " self.idcg = np.cumsum([1.0 / np.log(i+2) for i in range(self.max_K)])\n", - "\n", - " def _recall(self, gt: List, rec: List, K = None) -> float:\n", - " K = K if K else self.max_K\n", - " res = [r for r in rec[:K] if r in gt]\n", - " return len(res) / np.min([K, len(gt)])\n", - " \n", - " def _precision(self, gt: List, rec: List, K = None) -> float:\n", - " K = K if K else self.max_K\n", - " res = [r for r in rec[:K] if r in gt]\n", - " return len(res) / len(rec[:K])\n", - "\n", - " def _AP(self, gt: List, rec: List, K = None) -> float: # Average Precision\n", - " K = K if K else self.max_K\n", - " res = 0.0\n", - " for i, r in enumerate(rec[:K]):\n", - " if r in gt:\n", - " res += self._precision(gt, rec[:K], i+1)\n", - " return res / np.min([K, len(gt)])\n", - "\n", - " def _RR(self, gt: List, rec: List, K = None) -> float: # Reciprocal Rank\n", - " K = K if K else self.max_K\n", - " for i, r in enumerate(rec[:K]):\n", - " if r in gt:\n", - " return 1.0 / (i+1)\n", - " return 0\n", - "\n", - " def _nDCG(self, gt: List, rec: List, K = None) -> float: # normalized Discounted Cumulative Gain\n", - " K = K if K else self.max_K\n", - " dcg = 0.0\n", - " for i, r in enumerate(rec[:K]):\n", - " if r in gt:\n", - " dcg += 1.0 / np.log(i+2)\n", - " idcg = self.idcg[min([len(gt), K])-1]\n", - " return dcg / idcg\n", - " \n", - " def __call__(self, K = None):\n", - " self.K = K\n", - " self.recall = 0\n", - " self.precision = 0\n", - " self.MAP = 0\n", - " self.MRR = 0\n", - " self.nDCG = 0\n", - " n = self.true.index.size\n", - " for gt, rec in zip(tqdm(self.true.movie_id), self.pred.movie_id):\n", - " self.recall += self._recall(gt, rec, K) / n\n", - " self.precision += self._precision(gt, rec, K) / n\n", - " self.MAP += self._AP(gt, rec, K) / n\n", - " self.MRR += self._RR(gt, rec, K) / n\n", - " self.nDCG += self._nDCG(gt, rec, K) / n\n", - "\n", - " def print_all(self):\n", - " K = '@' + str(self.K) if self.K else ''\n", - " print(f'{\"Recall\":>12}{K} : {self.recall:.5f}',\n", - " f'\\n{\"Precision\":>12}{K} : {self.precision:.5f}',\n", - " f'\\n{\"MAP\":>12}{K} : {self.MAP:.5f}',\n", - " f'\\n{\"MRR\":>12}{K} : {self.MRR:.5f}',\n", - " f'\\n{\"nDCG\":>12}{K} : {self.nDCG:.5f}')" - ], - "execution_count": 18, - "outputs": [] - }, { "cell_type": "code", "metadata": { @@ -1486,7 +1502,7 @@ "height": 195 }, "id": "-4tP0-a-zSxv", - "outputId": "5a7af38d-4894-4f53-e5ea-56d55973db09" + "outputId": "a488f531-203c-4f11-c24c-affc68d93b7c" }, "source": [ "true = list_agg(test_r)\r\n", @@ -1574,7 +1590,7 @@ "base_uri": "https://localhost:8080/", "height": 195 }, - "outputId": "bca56475-3638-44ce-e030-851733a8c1fb" + "outputId": "8cac9550-3ee7-4b0f-8419-b1060bb68eb3" }, "source": [ "pred = test_predictor(test_q, model, n_item, batch_size, N = 100)\n", @@ -1612,27 +1628,27 @@ " \n", " 0\n", " 2\n", - " [22, 678, 92, 587, 385, 13, 84, 9, 60, 273, 15...\n", + " [22, 678, 84, 9, 150, 60, 916, 218, 600, 13, 1...\n", " \n", " \n", " 1\n", " 8\n", - " [244, 184, 381, 171, 59, 506, 376, 68, 134, 5,...\n", + " [244, 184, 376, 171, 68, 506, 44, 59, 437, 124...\n", " \n", " \n", " 2\n", " 41\n", - " [132, 62, 856, 189, 758, 160, 155, 1474, 322, ...\n", + " [132, 160, 856, 758, 139, 155, 62, 980, 189, 1...\n", " \n", " \n", " 3\n", " 78\n", - " [104, 68, 531, 128, 499, 259, 406, 85, 48, 733...\n", + " [104, 68, 531, 259, 1613, 499, 733, 853, 381, ...\n", " \n", " \n", " 4\n", " 91\n", - " [8, 9, 46, 612, 596, 741, 13, 682, 64, 1523, 1...\n", + " [8, 46, 9, 13, 35, 612, 596, 1523, 64, 741, 68...\n", " \n", " \n", "\n", @@ -1640,11 +1656,11 @@ ], "text/plain": [ " user_id movie_id\n", - "0 2 [22, 678, 92, 587, 385, 13, 84, 9, 60, 273, 15...\n", - "1 8 [244, 184, 381, 171, 59, 506, 376, 68, 134, 5,...\n", - "2 41 [132, 62, 856, 189, 758, 160, 155, 1474, 322, ...\n", - "3 78 [104, 68, 531, 128, 499, 259, 406, 85, 48, 733...\n", - "4 91 [8, 9, 46, 612, 596, 741, 13, 682, 64, 1523, 1..." + "0 2 [22, 678, 84, 9, 150, 60, 916, 218, 600, 13, 1...\n", + "1 8 [244, 184, 376, 171, 68, 506, 44, 59, 437, 124...\n", + "2 41 [132, 160, 856, 758, 139, 155, 62, 980, 189, 1...\n", + "3 78 [104, 68, 531, 259, 1613, 499, 733, 853, 381, ...\n", + "4 91 [8, 46, 9, 13, 35, 612, 596, 1523, 64, 741, 68..." ] }, "metadata": { @@ -1662,25 +1678,25 @@ "base_uri": "https://localhost:8080/", "height": 292, "referenced_widgets": [ - "4dc2f72c86064dbcb1eb810b97cfa3ce", - "72646934c6ae4e1aad66ad0d8eaff5be", - "22f92bfb890c432087f4f5804525d852", - "4ebc9e091cb4434e946004c006d00786", - "ca4c371cd61b4b939c23d394c143ebb2", - "d6097ad1653d4245bffa3b0ff0214f7a", - "1c928a5ac188462dab05a681633123a0", - "65e588450c964d5bbf1709f80cbd1ae3", - "ad93aaddcc5f4ccc9e3e8eac42c7a093", - "fbe796bfd1204ba5b32575dc1871be92", - "ea7c28fbb86547cebdd4066ffed40a40", - "83372642802c4278973109cb7140a029", - "77615147668546b081411b5b76e82064", - "6c79103bf5e14ed28d36d89151be6f15", - "f6ea46f926be49ac869203a9f2a742c2", - "3924ea40d8684294af48f1e4e0b2b256" + "dadbd5fe9c0b4dff8941fedb33d635db", + "f54207c913374817bb0cf263d5debde5", + "97616305e3e64579b7ad0f26225cde5e", + "73873a221c3e4abd877b6b9eaa837922", + "5f4b4396153344ce88578ba71d1a200a", + "016f93f1bf0742b1965e4bce883e52b0", + "366df5abd92f483ab9dff36c4a1e8faa", + "f009643e91124475bdd99756c667dbfb", + "e846966c624c4682b0f79363ac8479c9", + "6fd2afa2419142fc8d8ef438b635f3c2", + "5f5d832d1e0a4afe9f8942fba2f52377", + "eccf7aaa739f42c19029ac2e767edf7f", + "9e22efc51ee74aad92c80cb38fd7dc39", + "df73889712a340d88ecb41cb76a008c2", + "16fab20433094fc78aa462d4c2a47eba", + "54ba2f8216864e069ca7fec652ba900f" ] }, - "outputId": "844a30f5-1362-43bf-ad68-ae7ea58bf2ab" + "outputId": "456e7a2d-c52d-43df-8ce5-e6b03a9beab3" }, "source": [ "scores = evaluate(true, pred)\n", @@ -1697,7 +1713,7 @@ "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4dc2f72c86064dbcb1eb810b97cfa3ce", + "model_id": "dadbd5fe9c0b4dff8941fedb33d635db", "version_minor": 0, "version_major": 2 }, @@ -1713,11 +1729,11 @@ "output_type": "stream", "text": [ "\n", - " Recall@20 : 0.14164 \n", + " Recall@20 : 0.14391 \n", " Precision@20 : 0.07765 \n", - " MAP@20 : 0.04528 \n", - " MRR@20 : 0.23636 \n", - " nDCG@20 : 0.11913\n" + " MAP@20 : 0.04410 \n", + " MRR@20 : 0.22720 \n", + " nDCG@20 : 0.11801\n" ], "name": "stdout" }, @@ -1725,7 +1741,7 @@ "output_type": "display_data", "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ad93aaddcc5f4ccc9e3e8eac42c7a093", + "model_id": "e846966c624c4682b0f79363ac8479c9", "version_minor": 0, "version_major": 2 }, @@ -1741,11 +1757,11 @@ "output_type": "stream", "text": [ "\n", - " Recall@100 : 0.39713 \n", - " Precision@100 : 0.05430 \n", - " MAP@100 : 0.06040 \n", - " MRR@100 : 0.24445 \n", - " nDCG@100 : 0.21526\n" + " Recall@100 : 0.39061 \n", + " Precision@100 : 0.05341 \n", + " MAP@100 : 0.05862 \n", + " MRR@100 : 0.23531 \n", + " nDCG@100 : 0.21145\n" ], "name": "stdout" }