{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "2021-06-27-analytics-zoo-ncf-goodreads.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true, "authorship_tag": "ABX9TyNYHqJssm3LIgxxMIb7VwO7" }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "vWAyqrazbVkU" }, "source": [ "# Analytics Zoo Recommendation Part 2\n", "> Applying NCF on Goodreads using Analytics Zoo library\n", "\n", "- toc: true\n", "- badges: true\n", "- comments: true\n", "- categories: [Book, BigData, PySpark, AnalyticsZoo, NCF]\n", "- image:" ] }, { "cell_type": "markdown", "metadata": { "id": "5tJLYN9yYJxO" }, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": { "id": "f4e-a8D8YSXJ" }, "source": [ "NCF Recommender with Explict Feedback\n", "\n", "In this notebook we demostrate how to build a neural network recommendation system, Neural Collaborative Filtering(NCF) with explict feedback. We use Recommender API in Analytics Zoo to build a model, and use optimizer of BigDL to train the model. \n", "\n", "The system ([Recommendation systems: Principles, methods and evaluation](http://www.sciencedirect.com/science/article/pii/S1110866515000341)) normally prompts the user through the system interface to provide ratings for items in order to construct and improve the model. The accuracy of recommendation depends on the quantity of ratings provided by the user. \n", "\n", "NCF([He, 2015](https://www.comp.nus.edu.sg/~xiangnan/papers/ncf.pdf)) leverages a multi-layer perceptrons to learn the user–item interaction function, at the mean time, NCF can express and generalize matrix factorization under its framework. includeMF(Boolean) is provided for users to build a NCF with or without matrix factorization. \n", "\n", "Data: \n", "* Goodreads book ratings dataset \n", " \n", "References: \n", "* A Keras implementation of Movie Recommendation([notebook](https://github.com/ririw/ririw.github.io/blob/master/assets/Recommending%20movies.ipynb)) from the [blog](http://blog.richardweiss.org/2016/09/25/movie-embeddings.html).\n", "* Nerual Collaborative filtering ([He, 2015](https://www.comp.nus.edu.sg/~xiangnan/papers/ncf.pdf))\n", "\n", "Python interface:\n", "\n", "```python\n", "ncf = NeuralCF(user_count, item_count, class_num, user_embed=20, item_embed=20, hidden_layers=(40, 20, 10), include_mf=True, mf_embed=20)\n", "```\n", "\n", "- `user_count`: The number of users. Positive int.\n", "- `item_count`: The number of classes. Positive int.\n", "- `class_num`: The number of classes. Positive int.\n", "- `user_embed`: Units of user embedding. Positive int. Default is 20.\n", "- `item_embed`: itemEmbed Units of item embedding. Positive int. Default is 20.\n", "- `hidden_layers`: Units of hidden layers for MLP. Tuple of positive int. Default is (40, 20, 10).\n", "- `include_mf`: Whether to include Matrix Factorization. Boolean. Default is True.\n", "- `mf_embed`: Units of matrix factorization embedding. Positive int. Default is 20." ] }, { "cell_type": "markdown", "metadata": { "id": "IPqTsm9pSckt" }, "source": [ "## Installation" ] }, { "cell_type": "markdown", "metadata": { "id": "u5UkOC-3SuwP" }, "source": [ "### Install Java 8" ] }, { "cell_type": "markdown", "metadata": { "id": "nY8_OcwpSyha" }, "source": [ "Run the command on the colaboratory file to install jdk 1.8" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8oH5g_58SScM", "outputId": "dfb99804-1975-4159-ef51-d23e021ec621" }, "source": [ "# Install jdk8\n", "!apt-get install openjdk-8-jdk-headless -qq > /dev/null\n", "# Set jdk environment path which enables you to run Pyspark in your Colab environment.\n", "import os\n", "os.environ[\"JAVA_HOME\"] = \"/usr/lib/jvm/java-8-openjdk-amd64\"\n", "!update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "zPqef37WS2r-" }, "source": [ "### Install Analytics Zoo from pip" ] }, { "cell_type": "markdown", "metadata": { "id": "Mo4najsbS5RX" }, "source": [ "You can add the following command on your colab file to install the analytics-zoo via pip easily:" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "RtHKGTcSS1cD", "outputId": "00364579-40ef-4fb9-e770-70428dc04ddd" }, "source": [ "# Install latest release version of analytics-zoo \n", "# Installing analytics-zoo from pip will automatically install pyspark, bigdl, and their dependencies.\n", "!pip install analytics-zoo" ], "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ "Collecting analytics-zoo\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/49/32/2fe969c682b8683fb3792f06107fe8ac56f165e307d327756c506aa76d31/analytics_zoo-0.10.0-py2.py3-none-manylinux1_x86_64.whl (158.9MB)\n", "\u001b[K |████████████████████████████████| 158.9MB 81kB/s \n", "\u001b[?25hCollecting conda-pack==0.3.1\n", " Downloading https://files.pythonhosted.org/packages/e9/e7/d942780c4281a665f34dbfffc1cd1517c5843fb478c133a1e1fa0df30cd6/conda_pack-0.3.1-py2.py3-none-any.whl\n", "Collecting bigdl==0.12.2\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/1a/40/81fed203a633536dbb83454f1a102ebde86214f576572769290afb9427c9/BigDL-0.12.2-py2.py3-none-manylinux1_x86_64.whl (114.1MB)\n", "\u001b[K |████████████████████████████████| 114.1MB 2.5MB/s \n", "\u001b[?25hCollecting pyspark==2.4.3\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/37/98/244399c0daa7894cdf387e7007d5e8b3710a79b67f3fd991c0b0b644822d/pyspark-2.4.3.tar.gz (215.6MB)\n", "\u001b[K |████████████████████████████████| 215.6MB 69kB/s \n", "\u001b[?25hRequirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from conda-pack==0.3.1->analytics-zoo) (57.0.0)\n", "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from bigdl==0.12.2->analytics-zoo) (1.15.0)\n", "Requirement already satisfied: numpy>=1.7 in /usr/local/lib/python3.7/dist-packages (from bigdl==0.12.2->analytics-zoo) (1.19.5)\n", "Collecting py4j==0.10.7\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/e3/53/c737818eb9a7dc32a7cd4f1396e787bd94200c3997c72c1dbe028587bd76/py4j-0.10.7-py2.py3-none-any.whl (197kB)\n", "\u001b[K |████████████████████████████████| 204kB 53.7MB/s \n", "\u001b[?25hBuilding wheels for collected packages: pyspark\n", " Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for pyspark: filename=pyspark-2.4.3-py2.py3-none-any.whl size=215964968 sha256=6d89c562d8dc3446296b8872b20b52d86bddd6342fd3dd59448c51a9d25a0513\n", " Stored in directory: /root/.cache/pip/wheels/8d/20/f0/b30e2024226dc112e256930dd2cd4f06d00ab053c86278dcf3\n", "Successfully built pyspark\n", "Installing collected packages: conda-pack, py4j, pyspark, bigdl, analytics-zoo\n", "Successfully installed analytics-zoo-0.10.0 bigdl-0.12.2 conda-pack-0.3.1 py4j-0.10.7 pyspark-2.4.3\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "M8KiG7WhTAPa" }, "source": [ "### Initialize context" ] }, { "cell_type": "markdown", "metadata": { "id": "ZWWxCdrkTCqY" }, "source": [ "Call init_nncontext() that will create a SparkContext with optimized performance configurations." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Wy6CnH-8S81r", "outputId": "06a6e670-b16f-487d-f2a4-857f6d157603" }, "source": [ "from zoo.common.nncontext import*\n", "\n", "sc = init_nncontext()" ], "execution_count": 3, "outputs": [ { "output_type": "stream", "text": [ "Prepending /usr/local/lib/python3.7/dist-packages/bigdl/share/conf/spark-bigdl.conf to sys.path\n", "Adding /usr/local/lib/python3.7/dist-packages/zoo/share/lib/analytics-zoo-bigdl_0.12.2-spark_2.4.3-0.10.0-jar-with-dependencies.jar to BIGDL_JARS\n", "Prepending /usr/local/lib/python3.7/dist-packages/zoo/share/conf/spark-analytics-zoo.conf to sys.path\n", "pyspark_submit_args is: --driver-class-path /usr/local/lib/python3.7/dist-packages/zoo/share/lib/analytics-zoo-bigdl_0.12.2-spark_2.4.3-0.10.0-jar-with-dependencies.jar:/usr/local/lib/python3.7/dist-packages/bigdl/share/lib/bigdl-0.12.2-jar-with-dependencies.jar pyspark-shell \n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "nLQymd-_TbKx" }, "source": [ "Analytics Zoo provides three Recommenders, including Wide and Deep (WND) model, Neural network-based Collaborative Filtering (NCF) model and Session Recommender model. Easy-to-use Keras-Style defined models which provides compile and fit methods for training. Alternatively, they could be fed into NNFrames or BigDL Optimizer.\n", "\n", "WND and NCF recommenders can handle either explict or implicit feedback, given corresponding features." ] }, { "cell_type": "markdown", "metadata": { "id": "_KTBMy52T5he" }, "source": [ "## Imports" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nsib3Wg_T7E5", "outputId": "7ebed2eb-383e-4dda-b8c9-6a8b14fa9495" }, "source": [ "from zoo.pipeline.api.keras.layers import *\n", "from zoo.models.recommendation import UserItemFeature\n", "from zoo.models.recommendation import NeuralCF\n", "from zoo.common.nncontext import init_nncontext\n", "import matplotlib\n", "from sklearn import metrics\n", "from operator import itemgetter\n", "from bigdl.util.common import *\n", "\n", "import os\n", "import numpy as np\n", "from sklearn import preprocessing\n", "\n", "matplotlib.use('agg')\n", "import matplotlib.pyplot as plt\n", "%pylab inline" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Cl6H99sBTgOt" }, "source": [ "## Download goodreads dataset" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wkKAeEORTPZ_", "outputId": "17ec66dd-dda9-4934-e57f-99692399c955" }, "source": [ "!wget https://github.com/sparsh-ai/reco-data/raw/master/goodreads/ratings.csv" ], "execution_count": 5, "outputs": [ { "output_type": "stream", "text": [ "--2021-06-27 12:57:02-- https://github.com/sparsh-ai/reco-data/raw/master/goodreads/ratings.csv\n", "Resolving github.com (github.com)... 192.30.255.113\n", "Connecting to github.com (github.com)|192.30.255.113|:443... connected.\n", "HTTP request sent, awaiting response... 302 Found\n", "Location: https://raw.githubusercontent.com/sparsh-ai/reco-data/master/goodreads/ratings.csv [following]\n", "--2021-06-27 12:57:04-- https://raw.githubusercontent.com/sparsh-ai/reco-data/master/goodreads/ratings.csv\n", "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n", "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 4976229 (4.7M) [text/plain]\n", "Saving to: ‘ratings.csv’\n", "\n", "ratings.csv 100%[===================>] 4.75M --.-KB/s in 0.1s \n", "\n", "2021-06-27 12:57:04 (41.9 MB/s) - ‘ratings.csv’ saved [4976229/4976229]\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "cizJHBZhVV15" }, "source": [ "## Read the dataset" ] }, { "cell_type": "code", "metadata": { "id": "vT8aZM0BT2oi" }, "source": [ "def read_data_sets(data_dir):\n", " rating_files = os.path.join(data_dir,\"ratings.csv\")\n", " rating_list = [i.strip().split(\",\") for i in open(rating_files,\"r\").readlines()] \n", " goodreads_data = np.array(rating_list[1:]).astype(int)\n", " return goodreads_data \n", "\n", "def get_id_pairs(data_dir):\n", "\tgoodreads_data = read_data_sets(data_dir)\n", "\treturn goodreads_data[:, 0:2]\n", "\n", "def get_id_ratings(data_dir):\n", " goodreads_data = read_data_sets(data_dir)\n", " le_user = preprocessing.LabelEncoder()\n", " goodreads_data[:, 0] = le_user.fit_transform(goodreads_data[:, 0])\n", " le_item = preprocessing.LabelEncoder()\n", " goodreads_data[:, 1] = le_item.fit_transform(goodreads_data[:, 1])\n", " return goodreads_data[:, 0:3]" ], "execution_count": 6, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "7n6vQz-3VR4I" }, "source": [ "goodreads_data = get_id_ratings(\"/content\")" ], "execution_count": 7, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "GCRIqd0hV2-5" }, "source": [ "## Understand the data" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nY3Bbk1xV8wL", "outputId": "61215aa9-a1a2-4f01-9de1-798c0316afe0" }, "source": [ "min_user_id = np.min(goodreads_data[:,0])\n", "max_user_id = np.max(goodreads_data[:,0])\n", "min_book_id = np.min(goodreads_data[:,1])\n", "max_book_id = np.max(goodreads_data[:,1])\n", "rating_labels= np.unique(goodreads_data[:,2])\n", "\n", "print(goodreads_data.shape)\n", "print(min_user_id, max_user_id, min_book_id, max_book_id, rating_labels)" ], "execution_count": 8, "outputs": [ { "output_type": "stream", "text": [ "(454517, 3)\n", "0 4999 0 4999 [1 2 3 4 5]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Vrs_dyQcVz8z" }, "source": [ "Each record is in format of (userid, bookid, rating_score). Both UserIDs and BookIDs range between 0 and 4999. Ratings are made on a 5-star scale (whole-star ratings only). Counts of users and books are recorded for later use." ] }, { "cell_type": "markdown", "metadata": { "id": "O-Ks_RL2WMT7" }, "source": [ "## Transformation" ] }, { "cell_type": "markdown", "metadata": { "id": "cnUhH-ksWOxh" }, "source": [ "Transform original data into RDD of sample. We use optimizer of BigDL directly to train the model, it requires data to be provided in format of RDD(Sample). A Sample is a BigDL data structure which can be constructed using 2 numpy arrays, feature and label respectively. The API interface is Sample.from_ndarray(feature, label)." ] }, { "cell_type": "code", "metadata": { "id": "gmD0lS0eVnK7" }, "source": [ "def build_sample(user_id, item_id, rating):\n", " sample = Sample.from_ndarray(np.array([user_id, item_id]), np.array([rating]))\n", " return UserItemFeature(user_id, item_id, sample)" ], "execution_count": 9, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BcwsB2SsWVBZ", "outputId": "fc09f520-5afa-4e58-dc2a-bd7c2340ffcd" }, "source": [ "pairFeatureRdds = sc.parallelize(goodreads_data).map(lambda x: build_sample(x[0], x[1], x[2]-1))\n", "pairFeatureRdds.take(3)" ], "execution_count": 19, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[,\n", " ,\n", " ]" ] }, "metadata": { "tags": [] }, "execution_count": 19 } ] }, { "cell_type": "markdown", "metadata": { "id": "wfqh_7FsWkrw" }, "source": [ "## Split" ] }, { "cell_type": "markdown", "metadata": { "id": "qw37Flz4Wm0F" }, "source": [ "Randomly split the data into train (80%) and validation (20%)" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "plRhKQ0BWdD5", "outputId": "d7d7cafb-82f8-46fd-9537-aac438ce823c" }, "source": [ "trainPairFeatureRdds, valPairFeatureRdds = pairFeatureRdds.randomSplit([0.8, 0.2], seed= 1)\n", "valPairFeatureRdds.cache()\n", "\n", "train_rdd= trainPairFeatureRdds.map(lambda pair_feature: pair_feature.sample)\n", "val_rdd= valPairFeatureRdds.map(lambda pair_feature: pair_feature.sample)\n", "val_rdd.persist()" ], "execution_count": 20, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "PythonRDD[37] at RDD at PythonRDD.scala:53" ] }, "metadata": { "tags": [] }, "execution_count": 20 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "PCWetBlaWuyb", "outputId": "e1774d82-1356-4222-830e-5f182c495ccc" }, "source": [ "train_rdd.count()" ], "execution_count": 21, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "363662" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "czo63lHuW2DB", "outputId": "caf5f0d3-427d-4ffe-df95-9d930908e300" }, "source": [ "train_rdd.take(3)" ], "execution_count": 22, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[Sample: features: [JTensor: storage: [510. 276.], shape: [2], float], labels: [JTensor: storage: [3.], shape: [1], float],\n", " Sample: features: [JTensor: storage: [2289. 2492.], shape: [2], float], labels: [JTensor: storage: [1.], shape: [1], float],\n", " Sample: features: [JTensor: storage: [3919. 1597.], shape: [2], float], labels: [JTensor: storage: [4.], shape: [1], float]]" ] }, "metadata": { "tags": [] }, "execution_count": 22 } ] }, { "cell_type": "markdown", "metadata": { "id": "KnONxSMsXARF" }, "source": [ "## Build model" ] }, { "cell_type": "markdown", "metadata": { "id": "IhpOgCvFXG2e" }, "source": [ "In Analytics Zoo, it is simple to build NCF model by calling NeuralCF API. You need specify the user count, item count and class number according to your data, then add hidden layers as needed, you can also choose to include matrix factorization in the network. The model could be fed into an Optimizer of BigDL or NNClassifier of analytics-zoo. Please refer to the document for more details. In this example, we demostrate how to use optimizer of BigDL." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4xMI7FZqW3zv", "outputId": "f3f248e2-c626-4a4a-ec98-3bd58c96436c" }, "source": [ "ncf = NeuralCF(user_count=max_user_id, \n", " item_count=max_book_id, \n", " class_num=5, \n", " hidden_layers=[20, 10], \n", " include_mf = False)" ], "execution_count": 23, "outputs": [ { "output_type": "stream", "text": [ "creating: createZooKerasInput\n", "creating: createZooKerasFlatten\n", "creating: createZooKerasSelect\n", "creating: createZooKerasFlatten\n", "creating: createZooKerasSelect\n", "creating: createZooKerasEmbedding\n", "creating: createZooKerasEmbedding\n", "creating: createZooKerasFlatten\n", "creating: createZooKerasFlatten\n", "creating: createZooKerasMerge\n", "creating: createZooKerasDense\n", "creating: createZooKerasDense\n", "creating: createZooKerasDense\n", "creating: createZooKerasModel\n", "creating: createZooNeuralCF\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "BVfHXNF2XMLp" }, "source": [ "## Compile model" ] }, { "cell_type": "markdown", "metadata": { "id": "R_Xgwv_MXUUI" }, "source": [ "Compile model given specific optimizers, loss, as well as metrics for evaluation. Optimizer tries to minimize the loss of the neural net with respect to its weights/biases, over the training set. To create an Optimizer in BigDL, you want to at least specify arguments: model(a neural network model), criterion(the loss function), traing_rdd(training dataset) and batch size. Please refer to [ProgrammingGuide](https://bigdl-project.github.io/master/#ProgrammingGuide/optimization/) and [Optimizer](https://bigdl-project.github.io/master/#APIGuide/Optimizers/Optimizer/) for more details to create efficient optimizers." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EpiU9RG_XKKM", "outputId": "d730c086-e91e-44f3-b0fc-81d66a32d509" }, "source": [ "ncf.compile(optimizer= \"adam\",\n", " loss= \"sparse_categorical_crossentropy\",\n", " metrics=['accuracy'])" ], "execution_count": 24, "outputs": [ { "output_type": "stream", "text": [ "creating: createAdam\n", "creating: createZooKerasSparseCategoricalCrossEntropy\n", "creating: createZooKerasSparseCategoricalAccuracy\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "pOvfFZP3Xk0r" }, "source": [ "## Collect logs" ] }, { "cell_type": "markdown", "metadata": { "id": "ult1tu6QXnaX" }, "source": [ "You can leverage tensorboard to see the summaries." ] }, { "cell_type": "code", "metadata": { "id": "E44IwOlzXjYW" }, "source": [ "tmp_log_dir = create_tmp_path()\n", "ncf.set_tensorboard(tmp_log_dir, \"training_ncf\")" ], "execution_count": 25, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IKipPFhsXqxS" }, "source": [ "## Train the model" ] }, { "cell_type": "code", "metadata": { "id": "4IHzRgUyXpu8" }, "source": [ "ncf.fit(train_rdd, \n", " nb_epoch= 10, \n", " batch_size= 5000,\n", " validation_data=val_rdd)" ], "execution_count": 26, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "YLj6L9JPXxri" }, "source": [ "## Prediction" ] }, { "cell_type": "markdown", "metadata": { "id": "uzDas0oIX11i" }, "source": [ "Zoo models make inferences based on the given data using model.predict(val_rdd) API. A result of RDD is returned. predict_class returns the predicted label." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gUkaK6TUXuDJ", "outputId": "16018ece-c981-4a17-ad43-014a1cae71e6" }, "source": [ "results = ncf.predict(val_rdd)\n", "results.take(5)" ], "execution_count": 27, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[array([0.00071773, 0.00534406, 0.07192371, 0.46765593, 0.45435852],\n", " dtype=float32),\n", " array([0.14319365, 0.23656234, 0.28515524, 0.24342458, 0.09166414],\n", " dtype=float32),\n", " array([0.0084668 , 0.02982639, 0.17435056, 0.46424043, 0.32311577],\n", " dtype=float32),\n", " array([5.7515636e-04, 1.4479134e-02, 3.0612889e-01, 6.0694826e-01,\n", " 7.1868621e-02], dtype=float32),\n", " array([0.00603686, 0.01832466, 0.12356475, 0.32203293, 0.5300408 ],\n", " dtype=float32)]" ] }, "metadata": { "tags": [] }, "execution_count": 27 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "aLhHUm7sZm1Y", "outputId": "b36d73bf-cf28-4197-9f5d-db752ddc7ace" }, "source": [ "results_class = ncf.predict_class(val_rdd)\n", "results_class.take(5)" ], "execution_count": 28, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[4, 3, 4, 4, 5]" ] }, "metadata": { "tags": [] }, "execution_count": 28 } ] }, { "cell_type": "markdown", "metadata": { "id": "WqOfNL7gZrG6" }, "source": [ "In Analytics Zoo, Recommender has provied 3 unique APIs to predict user-item pairs and make recommendations for users or items given candidates." ] }, { "cell_type": "markdown", "metadata": { "id": "9ffsw5z7aBlO" }, "source": [ "### Predict for user item pairs" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NXHMNrSsZnOD", "outputId": "df07c238-f264-4550-cfe8-2c09b9eb8073" }, "source": [ "userItemPairPrediction = ncf.predict_user_item_pair(valPairFeatureRdds)\n", "for result in userItemPairPrediction.take(5): print(result)" ], "execution_count": 29, "outputs": [ { "output_type": "stream", "text": [ "UserItemPrediction [user_id: 2765, item_id: 53, prediction: 4, probability: 0.4676559269428253]\n", "UserItemPrediction [user_id: 4573, item_id: 95, prediction: 3, probability: 0.2851552367210388]\n", "UserItemPrediction [user_id: 3907, item_id: 15, prediction: 4, probability: 0.4642404317855835]\n", "UserItemPrediction [user_id: 790, item_id: 156, prediction: 4, probability: 0.6069482564926147]\n", "UserItemPrediction [user_id: 3315, item_id: 1721, prediction: 5, probability: 0.5300408005714417]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "SCgDNVQaZ-mJ" }, "source": [ "### Recommend 3 items for each user given candidates in the feature RDDs" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "W2uMAeiOZ5RJ", "outputId": "e09e990f-e600-4541-ba87-77f455cea036" }, "source": [ "userRecs = ncf.recommend_for_user(valPairFeatureRdds, 3)\n", "for result in userRecs.take(5): print(result)" ], "execution_count": 30, "outputs": [ { "output_type": "stream", "text": [ "UserItemPrediction [user_id: 3586, item_id: 850, prediction: 5, probability: 0.49247753620147705]\n", "UserItemPrediction [user_id: 3586, item_id: 2354, prediction: 4, probability: 0.6351815462112427]\n", "UserItemPrediction [user_id: 3586, item_id: 2787, prediction: 4, probability: 0.6106586456298828]\n", "UserItemPrediction [user_id: 1084, item_id: 4588, prediction: 5, probability: 0.7689940333366394]\n", "UserItemPrediction [user_id: 1084, item_id: 554, prediction: 5, probability: 0.7594876289367676]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "kOHBbcDAaH8K" }, "source": [ "### Recommend 3 users for each item given candidates in the feature RDDs" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CLp29k3kaHB-", "outputId": "faf205ed-dcbe-4e27-a988-fa83f56fc0ef" }, "source": [ "itemRecs = ncf.recommend_for_item(valPairFeatureRdds, 3)\n", "for result in itemRecs.take(5): print(result)" ], "execution_count": 31, "outputs": [ { "output_type": "stream", "text": [ "UserItemPrediction [user_id: 3111, item_id: 3558, prediction: 5, probability: 0.48693835735321045]\n", "UserItemPrediction [user_id: 2024, item_id: 3558, prediction: 5, probability: 0.42628324031829834]\n", "UserItemPrediction [user_id: 4909, item_id: 3558, prediction: 4, probability: 0.562437891960144]\n", "UserItemPrediction [user_id: 3023, item_id: 1084, prediction: 5, probability: 0.8389995694160461]\n", "UserItemPrediction [user_id: 4790, item_id: 1084, prediction: 5, probability: 0.6715853810310364]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "FRJoSBJGaO43" }, "source": [ "## Evaluation" ] }, { "cell_type": "markdown", "metadata": { "id": "t8AOXDp9aSwD" }, "source": [ "Plot the train and validation loss curves" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 407 }, "id": "MbS3TGZbaKva", "outputId": "1f7a9581-9feb-4022-95a3-bf013ab06fb7" }, "source": [ "#retrieve train and validation summary object and read the loss data into ndarray's. \n", "train_loss = np.array(ncf.get_train_summary(\"Loss\"))\n", "val_loss = np.array(ncf.get_validation_summary(\"Loss\"))\n", "#plot the train and validation curves\n", "# each event data is a tuple in form of (iteration_count, value, timestamp)\n", "plt.figure(figsize = (12,6))\n", "plt.plot(train_loss[:,0],train_loss[:,1],label='train loss')\n", "plt.plot(val_loss[:,0],val_loss[:,1],label='val loss',color='green')\n", "plt.scatter(val_loss[:,0],val_loss[:,1],color='green')\n", "plt.legend();\n", "plt.xlim(0,train_loss.shape[0]+10)\n", "plt.grid(True)\n", "plt.title(\"loss\")" ], "execution_count": 32, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0.5, 1.0, 'loss')" ] }, "metadata": { "tags": [] }, "execution_count": 32 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "-Yh804RoaW8M" }, "source": [ "Plot accuracy" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 390 }, "id": "F0JtfjEMaVLc", "outputId": "2c22ed0b-8858-4180-bbe8-3f2d230210fd" }, "source": [ "plt.figure(figsize = (12,6))\n", "top1 = np.array(ncf.get_validation_summary(\"Top1Accuracy\"))\n", "plt.plot(top1[:,0],top1[:,1],label='top1')\n", "plt.title(\"top1 accuracy\")\n", "plt.grid(True)\n", "plt.legend();" ], "execution_count": 33, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] } ] }