{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "4XPbwFcpGJYE" }, "source": [ "### Author: [Pratik Sharma](https://github.com/sharmapratik88/)\n", "## Project 6 - Recommendation System\n", "Amazon Reviews data [source](http://jmcauley.ucsd.edu/data/amazon/). The repository has several datasets. For this case study, we are using the Electronics dataset.\n", "\n", "**Domain**: E-Commerce\n", "\n", "**Context**: Online E-commerce websites like Amazon, Flipkart uses different recommendation models to provide different suggestions to different users. Amazon currently uses item-to-item collaborative filtering, which scales to massive data sets and produces high-quality recommendations in real-time.\n", "\n", "**Attribute Information**\n", "* `UserID`: Every user identified with a unique id.\n", "* `ProductID`: Every product identified with a unique id.\n", "* `Rating`: Rating of the corresponding product by the corresponding user.\n", "* `timestamp`: Time of the rating.\n", "\n", "**Learning Outcomes**\n", "* Exploratory Data Analysis\n", "* Creating a recommendation system using real data\n", "* Collaborative filtering\n", "\n", "**Objective**: Build a recommendation system to recommend products to customers based on their previous ratings for other products." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "pXYo05rt4E70", "outputId": "9525979f-ae6f-49c0-e5fb-9d554d434ebd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ] } ], "source": [ "# Mounting Google Drive\n", "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "sDxguQP3SE4X" }, "outputs": [], "source": [ "# Setting the current working directory\n", "import os; os.chdir('drive/My Drive/Great Learning/Recommendation System')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "48evkLeFSTGM", "outputId": "4e048c0b-a08e-4b4d-9abf-2a3c2bebc495" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'06_Recommendation System_Pratik.ipynb' ratings_Electronics.csv\n" ] } ], "source": [ "!ls '/content/drive/My Drive/Great Learning/Recommendation System'" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "5DodlFy5ZNrS" }, "source": [ "\n", "### Import Packages" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 102 }, "colab_type": "code", "id": "Nj9kT7iGM_u7", "outputId": "8024f0a0-7c6b-4b59-c62e-22c61e9ff213" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: scikit-surprise in /usr/local/lib/python3.6/dist-packages (1.1.0)\n", "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-surprise) (0.14.1)\n", "Requirement already satisfied: numpy>=1.11.2 in /usr/local/lib/python3.6/dist-packages (from scikit-surprise) (1.17.4)\n", "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from scikit-surprise) (1.12.0)\n", "Requirement already satisfied: scipy>=1.0.0 in /usr/local/lib/python3.6/dist-packages (from scikit-surprise) (1.3.3)\n" ] } ], "source": [ "!pip install scikit-surprise" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "6ZUyR9hfYT9h" }, "outputs": [], "source": [ "# Imports\n", "import pandas as pd, numpy as np, matplotlib.pyplot as plt, seaborn as sns\n", "import matplotlib.style as style; style.use('fivethirtyeight')\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import mean_squared_error\n", "from scipy.sparse.linalg import svds\n", "import gc\n", "%matplotlib inline\n", "\n", "# Surprise package for making recommendation\n", "from surprise import KNNBaseline, KNNBasic, KNNWithMeans, KNNWithZScore\n", "from surprise.model_selection import GridSearchCV, cross_validate, KFold\n", "from surprise import accuracy, Reader, Dataset, dump\n", "\n", "# For Sklearn NearestNeighbor based recommendation\n", "from sklearn.metrics import pairwise_distances, mean_squared_error\n", "from scipy.spatial.distance import correlation, cosine\n", "from sklearn.neighbors import NearestNeighbors\n", "from scipy.sparse import csr_matrix\n", "import sklearn.metrics as metrics\n", "from math import sqrt\n", "\n", "# Display settings\n", "pd.options.display.max_rows = 999\n", "pd.options.display.max_columns = 20\n", "pd.options.display.float_format = \"{:.2f}\".format\n", "\n", "random_state = 2019\n", "np.random.seed(random_state)\n", "\n", "# Suppress warnings\n", "import warnings; warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "uzFf4oySoHRe" }, "source": [ "\n", "### Read and explore the dataset" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "voRsmc-5SnfD", "outputId": "ada90d44-122f-43a2-9090-2ccfc3e5bb6a" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UserIDProductIDRatingTimestamp
0AKM1MP6P0OYPR01327930405.001365811200
1A2CX7LUOHB2NDG03217329445.001341100800
2A2NWSAGRHCP8N504398863411.001367193600
3A2WNBOD3WNDNKT04398863413.001374451200
4A1GI0U4ZRJA8WN04398863411.001334707200
\n", "
" ], "text/plain": [ " UserID ProductID Rating Timestamp\n", "0 AKM1MP6P0OYPR 0132793040 5.00 1365811200\n", "1 A2CX7LUOHB2NDG 0321732944 5.00 1341100800\n", "2 A2NWSAGRHCP8N5 0439886341 1.00 1367193600\n", "3 A2WNBOD3WNDNKT 0439886341 3.00 1374451200\n", "4 A1GI0U4ZRJA8WN 0439886341 1.00 1334707200" ] }, "execution_count": 6, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Reading the data as dataframe and print the first five rows\n", "ratings = pd.read_csv('ratings_Electronics.csv', header = None)\n", "ratings.columns = ['UserID', 'ProductID', 'Rating', 'Timestamp']\n", "ratings.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "_tPCBNEBZdfQ", "outputId": "48e17694-6e3e-4ab3-e59b-64cd08dc76f2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Get info of the dataframe columns\n", "--------------------------------------------------------------------------------\n", "\n", "RangeIndex: 7824482 entries, 0 to 7824481\n", "Data columns (total 4 columns):\n", "UserID object\n", "ProductID object\n", "Rating float64\n", "Timestamp int64\n", "dtypes: float64(1), int64(1), object(2)\n", "memory usage: 238.8+ MB\n" ] } ], "source": [ "# Get info of the dataframe columns\n", "print('Get info of the dataframe columns'); print('--'*40)\n", "ratings.info()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "pcqGvviWZhe4", "outputId": "4b8b23f5-86bb-4f9f-feaa-47bd910fc529" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are no null values in the dataset\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "UserID 0\n", "ProductID 0\n", "Rating 0\n", "Timestamp 0\n", "dtype: int64" ] }, "execution_count": 8, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Check if there any null values in the dataframe\n", "print('There are no null values in the dataset'); print('--'*40)\n", "ratings.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 83 }, "colab_type": "code", "id": "GSsZKHcTfeA_", "outputId": "46b84b1d-a53c-4537-c538-62625628f2b1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset has no duplicate rows\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UserIDProductIDRatingTimestamp
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [UserID, ProductID, Rating, Timestamp]\n", "Index: []" ] }, "execution_count": 9, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Check if there are any duplicate rows\n", "print('Dataset has no duplicate rows'); print('--'*40)\n", "ratings[ratings.duplicated(keep = 'first')]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 68 }, "colab_type": "code", "id": "aAxtbn8IiUem", "outputId": "7d19312a-4ad3-42ab-b1c3-240fb4131605" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking the uniques in Rating column\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "[1.0, 2.0, 3.0, 4.0, 5.0]" ] }, "execution_count": 10, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Checking the uniques in `Rating` column\n", "print('Checking the uniques in Rating column'); print('--'*40)\n", "sorted(list(ratings['Rating'].unique()))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "p8WniapfZkUL" }, "source": [ "\n", "#### Observation 1 - Dataset shape\n", "Dataset has more than 7.8 million reviews and with information regarding user id, product id, rating and timestamp. There are no missing values and duplicates in the dataset. Ratings are on the scale of 1-5." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "SdfxwPMtZmwE" }, "source": [ "\n", "#### Observation 2 - Information on the type of variable\n", "\n", "* `userID`: Every user identified with a unique id (Categorical, Nominal).\n", "* `productID`: Every product identified with a unique id (Categorical, Nominal).\n", "* `Rating`: Rating of the corresponding product by the corresponding user (Numerical, Discrete).\n", "* `Timestamp`: Time of the rating (Timestamp)." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 424 }, "colab_type": "code", "id": "gLQv5edgZk__", "outputId": "d53d13fe-b036-4cec-b2d7-a772708bb2de" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Five point summary of the dataframe\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UserIDProductIDRatingTimestamp
count782448278244827824482.007824482.00
unique4201696476002nannan
topA5JLAU2ARJ0BOB0074BW614nannan
freq52018244nannan
meanNaNNaN4.011338178197.27
stdNaNNaN1.3869004257.79
minNaNNaN1.00912729600.00
25%NaNNaN3.001315353600.00
50%NaNNaN5.001361059200.00
75%NaNNaN5.001386115200.00
maxNaNNaN5.001406073600.00
\n", "
" ], "text/plain": [ " UserID ProductID Rating Timestamp\n", "count 7824482 7824482 7824482.00 7824482.00\n", "unique 4201696 476002 nan nan\n", "top A5JLAU2ARJ0BO B0074BW614 nan nan\n", "freq 520 18244 nan nan\n", "mean NaN NaN 4.01 1338178197.27\n", "std NaN NaN 1.38 69004257.79\n", "min NaN NaN 1.00 912729600.00\n", "25% NaN NaN 3.00 1315353600.00\n", "50% NaN NaN 5.00 1361059200.00\n", "75% NaN NaN 5.00 1386115200.00\n", "max NaN NaN 5.00 1406073600.00" ] }, "execution_count": 11, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "### Five point summary of numerical attributes and check unique values in 'object' columns\n", "print('Five point summary of the dataframe'); print('--'*40)\n", "\n", "ratings.describe(include = 'all')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "RFOo-DBCl8Pj", "outputId": "14889b28-e9eb-431e-9a0c-44fde9688fa5" }, "outputs": [ { "data": { "text/plain": [ "['0132793040', '0321732944', '0439886341', '0511189877', '0528881469']" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "data": { "text/plain": [ "['BT008G3W52', 'BT008SXQ4C', 'BT008T2BGK', 'BT008UKTMW', 'BT008V9J9U']" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "display(sorted(list(ratings['ProductID'].unique()))[0:5], sorted(list(ratings['ProductID'].unique()))[-5:])" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "SpzaEe21ZqkO" }, "source": [ "\n", "#### Observation 3 - Descriptive statistics\n", "* **`UserID`**: Categorical column with alphanumeric user id. Number of users in the dataset: 4201696.\n", "* **`ProductID`**: Categorical column with some of the product ids being numerical entries and some being alphanumerics. Numbers of rated products: 476002.\n", "* **`Rating`**: Users have rated the products on the scale of 1 to 5.\n", "* **`Timestamp`**: Can be useful if we convert the numerical timestamp to datetime." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 470 }, "colab_type": "code", "id": "6v0gwbqVoYIP", "outputId": "5f9f55be-60fe-468b-8ae6-8768a538d3eb" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (15, 7.2))\n", "ax = fig.add_subplot(121)\n", "g = sns.distplot(ratings['Rating'], ax = ax).set_title('Distribution of Ratings')\n", "ax = fig.add_subplot(122)\n", "g = sns.countplot(ratings['Rating']).set_title('Count of Ratings')" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "cGmZ9f_3t04G" }, "outputs": [], "source": [ "ratings['Timestamp'] = pd.to_datetime(ratings['Timestamp'], unit = 's')\n", "ratings['Year'] = ratings['Timestamp'].dt.year" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 504 }, "colab_type": "code", "id": "uZCp157kF8NX", "outputId": "34282dfb-e259-4057-e298-f72efda00709" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trend of ratings over the years\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/oAAAHFCAYAAABCVYLwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeXxdVb338e8vc9I2TdJCaROgtARp\nQWSQgkChdGDwqui9jCpUQYYreJ3uveDzeB+8oo/T43VEBKRSQGVSBBXEJC0zZR7bUlJKoUnnJB0y\nD2c9f5yd5uydkzk55+yTz/v1Oq+e/dvTylknr1d/WWuvnznnBAAAAAAA0kNGshsAAAAAAABGD4k+\nAAAAAABphEQfAAAAAIA0QqIPAAAAAEAaIdEHAAAAACCNkOgDAAAAAJBGSPQBABgBM1tlZr8chet8\nxszeNbMuM/v1aLRtGG24yswak3HvsDKzu83sr8luBwAAsUj0AQApz8zcAK+NyW7jSJhZnqTfSFou\n6UBJ/9nHcXfH/MydZrbJzH5rZgcM8X6Hetc4MbBruaRZw/kZ0p2ZLfY+syF91sO81zQz225m/x1n\n33+YWYOZHTjW7QAAhBeJPgAgDKbHvP7Fix0bEzs+3klmlpOQ1o1cmaQ8SX9zzm12zu3p59hKRX/m\ngyVdIukjkn4/Go1wzrU457aPxrXCKhW+M865bZIuk/S/Yv8YY2ZHSfqOpKucc5vG6v6p8BkAAEaG\nRB8AkPKcc1u7X5LqvfCOmPgOSTKzrWZ2vZndYmb1kiq8eKGZ3WhmW8ysycxeNLOPd1/fzA73Rmv/\n2cweMbNmM1tvZp+ObYeZzTKzSjNrNbP3zOzKwbTfzE4xs6e88+rN7A4zm+Ltu0pStXfo832MtMdq\n837mWufcSkm3STrNmxXQfb+lZvaCme0xsx1m9pCZzfb25cXc71nvfm91tyV26n73tpktMLPXvM/l\neTM7JvDznW1ma7yf7xUzW+hd91xvv3n9stHM2rzR6kfMLKufz6zIzG4zs53edZ8zs9Nj9r9kZj8P\nnGNmtsHMvhkTu9jMXveu8a6Z/dDM8mP2rzKzm8zs+2a2VdLbcdpyuLzvkqQt3s/298AxV5vZ+2a2\n28z+ZGZTA/s/6t2rxcxqzOxWMyvu6+d3zv1F0Vked5rZBDPLlXSXpHucc/fEXPckM1vhfa+3WXTW\nx4yY/R8wswe9340mM3vVzM4LtO1FM/uFmf3IzLZJWuPFL/A+uxaLziJ41szm9NVmAEDqINEHAKSb\nr0vaKOkESVeaWYakRyR9QNHZAEdJ+q2kP5nZKYFzfyDpVu+YP0u63cxmSpJ3nYckFUiaL+lTki6S\nNLe/xlh0ivWjktZLOs4773hJd3uHLPeuJ0lnKTpa/9JgflAzK/Ou1ympK2ZXjqTrJR3jXTNb0kNm\nluWca1V0FoAk/ZN3v+DnECtX0rck/avX/r2S7vY+D3mfz58lPebd71pJPwlc4yJJX5H0RUnlks5U\nT+LclzslLZB0oaKzN16W9IiZdT9asFzShYE/FsyXNNM7t/uPKD+R9H1F++lSSR+T5PsDgaTPKtqv\np3v7g6olne+9P0rRz+yimP2nSJon6WxFP9PjJX2ve6eZnS3pPq/NH1T0ezhH0j3q39cV7defSPqu\npEmSrom57nGKzvD4h6Kf0ZmSJkj6e8znMknSw5KWSPqQpN8p2n/zAvf6nKQsSadJ+qSZHeIde4vX\n1pMl3SQpMkCbAQCpwDnHixcvXrx4healaPLnJJXF2bdV0envsbGzJDVJmhCI/17S3d77w71rfjFm\nf46kNklLve2PKZp0zYw5Zoakdkm/7Ke9P5K0QVJWTOwE737zAvf/8AA/+92KJvWNklq8c5yk7wxw\n3nTvuOO87UO97RMDx10lqTGw7STNjYmd5sUO9rZ/rOgoeEbMMZ/0jjnX2/6GpDdjP4MB2nuEd/7C\nmJhJWi3pV972ft5n//GYY34jaWXM8VskfS5w7TMUTVYLvO1VXttsgDYt9tp0QJw+qZWUHRO7XtK7\nMdurJH0rcN5h3vUOH+C+x3k/Z4ekkwP77pf0m0BskvcdWdzPNask/SRm+0VJrwaOme9936cN5/eU\nFy9evHgl98WIPgAg3Twf2D5eUr6kbd409EZvevq5io4ux3q1+41zrl3STknTvNBcSZudcxtjjtms\naBLfnyMkPeOc6wy0sdXbN1RPSDpa0RHkH3jb3449wMyO86ZrbzSzveqZqn/wMO7XJmltzPZm79/Y\nz+U551zsSO+zgWv8QdJkSRvNbJmZfdrMJvRzzyMUTcaf6g4455ykJ719ctHHNR6RdLG075GEcyXd\n4Z1SJukASb8K9PsDiv4RYHbM/V7wrj9cq51zHTHbm+V9PmZmiibr1wXa8bJ3bPA76OOce0nSXyRV\nOeeeDuw+XtLFgetukZTZfV2LPrbyY+/RigbvmFPV+7vwQmB7laKf/9tmdr+ZXWNm0wf8JAAAKaHP\nZ+MAAAippsB2hqTtij89vS2w3R7Ydkq9x9yanXPrvffXmdkfFR1V/5IkmdlkRafFV0haKmmborMT\nXvP+HarOQBLc/T4jTiwu59xGMyuXtNB7fVvS983sBOfclmG0qdsdku4ysyL1PKJwf6B9V0l6Js65\nsYvZBb8zQ9Xf98a899dLujfOuYP5+TsUHaUPypB0s3o/iiBJO7x/f6Ho6Px/KPoHn2ZFp+AHvwu+\nz8A512FmCySdqOhshs9I+oGZfdw5t2IQbQYAJBGJPgAg3b0oaX9Fp2ZXD3RwP9ZImmFmBzvn3pMk\nb4RzoHJ0qyX9i/d8fHeyNk/RVfbfHEF7ul0v6VUzu8U594akIyUVS7rOOfeu186FgXO6E9PMUbj/\nGkkfMzOL+YNAr8UEXXRtgIclPWxm/yWpTtHHIW6Nc83Viiaxp0haIe0bGZ+v6FoA3f6iaOJ6nqJr\nFTzgnNvr7duk6B94DnPO3aGRG9Zn5pyLmNnLij7+sH7AE4bmRUkfHOC6p0pa5pz7oySZWbaio/0D\nfve8/nzWe91gZk8p+scjEn0ASHGpNkoBAMBoe0TRKcgPmdknzOwQM/uwmX3FzD43xOusk/Q77/xj\nFV2sLDgrIOhnik7j/o2ZHWFmpym6GGClcy44XXrInHNvKjp6/x0v9K6iI8D/ZtEqAWcouk5ArK2K\nPjpwpkVrtheNoAm/UHQBvF9YtHrBEknd9d+jD8ubXWlml5nZUWbWXRYwT/5HAmJ/ptWKJvG3WLR+\n/RxJv1J0uv2PY45rV3RBu39T9Nn75TH7IpK+Kenfzexa77M/3KKVFW4cxs+50fv3n8xsfzMrHMK5\n31R04cAfmNmHzOxQi67Cv9zMRvLHlhsknWhmv/Ee15jlfV6/iplmv07RPzQda2ZHSrpd0T8E9cvM\nFpnZdWZ2vJkdZGZnKbqWxJoRtBcAkCAk+gCAtOYlfGdL+puiSek6SX9VNDEc6Pn62Ot0SfqEoon9\nU5IeVHQl9dUDnFej6Gro5Yqupv+AoiOxFw7xR+nPjyR9wsxO9NYNWOq1dY2k/yvpq4E2tSs61X+p\nogvJrRrujb01Cz6p6JT81yT9UNHEVor+MUGSdkm6XNH1BNYquvr+55xzT6lvl0h6XNHF7l5VdFX5\ns51zwT5brugshq2KLjIX27ZbFV1R/58V/cyf99pWM8QfU8659yX9l6IVCLYq/jT8vs59VNHv2zxJ\nT3s/z48UndUw7FXsnXMvKzrrYbqio+yrFf2DiCm6YKMkXa1oScqnFK3+8Kaif7QaSIOiVQj+quiU\n/5sk/VrS/xtuewEAiWMjW3sGAADAz5tF8Kii0+ZH8rgEAAAYBhJ9AAAwImZ2jaIj5lsVHV3/maRN\nzrkFyWwXAADjFYvxAQCAkZol6VpFFz3cIunvkq5LaosAABjHGNEHAAAAACCNsBgfAAAAAABphKn7\n/di9ezfTHQAAAAAAKWvy5MkWjDGiDwAAAABAGiHRBwAAAAAgjZDop4nqasoUhwV9FR70VXjQV+FB\nX4UD/RQe9FV40FfhkQ59RaIPAAAAAEAaIdEHAAAAACCNkOgDAAAAAJBGSPQBAAAAAEgjJPoAAAAA\nAKQREn0AAAAAANIIiT4AAAAAAGmERB8AAAAAgDRCog8AAAAAQBoh0QcAAAAAII2Q6AMAAAAAkEZI\n9AEAAAAASCMk+gAAAACAIdnW3KXX6trVFXHJbgriyEp2AwAAAAAA4fGPTa26qKpOXU762EF5umNh\niTLMkt0sxGBEHwAAAAAwaP/90m51eQP5f32/VRU1bcltEHoh0QcAAAAADMrmpi6tbuj0xW5e05ik\n1qAvJPoAAAAAgEGpqm3tFVuxuU3rdnUkoTXoC4k+AAAAAGBQKuMk+pJ069qmBLcE/SHRBwAAAAAM\nqDPitHJz/Ofx/7C+WbvaIgluEfpCog8AAAAAGNCLO9q1pz1+Ob2mTqffrW9OcIvQFxJ9AAAAAMCA\nKgOr6+dl+vffurZRXZH4fwhAYpHoAwAAAAAGFHw+/5vHFionJqPcuLdL/6iJ/ww/EotEHwAAAADQ\nrx0tXXq1zr+y/gWzC/Qvswp8sZtZlC8lkOgDAAAAAPpVVeuftn/M1Gztl5+pK+dM8MUf29ymtyi1\nl3Qk+gAAAACAflUFpu0vKs2TJB09NUcn7p/j20epveQj0QcAAAAA9Kkr4nqN6C8uzd33/sq5/lF9\nSu0lH4k+AAAAAKBPr9V1qD4mcZ+cY/rwfj2j+B87OF8zCnpSy+ZOp7uqGdVPJhJ9AAAAAECfKgLT\n9k+fkaesDNu3nZ1huvTwib5jbl3bRKm9JEpIom9mB5rZSjNbY2arzezLXvxbZlZrZq96r4/GnPMN\nM1tvZuvM7MyY+FlebL2ZXRcTP8TMnvPi95hZjhfP9bbXe/tnDnQPAAAAAEBUVY1/2v6imGn73T73\ngQLlZvZsv9fYpUcptZc0iRrR75T0defcXEknSrrazOZ6+37inDvaez0sSd6+CyUdIeksSb8ys0wz\ny5R0o6SzJc2VdFHMdX7gXetQSQ2SLvPil0lq8OI/8Y7r8x5j9xEAAAAAQLg0tEX04s52X2xxWV6v\n46bmZepfDgmU2lvD9P1kSUii75zb4px72Xu/V9JaSaX9nHKOpLudc23OuXclrZc0z3utd85tcM61\nS7pb0jlmZpIWSrrfO3+5pE/GXGu59/5+SYu84/u6BwAAAABA0sraVsXOwD+iOEvTC+KPj14RKLX3\n+JY2rW2g1F4yJPwZfW/q/DGSnvNC15jZ62a2zMyKvVippE0xp9V4sb7iUyTtcs51BuK+a3n7d3vH\n93UtAAAAAICkyl6r7fceze929NQcfWSav9TeLWsbx6Rd6F9WIm9mZhMl/VHSV5xze8zsJkk3SHLe\nvz+WdGki2zRY1dXVyW7CgMLQRkTRV+FBX4UHfRUe9FU40E/hQV+FR9j6yjnp0ffyJfUsvDdHO1Vd\nvb3Pcz5RnKlnt/U8w//76iZ9tninChOaeY5cqvdVeXl5v/sT9nGbWbaiSf7vnHN/kiTn3LaY/bdK\n+qu3WSvpwJjTy7yY+ojXSSoysyxv1D72+O5r1ZhZlqTJ3vH93aOXgT7IZKuurk75NiKKvgoP+io8\n6KvwoK/CgX4KD/oqPMLYV6/XtauuY8e+7YlZpn8+dpZyMq3Pc2bOdvrl+9tU29wlSWqLmJ7pPEBf\nmjNpzNs7WsLYV0GJWnXfJN0maa1z7n9i4tNjDvuUpDe99w9JutBbMf8QSeWSnpf0gqRyb4X9HEUX\n03vIOeckrZR0rnf+UkkPxlxrqff+XEkrvOP7ugcAAAAAjHtVgWn7p87I7TfJl6Kl9i4LPKt/61uU\n2ku0RD2jf7KkiyUtDJTS+6GZvWFmr0s6XdJXJck5t1rSvZLWSPq7pKudc13eaP01kh5VdEG/e71j\nJelaSV8zs/WKPoN/mxe/TdIUL/41Sdf1d48x/RQAAAAAICQqa/3l8Zb083x+rKWH+Uvtvd/Ypb9v\notReIiVk6r5z7inFPtjR4+F+zvmupO/GiT8c7zzn3AbFWTXfOdcq6byh3AMAAAAAxrM97RE9t81f\nVm9haW4fR/tNycvUebMKdFd1877YzWub9E8H549qG9G3hK+6DwAAAABIbY9vaVNnzGz7wyZn6eBJ\ngx8nDpbae2JLm9ZQai9hSPQBAAAAAD5VNf6p9ovLBjea3+2oKXFK7a2h1F6ikOgDAAAAAPZxzqky\nsBDf4kE+nx/rqrkTfdv3vNOihrbIiNqGwSHRBwAAAADss253p2qaetYpz880nTRtaCP6kvRPB+Wp\ntKBnVb6WLqc7324alTaifyT6AAAAAIB9KgPT9k85IEd5Wf2X1YsnK8P0hcCz+resbVInpfbGHIk+\nAAAAAGCfXtP2y4Y+bb/bJYcVKC+m1F5NU5ceodTemCPRBwAAAABIkpo6Inpm68ifz+/WXWov1s0s\nyjfmSPQBAAAAAJKkp7a2qz1mvbyZkzI1qzCz7xMG4YrAonxPbW3X6npK7Y0lEn0AAAAAgKTez+cv\nKc2T2dCfz4/1wZJsnXxAoNTeWkb1xxKJPgAAAABAklRZ60/0F5UNfbX9eK6c4x/Vv/edFtW3dvVx\nNEaKRB8AAAAAoA17OvXu3p7kOydDmn/A6CT6Hz0oT2UTAqX2qptH5drojUQfAAAAAKCKwLT9kw7I\n1YTs0UkZszJMXzjcX2rvVkrtjRkSfQAAAACAqoLT9ktHZzS/W7xSew+/T6m9sUCiDwAAAADjXGun\n05Nb2n2xkZTVi6ckL1Pnzw6U2mNRvjFBog8AAAAA49wz29rU0tUzjb5sQqYOL8oa9ftcEViU7+mt\n7XqDUnujjkQfAAAAAMa5Xqvtl+aOuKxePEeWZOuUYKm9NYzqjzYSfQAAAAAY56pq2nzbi0Z52n6s\nK+f6R/Xv29BMqb1RRqIPAAAAAOPY+42dWre7c992lkmnzRjdhfhinX1gng6c2LMqX2uXdMfblNob\nTST6AAAAADCOBUfz5+2fo8k5Y5cqZmWYLg+U2vvNW5TaG00k+gAAAAAwjgWfz19cNnbT9rtdfNgE\n5Wf2rAFQ09Slv1Fqb9SQ6AMAAADAONXe5fT4Zv+I/uLSsZu23604N0MXzM73xW5mUb5RQ6IPAAAA\nAOPUc9vb1djZM2V+Wn6GPliSnZB7Xx4otffMtna9XteekHunOxJ9AAAAABinqgLT9heW5o1JWb14\njijJ1vxgqb21TQm5d7oj0QcAAACAcaqixp/oL0nAtP1Y8Urt1VFqb8RI9AEAAABgHNrS3KXVDT1l\n9TJMWjCGZfXiCZbaa+uSllNqb8RI9AEAAABgHApO2z9uarZK8jL7OHpsZGaYrgiU2rttbZM6KLU3\nIiT6AAAAADAOVdYEVttPQFm9eC4+bIIKsnrWBaht7tLf3qPU3kiQ6AMAAADAONMZcVq52Z9MLy5N\nTqJfFK/U3lpK7Y0EiT4AAAAAjDMv7WjX7vae6fEluRk6ekpiyurFc0Wg1N6z29r1GqX2ho1EHwAA\nAADGmYpa/7T9RaW5ysxITFm9eOYUZ+u06f6FACm1N3wk+gAAAAAwzgQX4luUpGn7sa6c61+U7/4N\nzdpJqb1hIdEHAAAAgHFkR0uXXtnZ4YstLE1sWb14zizL08HBUnvrKLU3HCT6AAAAADCOrNjsn7Z/\n9JRs7Z+f2LJ68WRmmL4wJ1Bq761GSu0NA4k+AAAAAIwjVTWpsdp+PBeX+0vtbW6O6K/vtSSxReFE\nog8AAAAA40TEOVUFF+IrS/60/W5FuRm6cHaBL3bzGhblGyoSfQAAAAAYJ17d2aG6tsi+7cIc0/H7\n5SSxRb1dEViUb9X2dr26k1J7Q0GiDwAAAADjRGVgtf3TZ+QqK4ll9eI5vChbC2b4ZxncTKm9ISHR\nBwAAAIBxote0/RR6Pj/WlYFF+f64oVk7Wii1N1gk+gAAAAAwDjS0RfTCDv8U+FRaiC/WGWV5mjmp\npxJAe0Ra/jal9gaLRB8AAAAAxoHHNrcqtlLd3OIszZiQ/LJ68WRmmC6fM9EXo9Te4JHoAwAAAMA4\nUBmYtp+qo/ndPnNogSbElNrb0hzRXzZSam8wSPQBAAAAIM0551RV41+Ib3FZaif6RbkZuujQQKk9\nFuUbFBJ9AAAAAEhzbzZ0amtLT1m9CVmmE/dPrbJ68VweWJTvue3teoVSewMi0QcAAACANBcczT91\neq5yMlOrrF48HyjK1unBUntrGpPUmvAg0QcAAACANFdR60/0l6T4tP1YV871j+r/6d0WbafUXr9I\n9AEAAAAgje1pj+i5bf7p7gtLc/s4OvWcUZanQwKl9m5fx7P6/SHRBwAAAIA09sSWNnXGVKUrn5yl\nmZOyktegIcqw3qX2lr3VpPYuSu31hUQfAAAAANJYZXC1/RCN5nf7TLm/1N7Wlogeeo9Se30h0QcA\nAACANOWcU2Vtmy+W6mX14pmck6FPB0rt3bKG6ft9IdEHAAAAgDT19u5O1TT1LFyXlymdNC18I/pS\n71J7z+9o18s7KLUXD4k+AAAAAKSpisC0/fkH5Co/K/XL6sVzWFG2FgUeO7h5LaX24iHRBwAAAIA0\nVRWYtr8ohNP2Y10ZWJTvT++2aFszpfaCSPQBAAAAIA01dUT09NbA8/khXIgv1uKyXM2KKbXXEZFu\nf5tn9YNI9AEAAAAgDT21tV3tkZ7tmZMyNbswPGX14qHU3uCQ6AMAAABAGqqsDZbVy5NZOJ/Pj/Xp\n8gJNjFlnYFtLRA9upNReLBJ9AAAAAEhDVYGF+IIL2YXV5JwMXVTuL7XHonx+JPoAAAAAkGY27OnU\nhr09i9TlZEjzp6dHoi9JVwRK7b24o0MvUmpvHxJ9AAAAAEgzlYHR/I9My9XE7PRJ/8onZ/daWPCW\nNYzqd0ufngYAAAAASJKqej2fnz6j+d2unOtflO+BjZTa65aQRN/MDjSzlWa2xsxWm9mXvXiJmVWY\nWbX3b7EXNzP7uZmtN7PXzezYmGst9Y6vNrOlMfHjzOwN75yfm7fKxHDuAQAAAABh1drp9MQW/zT2\nRWV5SWrN2FlUmqvZhf5Se79dR6k9KXEj+p2Svu6cmyvpRElXm9lcSddJqnLOlUuq8rYl6WxJ5d7r\nCkk3SdGkXdL1kk6QNE/S9d2Ju3fM5THnneXFh3QPAAAAAAizZ7e1qSWm3FxpQabmFIW7rF48GWa6\nIlhqbx2l9qQEJfrOuS3OuZe993slrZVUKukcScu9w5ZL+qT3/hxJd7ioVZKKzGy6pDMlVTjn6p1z\nDZIqJJ3l7St0zq1yzjlJdwSuNZR7AAAAAEBoVda2+bYXleWmRVm9eC46tECTsnt+tu0tEf2ZUnuJ\nf0bfzGZKOkbSc5KmOee2eLu2SprmvS+VtCnmtBov1l+8Jk5cw7gHAAAAAIRWcCG+RaXpN22/W2FO\nhj59aKDUHovyKaHzN8xsoqQ/SvqKc25P7F+VnHPOzMZ0jsVI7lFdXT3azRl1YWgjouir8KCvwoO+\nCg/6Khzop/Cgr8IjEX21pdW0bnf+vu1MOR3UUqN0/posKTDdrJ6f+aWdHXrg5Xd05KTIsK+Z6r9X\n5eXl/e5PWKJvZtmKJvm/c879yQtvM7Ppzrkt3rT57V68VtKBMaeXebFaSQsC8ce8eFmc44dzj7gG\n+iCTrbq6OuXbiCj6Kjzoq/Cgr8KDvgoH+ik86KvwSFRfPb2uSdKufdvzpuXqmDllfZ+QBsolLdm6\nUxUxjyw8vLdYnzq2ZFjXS4ffq0Stum+SbpO01jn3PzG7HpLUvXL+UkkPxsQv8VbGP1HSbm/6/aOS\nzjCzYm8RvjMkPert22NmJ3r3uiRwraHcAwAAAABCqaImWFYvfaftx+pVau/dFm0Zx6X2EvWM/smS\nLpa00Mxe9V4flfR9SUvMrFrSYm9bkh6WtEHSekm3SvqiJDnn6iXdIOkF7/VtLybvmN9457wj6REv\nPqR7AAAAAEAYtXc5PbHFvxDf4rLcJLUmsRaW5urQwp4J651ufJfaS8jUfefcU5L6WuZxUZzjnaSr\n+7jWMknL4sRflHRknHjdUO8BAAAAAGHz/I527e3oWZJs//wMfbAkO4ktSpxoqb0J+s/ndu+L/fat\nJn39qEnKzUzPigP9Sfiq+wAAAACA0RdcbX/hjFxlpGlZvXguKveX2tvRGtED747PUnsk+gAAAACQ\nBipr/dP2l5SNj+fzu03KztBnygOl9tY2KjqZe3wh0QcAAACAkNvS3KU36zv2bZuk02eMj+fzY10x\nZ6LvmfFXdnboxR0dfR6frkj0AQAAACDkqmr90/aP2y9bJXmZSWpN8swqzNIZgQUIb17bmKTWJA+J\nPgAAAACEXFVNYLX9cVJWL55gqb0/j8NSeyT6AAAAABBinRGnlZv9I/qLx9nz+bEWzMhV+WR/qb1l\nb42vUnsk+gAAAAAQYi/taNeu9p4F50pyM3TMlPFRVi+e7lJ7sX67rkltXeNnUT4SfQAAAAAIseBq\n+wtLc5WZMX7K6sVz4aEFKowptbezNaI/jaNSeyT6AAAAABBiwYX4Fo3j5/O7xS21t2b8lNoj0QcA\nAACAkNrZ2qVXdvrLxy0qHX9l9eK5PFBq79W6Dj2/vT1p7UkkEn0AAAAACKkVtW2KHaP+0JRs7Z8/\n/srqxTOrMEtnHOif3XDz2vGxKB+JPgAAAACEVGVg2v5iRvN9rgosyvfQxhZtbkr/Unsk+gAAAAAQ\nQhHntCKwEB/P5/stmJGrDwRL7a1L/1F9En0AAAAACKHX6jq0szWyb7swxzRv/5wktij1mJmumOsf\n1b99XZNaO9N7UT4SfQAAAAAIocoa/7T9BdNzlTXOy+rFc8HsAhXmBEvtNSexRWOPRB8AAAAAQqgy\nMG1/cRnT9uOZmJ2hi8v9o/q/XtOU1qX2SPQBAAAAIGR2tUX0wg5/qTiez+/b5XMm+ErtvV7foefS\nuNQeiT4AAAAAhMxjm9sUiRmQnluUpdIJlNXry8xJWTozWGpvTfouykeiDwAAAAAhUxEoq7eIafsD\nuiqwKN9D77WoNk1L7ZHoAwAAAECIOOdUFViIbzHT9gd02nR/qb0uJy17qzGJLRo7JPoAAAAAECKr\nGzq1taWnrN6ELNOJ0yirNx3dEloAACAASURBVBAz05VzJ/pit69rTstSeyT6AAAAABAiwbJ686fn\nKjeTsnqDccHsfF+pvbq2iP6YhqX2SPQBAAAAIEQqA8/nLynLTVJLwmdCdoYuCZTauzkNS+2R6AMA\nAABASOztiGjVNsrqjcQX4pTaW5VmpfZI9AEAAAAgJB7f3KbYR8oPLczSzElZfZ+AXmZOytLZB6V3\nqT0SfQAAAAAIiarAtP3FTNsflivn+Bfl+8t7Lapp7ExSa0YfiT4AAAAAhIBzTpW1bb4YZfWG59Tp\nOZpTFCi1ty59RvVJ9AEAAAAgBN7e3alNjV37tvMypZMPYER/OMxMV8zpXWqvJU1K7ZHoAwAAAEAI\nBEfzTzkgV/lZlNUbrvNn52tyTKm9+raI7t+QHqX2SPQBAAAAIASqavzP57Pa/shMyM7QJYcFSu2t\nbVI6VNoj0QcAAACAFNfcGdHT2wLP57MQ34h94fAJyoiZFPFmfYde2RP+NDn8PwEAAAAApLmntrSr\nrefxfB08MVOHFlJWb6QOnpSlsw/0z4y4Z3P4P1cSfQAAAABIcZW9yurlyYzn80fDlXP9i/I9Xpep\nTSEvtUeiDwAAAAAprrLX8/lM2x8t8w/I0Vyv1F6mSadP7VJHJMmNGqHwz0kAAAAAgDS2YU+nNuzt\nmbefnSGdOp1Ef7SYmb72oUla09ChSz8wQS1b3tWskD8WEe7WAwAAAECaqwpM2//ItFxNzGZy9mg6\nd1bBvvfVSWzHaOHbAQAAAAApLDhtfzHT9jEAEn0AAAAASFGtnU5Pbm33xRaX5fVxNBBFog8AAAAA\nKWrV9jY1d7p92zMKMjSniCew0T8SfQAAAABIUZU1bb7tRaWU1cPASPQBAAAAIEVVBhbiY9o+BoNE\nHwAAAABS0KbGTr21q3PfdqZJp1FWD4NAog8AAAAAKWhFrX/a/rz9c1SUSwqHgfEtAQAAAIAUVBEo\nq7eolGn7GBwSfQAAAABIMR0Rp8e3+Ef0F5cybR+DQ6IPAAAAACnm+e3t2tvRU1Zvv7wMHTUlO4kt\nQpiQ6AMAAABAiqkMTNtfWJqrDMrqYZBI9AEAAAAgxVQGFuJbQlk9DAGJPgAAAACkkK3NXXqjvmPf\ntkk6fQbP52PwSPQBAAAAIIVU1fqn7R87NVtT8jKT1BqEEYk+AAAAAKSQqsC0/cVM28cQkegDAAAA\nQIroijitCIzoLy4l0cfQkOgDAAAAQIp4aWe7drX3lNUrzjUdO5WyehgaEn0AAAAASBHB1fYXzshT\nZgZl9TA0JPoAAAAAkCKqavzT9heVsto+ho5EHwAAAABSwM7WLr28s8MXW8Tz+RgGEn0AAAAASAEr\na9vkYraPKsnWtALK6mHoSPQBAAAAIAVUBlfbL2PaPoaHRB8AAAAAkizinKoCC/ExbR/DlZBE38yW\nmdl2M3szJvYtM6s1s1e910dj9n3DzNab2TozOzMmfpYXW29m18XEDzGz57z4PWaW48Vzve313v6Z\nA90DAAAAABLt9boO7WyN7NsuzDbN2z8niS1CmCVqRP92SWfFif/EOXe093pYksxsrqQLJR3hnfMr\nM8s0s0xJN0o6W9JcSRd5x0rSD7xrHSqpQdJlXvwySQ1e/CfecX3eY5R/ZgAAAAAYlGBZvdNm5Cqb\nsnoYpoQk+s65JyTVD/LwcyTd7Zxrc869K2m9pHnea71zboNzrl3S3ZLOMTOTtFDS/d75yyV9MuZa\ny73390ta5B3f1z0AAAAAIOEqA2X1FjNtHyOQleT7X2Nml0h6UdLXnXMNkkolrYo5psaLSdKmQPwE\nSVMk7XLOdcY5vrT7HOdcp5nt9o7v7x5xVVdXD+0nS4IwtBFR9FV40FfhQV+FB30VDvRTeNBX4dFX\nX+3plJ7fni+pZwR/VscWVVe7uMdj7KX671V5eXm/+5OZ6N8k6QZJzvv3x5IuTWJ7+jXQB5ls1dXV\nKd9GRNFX4UFfhQd9FR70VTjQT+FBX4VHf3314MYWRWImQM8pytL8Iw9NVNMQkA6/V0lbdd85t805\n1+Wci0i6VT1T52slHRhzaJkX6yteJ6nIzLICcd+1vP2TveP7uhYAAAAAJFRFYNo+q+1jpJKW6JvZ\n9JjNT0nqXpH/IUkXeivmHyKpXNLzkl6QVO6tsJ+j6GJ6DznnnKSVks71zl8q6cGYay313p8raYV3\nfF/3AAAAAICEcc6pqtaf6C8py01Sa5AuEjJ138z+IGmBpKlmViPpekkLzOxoRafub5R0pSQ551ab\n2b2S1kjqlHS1c67Lu841kh6VlClpmXNutXeLayXdbWbfkfSKpNu8+G2S7jSz9YouBnjhQPcAAAAA\ngERZ09CpLc09ZfUKskwnTiPRx8gkJNF3zl0UJ3xbnFj38d+V9N048YclPRwnvkFxVs13zrVKOm8o\n9wAAAACARKkMjObPn56r3EzK6mFkkjZ1HwAAAADGu2BZvSWljOZj5Ej0AQAAACAJ9nZEtGp7uy+2\nuIyF+DByJPoAAAAAkARPbG5TR8/j+ZpdmKmZk5JZAR3pYtDfIjOL+0cBrzweAAAAAGAIqmrbfNuL\nKauHUTKUEf1OSR3Bl5m1mdm7ZvZjM5s4Fo0EAAAAgHTinOu1EB/T9jFahpLof0nSCklnSJoj6UxJ\nVZL+U9K/SjpJ0k9Hu4EAAAAAkG6qd3fq/caeCt+5mdLJB+QksUVIJ0N5AORrko51zu32tt82sxcl\nveScm21mb0h6adRbCAAAAABppjIwbf+UA3JVkMUSahgdQ/kmFUoqCMQKJE323m+VlD8ajQIAAACA\ndFYVmLa/iOfzMYqGMqJ/h6QKM/uZpE2SyiR9WdJyb/8ZktaNbvMAAAAAIL00d0b01NbgQny5SWoN\n0tFQEv3/kFQt6UJJMyRtkXSjpFu9/SslPTaajQMAAACAdPP01na19Tyer4MmZqp8MmX1MHoG/W3y\nyuj92nvF298aLw4AAAAA6FFZE1htvzRPZpak1iAdDenPRmZ2hqSjJfnK6Dnn/s9oNgoAAAAA0lWw\nrN4ipu1jlA060TezX0o6X9Ep+s0xu9xoNwoAAAAA0tG7ezr1zp6eefvZGdKpM0j0MbqGMqL/aUkf\ncs5tGqvGAAAAAEA6C662f+L+OZqUTVk9jK6hfKN2Sto1Vg0BAAAAgHRXURtYbb+MsnoYfUMZ0f+x\npN+Z2fckbYvd4ZzbMKqtAgAAAIA009bl9OSWYFk9En2MvqEk+jd5/34sEHeSMkenOQAAAACQnlZt\na1NzZ88SZ9MLMjS3mLJ6GH1DKa/HgyMAAAAAMEwVNf7R/EWU1cMYIXkHAAAAgAQILsS3hOfzMUb6\nHdE3s787587y3j+pPkrpOedOHYO2AQAAAEBa2NpmWrurc992pkmnTaesHsbGQFP374h5/5uxbAgA\nAAAApKtnG/yTqY/fL0dFuUywxtjoN9F3zv0+ZvMt59xzwWPMbN6otwoAAAAA0sizDf71yymrh7E0\nlD8hVfQR//toNAQAAAAA0lFHxOn5XYFEv5Rp+xg7A666b2YZkiz61sx73222pM64JwIAAAAA9Pz2\ndjV19aRR++Vl6Kgp2UlsEdLdYMrrdapnEb5gUh+R9N1RbREAAAAApJHgavsLS3OVQVk9jKHBJPqH\nKDqK/7ik2NX1naQdzrmWsWgYAAAAAKSDypo23/biUp7Px9gaMNF3zr3nvT14jNsCAAAAAGllW3OX\nXq/v2Ldtio7oA2NpMCP6+5jZJySdJmmqYp7Vd85dMsrtAgAAAIDQC07bP3ZqtqbkZfZxNDA6Br3q\nvpldL+lm75zzJNVJOlPSrrFpGgAAAACEW1Wtf9r+IsrqIQGGUl7vUklLnHNfldTu/ftxSTPHomEA\nAAAAEGZNHRGt2Owf0aesHhJhKIl+kXPuTe99u5llO+eeV3QqPwAAAADA0xlxuvTxBjW0uX2xohzT\ncVNzktgqjBdDeUb/HTM7wjm3WtKbkv7VzBokNYxN0wAAAAAgfJxz+s9Vu/XoJv9o/nmzCpSZQVk9\njL2hJPrflDTFe/8NSb+TNFHSF0e7UQAAAAAQVj99o1HL1jX5YuUTIvqv4wqT1CKMN4Oeuu+ce9g5\n94T3/jnn3KGSzpB00Vg1DgAAAADC5L53mvXfL+3xxcomZOpnc9tUmDOUJ6eB4Rvwm2ZmBWZ2g5n9\nxcz+x8wKzWyWmf1J0tOSto99MwEAAAAgtT2xpU1ffMr/ZHNhjum+JVO0X67r4yxg9A3mT0o3Krq6\n/hpJiyX9UdLj3vYhzrmrx655AAAAAJD61jR06LMr6tQR6YllZ0h3LZyiOcXZyWsYxqXBPKN/pqSj\nnXPbzewXkt6XdJpz7smxbRoAAAAApL4tzV06v6JOe9r9o/a/OqVYp06nnB4SbzAj+hOdc9slyTlX\nI6mRJB8AAAAApD3tEZ1XUaeapi5f/FvHFeq82QVJahXGu8GM6GeZ2emS9tWBCG4751aMQdsAAAAA\nIGV1RJyWrqzXm/Udvvhlh0/Qlz84MUmtAgaX6G+XtCxmuy6w7STNGs1GAQAAAEAqc87p357epZWb\n23zxsw7M0w9OmCwz6+NMYOwNmOg752YmoB0AAAAAEBrfe3Wv/rC+2Rc7dmq2bjutWFkZJPlILgo5\nAgAAAMAQ3PF2k3746l5fbOakTN2zeIomZJNiIfn4FgIAAADAIFXWtOqrz+zyxUpyM3T/kinaLz8z\nSa0C/Ej0AQAAAGAQXqtr1+dW1qsrpopeXqb0h0UlOnRydvIaBgSQ6AMAAADAAN5v7NT5FXVq7OzJ\n8k3SLaeW6IRpuclrGBAHiT4AAAAA9GNXW0Tn/aNO21oivvj3TpisT8zMT1KrgL6R6AMAAABAH9q6\nnD6zok7rdnf64lcfMVFXzZ2YpFYB/SPRBwAAAIA4Is7pi0826Omt7b74J2fm64bjC5PUKmBgJPoA\nAAAAEMd/v7hHf3y3xRf7yLQc/Xp+sTLMktQqYGAk+gAAAAAQcOvaRv3szUZfrHxyln6/aIryskjy\nkdpI9AEAAAAgxt/ea9G1z+32xfbPz9B9S6aoOJcUCqmPbykAAAAAeF7c0a4vPN6gSE8VPRVkme5Z\nPEUzJ2Ulr2HAEJDoAwAAAICkDXs6dUFFnVq6erL8DJN+u6BEx0zNSWLLgKEh0QcAAAAw7u1s7dK5\n/9ipuraIL/4/HynSmQfmJalVwPCQ6AMAAAAY15o7I7qosk4b9nb54v9+1CR97gMTktQqYPhI9AEA\nAACMW10Rp8sfb9ALOzp88Qtm5+t/HzspSa0CRoZEHwAAAMC45JzTN57frb+93+qLnzY9V784uVhm\nlNFDOJHoAwAAABiXfrm6UbesbfLF5hZn6Y6FJcrJJMlHeCUk0TezZWa23czejImVmFmFmVV7/xZ7\ncTOzn5vZejN73cyOjTlnqXd8tZktjYkfZ2ZveOf83Lw/vQ3nHgAAAADS3582NOu/Xtjji80oyNB9\nS6Zqcg7joQi3RH2Db5d0ViB2naQq51y5pCpvW5LOllTuva6QdJMUTdolXS/pBEnzJF3fnbh7x1we\nc95Zw7kHAAAAgPT39NY2XfVkgy9WmG26d8lUlU7ITFKrgNGTkETfOfeEpPpA+BxJy733yyV9MiZ+\nh4taJanIzKZLOlNShXOu3jnXIKlC0lnevkLn3CrnnJN0R+BaQ7kHAAAAgDS2bleHPl1Vp/aYKnpZ\nJt25sERHlmQnr2HAKErmnJRpzrkt3vutkqZ570slbYo5rsaL9ReviRMfzj0AAAAApKmtzV06t6JO\nu9udL/6LU4p12oy8JLUKGH1ZyW6AJDnnnJm5gY9M3j2qq6tHszljIgxtRBR9FR70VXjQV+FBX4UD\n/RQe9NXgNHdJV76ep01N/rHOqw5q14ddrRLxMdJX4ZHqfVVeXt7v/mQm+tvMbLpzbos3bX67F6+V\ndGDMcWVerFbSgkD8MS9eFuf44dyjTwN9kMlWXV2d8m1EFH0VHvRVeNBX4UFfhQP9FB701eB0Rpwu\nqqzTW01tvvjSwwr0vZNmJKSMHn0VHunQV8mcuv+QpO6V85dKejAmfom3Mv6JknZ70+8flXSGmRV7\ni/CdIelRb98eMzvRW23/ksC1hnIPAAAAAGnEOaevPbtLFbX+JP+Mslz9+CNFCUnygURLyIi+mf1B\n0dH4qWZWo+jq+d+XdK+ZXSbpPUnne4c/LOmjktZLapb0eUlyztWb2Q2SXvCO+7ZzrnuBvy8qurJ/\nvqRHvJeGeg8AAAAA6eX/vbZXd7zd7IsdPSVbyxaUKCuDJB/pKSGJvnPuoj52LYpzrJN0dR/XWSZp\nWZz4i5KOjBOvG+o9AAAAAKSHP6xv1ndf2euLHTQxU/csnqKJ2cmc3AyMLb7dAAAAANLOY5tb9aWn\nGnyxohzT/UumaFpBZpJaBSQGiT4AAACAtPJGfYcuXlGvzpiaW7mZ0u8XTdFhRdnJaxiQICT6AAAA\nANJGTWOnzq/Yqb0d/srav55frJMOyE1Sq4DEItEHAAAAkBZ2tUV0fkWdtjRHfPEbji/Upw4pSFKr\ngMQj0QcAAAAQeu1dThevqNOaXZ2++JVzJuiaIyYmqVVAcpDoAwAAAAg155yuebpBT25t98U/dlCe\n/u+8yTKjjB7GFxJ9AAAAAKH2nZf36N53Wnyxefvl6NbTSpSZQZKP8YdEHwAAAEBo3b6uST9+vdEX\nm12YqT8sLlF+Fkk+xicSfQAAAACh9OimVn3t2V2+2NS8DN2/ZKqm5GUmqVVA8pHoAwAAAAidV3a2\n6/OP1SsSU0UvP9N0z+IpOqQwK3kNA1IAiT4AAACAUNm4t1PnV9SpubMny88w6bYFxTpuv5wktgxI\nDST6AAAAAEKjvrVL51XUaUdrxBf/4QmT9dGD8pPUKiC1kOgDAAAACIWWTqdPV9WrenenL/7lIyfq\nC3MmJqlVQOoh0QcAAACQ8iLO6aon67Vqe7svfu6sfF3/4cIktQpITST6AAAAAFLeN1/YrQc3tvpi\npxyQoxtPKVaGUUYPiEWiDwAAACCl3bS6Ub9a3eSLHV6UpbsWTlFuJkk+EESiDwAAACBlPbixRf/r\n+d2+2AH5GbpvyRQV5ZLOAPHwmwEAAAAgJT23rU1XPlEvFxObmGW6d8kUHTgxK2ntAlIdiT4AAACA\nlLN+d4cuqqpXa1dPLNOk5QtLdNSUnOQ1DAgBEn0AAAAAKWVHS5fOrahTfVvEF//ZyUVaVJqXpFYB\n4UGiDwAAACBlNHVEdEFlnTbu7fLFrz16kj5bPiFJrQLChUQfAAAAQErojDhd+niDXt7Z4Yt/prxA\n1x09KUmtAsKHRB8AAABA0jnn9J+rduvRTa2++KLSXP30pCKZUUYPGCyWqgQAAACQVI0dEX3pqV16\nYGOLL/7BkmzdfnqJsjNI8oGhINEHAAAAkDTVuzv02ap6rdvd6YuXTcjUvUumaFI2k5CBoSLRBwAA\nAJAUD21s0dVPNWhvh/PFi3JM9y2ZoukFmUlqGRBuJPoAAAAAEqoz4nTDS3v0szcbe+2bW5yluxZO\n0axCUhVguPjtAQAAAJAwO1q6dOlj9Xpya3uvfefPztdPTypSQRbT9YGRINEHAAAAkBAvbG/X0pV1\n2twc8cWzTPreCZP1hcMnsLo+MApI9AEAAACMKeeclq1r0nXP7VaHP8fX9IIM3b6gRCdMy01O44A0\nRKIPAAAAYMw0d0b0tWd26e53WnrtO/mAHP12QYn2z2fRPWA0kegDAAAAGBPv7unUxSvr9WZ9R699\nXzpyoq4/rlBZGUzVB0YbiT4AAACAUffoplZd8US9drf7S+dNzDLdOL9Y58zMT1LLgPRHog8AAABg\n1HRFnH7w2l798NW9vfYdNjlLdy4s0QeKspPQMmD8INEHAAAAMCoa2iK6/PF6Vda29dp3zsw8/fKU\nYk3KpnQeMNZI9AEAAACM2Ks723XJynq939jli2ea9K0PF+qaIyZSOg9IEBJ9AAAAACNyV3WTvv7s\nLrX5c3ztl5ehZQtKNH86pfOARCLRBwAAADAsrZ1O1z63S8vfbu61b95+Obr99BLNmEDpPCDRSPQB\nAAAADNmmxk5dsrJer+zsXTrv8jkT9N3jJysnk6n6QDKQ6AMAAAAYksc2t+rSxxpU3xbxxfMzTT89\nuUgXzC5IUssASCT6AAAAAAYp4px+8nqjvvvKHkWcf98hkzJ158IpOrKE0nlAspHoAwAAABjQ7vaI\n/vXJBj38fmuvfWcdmKdfzy9WUS6l84BUQKIPAAAAoF+r6zt08Yo6bdjrX1bfJP3vYwv1taMmKoPS\neUDKINEHAAAA0Kf73mnWl5/ZpeZO/1z94lzTbaeVaGFpXpJaBqAvJPoAAAAAemnvcvrmC7t1y9qm\nXvuOnpKtOxaW6KCJpBNAKuI3EwAAAIDPluYufX5lvVZtb++175LDCvTDE4qUl8VUfSBVkegDAAAA\n2OfprW36/GP12t7iL52Xmyn96MQiXXLYhCS1DMBgkegDAAAAkHNON65u1PUv7lFXoHRe2YRM3bmw\nRMdMzUlO4wAMCYk+AAAAMM41dkT0pad26YGNLb32LZyRq1tPK9aUvMwktAzAcJDoAwAAAOPY27s6\ndPGKeq3b3dlr379/aJK+cfQkZWbwPD4QJiT6AAAAwDj14MYWXf1kgxoDpfMKc0w3zy/W2QflJ6ll\nAEaCRB8AAAAYZzojTt9+aY9+/mZjr31zi7N018IpmlVIqgCEFb+9AAAAwDiyo6VLlz5Wrye39i6d\nd/7sfP30pCIVZGUkoWUARguJPgAAADBOvLC9XUtX1mlzs790XpZJ3zthsr5w+ASZ8Tw+EHYk+gAA\nAECac87ptrea9I3nd6vDn+NrekGGbl9QohOm5SancQBGHYk+AAAAkMaaOyP62jO7dPc7vUvnnXxA\njn67oET751M6D0gnJPoAAABAmnp3T6c+u6JOqxt6l8770pETdf1xhcqidB6Qdkj0AQAAgDT0900t\nuuKJBu1p95fOm5hlunF+sc6ZSek8IF2R6AMAAABppCvi9P1X9+pHr+3tte+wyVm6c2GJPlCUnYSW\nAUiUpNfNMLONZvaGmb1qZi96sRIzqzCzau/fYi9uZvZzM1tvZq+b2bEx11nqHV9tZktj4sd511/v\nnWv93QMAAAAIq/rWLp1fWRc3yT9nZp6qPr4fST4wDiQ90fec7pw72jn3YW/7OklVzrlySVXetiSd\nLance10h6SYpmrRLul7SCZLmSbo+JnG/SdLlMeedNcA9AAAAgNB5dWe7TvvLDlXVtvnimSbdcHyh\nbl9QoknZqfLffwBjKVV/08+RtNx7v1zSJ2Pid7ioVZKKzGy6pDMlVTjn6p1zDZIqJJ3l7St0zq1y\nzjlJdwSuFe8eAAAAQKjc+XaTznx4hzY1dvni++Vl6M9nTtWXjpwkb2IrgHEgFZ7Rd5L+YWZO0s3O\nuVskTXPObfH2b5U0zXtfKmlTzLk1Xqy/eE2cuPq5BwAAABAKbRHpy083aPnbzb32zdsvR7efXqIZ\nEyidB4w3qZDon+KcqzWz/SVVmNlbsTudc877I8CYGcw9qqurx7IJoyIMbUQUfRUe9FV40FfhQV+F\nA/2U+ra0mq59K1drG3sn+edP79BXDmlW0+ZdoidTB79X4ZHqfVVeXt7v/qQn+s65Wu/f7Wb2gKLP\n2G8zs+nOuS3e9Pvt3uG1kg6MOb3Mi9VKWhCIP+bFy+Icr37uEddAH2SyVVdXp3wbEUVfhQd9FR70\nVXjQV+FAP6W22qYu3b2+WTeublR9W8S3Lz/T9NOTi3TB7IIktQ594fcqPNKhr5L6jL6ZTTCzSd3v\nJZ0h6U1JD0nqXjl/qaQHvfcPSbrEW33/REm7ven3j0o6w8yKvUX4zpD0qLdvj5md6K22f0ngWvHu\nAQAAAKSUti6nP7/bonP/sVMfvG+rbnh5T68k/5BJmar42H4k+QCSPqI/TdID3sIgWZJ+75z7u5m9\nIOleM7tM0nuSzveOf1jSRyWtl9Qs6fOS5JyrN7MbJL3gHfdt51y99/6Lkm6XlC/pEe8lSd/v4x4A\nAABASni9rl13VTfrvg3Namjr+0nTsw7M06/nF6soN1XX2gaQSElN9J1zGyR9KE68TtKiOHEn6eo+\nrrVM0rI48RclHTnYewAAAADJVN/apfs2tOiu6ma9Ud/R77E55nTtMZP11aMmKoNV9QF4kj2iDwAA\nAIx7Xf+/vfsPkvuu7zv+fO/u7Uqn35IlWZLt2kZHgmkCxpaBEPCPjik/OiFMSwvYAwntdNo0HZo2\n0yFNZ9pOJy1NU6ZkwkzaJpAfViEpCUmgBAJBJpSfMhhsbAdOMj+sO1mSJevnSbu3u5/+8f3e3d6d\n7nQ6fe/2bvf5mPnOfn9+9vv1x7u3L30+3++nnTgwWueh4TE++cOLNNrz7/9jWwd4cGiQl3GUfbfd\nMP/OkvqOQV+SJEnqkqfPNtk/fIEPHxpjdGz+dL+lFrzl1kEeGBrkJduqAKzwB4NL6hKDviRJkrSM\nzo+3+dPvZ13zv3ysMe++pYD7dtd4cGgdr79pDbWy3fMlXZlBX5IkSVpiKSW+ejx7sN7HvneRC825\nH6wHcOuGMg8MreOtewfZs668TGcpqVcY9CVJkqQlcnQsG/N+//AYh8425913XSV4081reXBokFfu\nrBI+XE/SIhn0JUmSpAI1Wok/f+YS+4cv8NmROu35G+95xY4qDwwN8tO3rGXDgMPjSbp2Bn1JkiSp\nAI+fGmf/8AX+8PBFTtXnf7De9WtLvG1v9mC9vZsGlukMJfULg74kSZK0SM/X23z06TEeGh7jWyfn\nH/N+oASvv3ENDw6t4749NSolu+ZLWhoGfUmSJOkqtNqJzx/Nxrz/xA+uPOb9i7dUeHBoHX//BWvZ\ntsYH60laegZ9SZIkaQG+d7bJ/kNjfHh4jJGx1rz7bq4Gb3nBIA/sHeQl2wZ8sJ6kZWXQlyRJkuZw\nIR/zfv+hMb747Pxjg5ziSwAAFh9JREFU3gdw354aD+wd5A03rWVNxXAvqTsM+pIkSVKHlBJfO95g\n/6FszPtz4/M/Nv/mDWUeHFrHW1+wlhvW+/NaUvf5TSRJkiQBz461+IPD2YP1hs/MP+b9YD7m/QND\ng/zEziolu+ZLWkEM+pIkSepbjVbiU89cYv+hMT575BKtK4x5//J8zPs3O+a9pBXMoC9JkqS+88Sp\ncfYfusAfHLrIySuMeb8zH/P+7XsHeeFmx7yXtPIZ9CVJktQXTudj3u8/NMajz80/5n0l4PU3ZWPe\n/y3HvJe0yhj0JUmS1JNSSnzvXIuvHW/w2ZFLfPwHF6nPPyoet3WMeX+dY95LWqUM+pIkSeoJ58bb\nfONEg4Mnxjl4vM7BE+OcukK3fIBN1eAttw7y4JBj3kvqDQZ9SZIkrTrtlBg+0+TgiQaPHG/wtRMN\nnnq+yRWepTcpgHt213hwaJA3Oua9pB5j0JckSdKKd7re5uvPNTh4vJGF+xMNzjQWGuun3LyhzNv3\nDvK2vYPc6Jj3knqU326SJElaUVrtxF+fbvLIiayl/pHjDb5zhXHt57K+Etyxvcq+7VXu2VNzzHtJ\nfcGgL0mSpK46eanFIyfGJ1vrv/Fcg3PjV99aD/AjmyrcuSML9vu2V/nRzRXKPjFfUp8x6EuSJGnZ\nNNuJJ54fn9YF//DZKzwKfw4bq8G+7VXu3F7lrh1V7riuyuZaqeAzlqTVx6AvSZKkJXP8Yja83SMn\nsmD/6HPjjDWvvrU+gBdtqWQt9XmL/dCmit3wJekyDPqSJEkqRKOVePzU+GRL/deON/jh+cW11m+t\nldi3fYB9O2rs2z7A7ddV2Vi1tV6SFsKgL0mSpEUZvdDi4ImpJ+F/82SD+iJyfTngxVsGJlvq922v\ncuvGsuPZS9IiGfQlSZJ0RZeaiW+dzAJ9Nnb9OCNji2ut376mxL4dVe7aXuXOHVVu3zbAugFb6yWp\nKAZ9SZIkTZMS/OBcc7L7/SMnGjx2apzx9tWXVQn48W0D0+6tv2m9rfWStJQM+pIkSX3ownibkQst\njuTTSMfr4yfWcnL82KLK3T2YtdbfmXfBf8m2KmsrhnpJWk4GfUmSpB7TaCVGx7LQPjIjyB8532Tk\nQovTjfmefL+wYF4twUu3TbXU79tRZc+6cjEXIUlaNIO+JEnSKtJOieMXZ7bGNzlyfirYH7vY5uoH\nsLuyG9eXs/vq83Hr/+bWAWplW+slaaUx6EuSJK0QKSXONBLP5OF95EJrMsBPhPqjY61F3St/tdaW\ng9uvm7q3/s7tVa4ftLVeklYDg74kSdIyGWu2J1vdnzk/u2v9yIUWF5pL0RY/WyVg17oyN+TTno7X\ndGqE+3/8BQyUbK2XpNXIoC9JklSA8Xbi6FhrWhf6IzNC/Kn6MjTF53auLU0L79l8hRvWZ/M71pQo\nzxHkh+vJkC9Jq5hBX5Ik6Sr94FyTh0frfPHZOt871+TIhRbPji3NffGXs6kaHS3xlSzEr59qld81\nWPbeeUnqYwZ9SZKkKzjTaPOFo3UeHq1zYPQSh8+2luy91pZjqgV+/fQu9ROv6wdKS/b+kqTVz6Av\nSZI0Q7Od+PqJBgdG6xwYrfPIiQatAprrywG7BsvcmAf4PYNTYX4iyG+tlYiwNV6StHgGfUmS1PdS\nSjx9tsWB0UscGK3zhaN1zo5ffbLfcdn74rN74/esK7Nz7dz3xUuSVBSDviRJ6kvP19t8Pu+Kf2C0\nzg/PL7w7fiXgrh1V7t1d464dNW5aX2b3Ou+LlyStDAZ9SZLUFxqtxNdONHh4pM7nRi/x6HPjV/Xw\nvB/ZVOGe3TXu3VPjVdfX2OB98pKkFcqgL0mSelJKie+eafK5kToPj17i/z3buKox6rfVSty7p5aF\n+91r2LOuvIRnK0lScQz6kiSpZzx3qcXDo/XJcD86tvBx62tleMWOGvfl4f7Htg5Q8qF4kqRVyKAv\nSZJWrUvNxFeO1zkwkj0d/7FT41d1/Iu3VLh39xru3VPjlTurDFbsji9JWv0M+pIkadVIKfHE800O\njGQP0PvSsTqXrmJI+51rS9y7u8a9e9Zwz64aOwftji9J6j0GfUmStKI9O9bKx7O/xMOjdY5fXHh3\n/LXl4FXXV7l3zxru3V3jRZsrjlEvSep5Bn1JkrSiXBhv86VjjSzYj9R58nRzwccG8JJtA5Ot9i/f\nUXXIO0lS3zHoS5KkrmqnxGMnx/ncaJ0DI5f46vEGjYU32nPDunIW7HfXuHt3jW1r7I4vSepvBn1J\nkrTsnjnf5MBonYfz6VR94cl+fSX4yV017svHtN+70e74kiR1MuhLkqQl02onnm+0OXmpzeGzTf7k\n8ACPPn6M4TML745fCrjjugHu2b2G+/bUuHN7lYGSwV6SpLkY9CVJ0oJ0hvZT9anXU5fanJy13OLk\npTZnGok0rZQB4Moh/5YNZe7dvYZ7dtd4za4am2sOeydJ0kIZ9CVJ6kMTof3yIX12aD9Vb3O6PjO0\nF2dTNbh7V21yTPubN/gTRZKkxfKvqCRJq9yVQvtk6/syhfaFqATs21HN77Nfw+3bBijbHV+SpEIY\n9CVJWkEarcSZRpvn63lIvzTjtSO0n6pnwb3bof1KNleDbWtKbKuVuaVygTe/eCevur7GhgG740uS\ntBQM+pIkFajVTpwdz8L66Xp2j/rpRpszE1M9Tc032pxudC4nxporObJPhfattRJb15TZVsvmt63J\npi21Ets6ljdXS1Q6WuqHh08zdOPaLl6BJEm9z6AvSVKHlBLnm4kz9dkhPAvulw/op+ttzjbanB1f\n2UG90+ZqTIb0K4X2rbVsuWL3ekmSVjyDviSp51xsToXwiVb1ywf07F71qW1tzjYSrdWT1SfNDO1b\nZ7SsG9olSeofBn1J0lVLKdFM2f3k421opuy10Uo02zCe0tR8OzGeYDzfd7zd+Tp9XbOdaOTLzTY0\n8n0mymnk+4zn2yb2P3GuRv3xY5OBvd7q9n+hxSsHbKqWprrIzwjtWZd5Q7skSZqbQV+SZkgpa9Ft\ntGGs2aadoJXIXxOtdrbcyvebWD+xXytl92lPLafJ9e00Y317Rtkd29pzvOe09+k4h/Y859Z5Xs2U\nh+ZWHprT9IA+3p4I5TMCesrDdysrY2Ups5Cx2ZfLxoFgU63EpmqJTdVgc3VqflO1xOa5ttVKrK8E\nEYZ2SZK0eAZ9aZVKeeBr5kGu2RHwJuab7bSgdVc8ZuK92lPbp63rCJ9pWsDMw2eCNGO5M/S2gVYb\n2qT8dSFlzd7Wvsy+baA9UfaMUD4tSHccO2UQvnS0K/Wr7hqsxGQon2hdn5jPAnwe2DtC+uZatrxh\nIBwmTpIkdVXfB/2IeB3wfrLmoN9KKb23y6ekAk0Exc5uvuOzugXP7go8u3sxM7oPT++S3MxbR8c7\nWktndk2e6GJ87kKN6vAJWnlAnh6uO+ZnbJ8I9Z37Srq8SpC3mne2mJfYXOsI7BMBvjY9zG+slqiV\n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\nQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Trend of ratings over the years'); print('--'*40)\n", "ratings_over_years = ratings.groupby(by = 'Year', as_index = False)['Rating'].count()\n", "\n", "fig = plt.figure(figsize = (15, 7.2))\n", "g = sns.lineplot(x = 'Year', y = 'Rating', data = ratings_over_years).set_title('Trend of Ratings over the Years')\n", "\n", "del g, ratings_over_years" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 536 }, "colab_type": "code", "id": "8JNHfm1TnRBp", "outputId": "dc0093b4-7ced-431d-d127-ef925d8b7769" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yearwise Counts for Ratings. Trend is similar across rating category.\n", "Most of the users have rated 5 on products and highest number of ratings came in 2013.\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+MAAAHUCAYAAABRZPnsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzde5wcVZ3//9c7AQIhJARxIQRcUAcV\nWIlEuS9yEwLrEryxoJJwR4EVv8u6gK7CQtC4oq6sii4SIIJEFhWyGi4xXGKQINcfd3bCbZMYiORK\nCLeEz++POhMqnZ6enpmanurO+/l49GO6T5361Omans/Uqa46RxGBmZmZmZmZmTXOgP5ugJmZmZmZ\nmdn6xp1xMzMzMzMzswZzZ9zMzMzMzMyswdwZNzMzMzMzM2swd8bNzMzMzMzMGsydcTMzMzMzM7MG\nc2e8xUiaJekn/d2OMpN0kKTHJL0p6ff93Z7uknS1pJv7ux1mzcy5smvOlWYGzpf1cL60nnJnvAZl\nbpb0R0kDK5btJukNSZ/pr/Z14gjgX/p6I5I2lfQNSY9IWilpkaTZkk6XtElfb79Ke67sRvL7CXAP\nsANQ+O9P0jxJkR6vSWqX9G+SNuxmnOMkraqy6HTgmGJa2/ckfT39I3857ZOt61zv/ZJuTZ+vlyT9\nWNLgvm6vdZ9zZeecK2u2xbkykbS9pMskzZH0qqS5kiZJ2qaOdZ0rm4jzZeecL2u2xfkyR9K1kp5J\n+XJRyoF71LFe6fKlO+M1REQAxwNtwLkd5SkhXA1cExH/3RfbljSgMknXIyIWR8TyvmhTB0mbA3cD\nXwQuAfYCPgJ8D/gscFBfbr83JA0A3gNMj4h5EbGkp3G6+P1cBIwA3gf8K3AW8PWebKtSRCzrabv7\nySDgBuBb9a4gaSgwA3id7PN1NPBx4L/6ooHWO86V1TlXOld2w/uBjYEvAbuQfT4+CNyUfhdVOVc2\nH+fL6pwvnS+76W5gPPAB4ABgATBd0ojOVihtvowIP7p4AEcCbwAfTq8vAZ4GNkuvtwYmA38BXgZm\nAfvm1h8I/Cyt82r6OQHYKFdnAvAk2Vmpp4BVZH9sAeyQqzcPeC73+gOpznvS61nAT3LL9wP+mNq1\nHHgIODi3vGbbO9kflwKvAO+qskzAsNzzs4Fn0/57GvjHivrzgHMqyq4Efp97PQv4KXAe8CKwGLgC\n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\n9tvz7ne/m/vvv7/X2zaz9Vs+X65YsaLU+XLw4MHst99+QDag0Ac/+EH+/Oc/r1PP+dLM+kKR+XKv\nvfbiG9/4xprYfXF8OXToUABWrVrFG2+8UXVqsmnTpnHUUUchiY985CMsW7aMF154odfbNiur9eIy\n9f60evVq7rzzTo499lggm67h6quvZujQoSxatIiDDz6Yww8/nPPOO48nnniCWbNmAfD888+vFeeR\nRx5h5syZDBo0iNGjR3PaaacxcOBAvvOd7zBz5kyGDBnCEUccwS677LJOG2bOnMlXv/rVtcoigk03\n3ZRbb721R+9rwYIF7Lrrrmteb7PNNmv+IZiZ9URlvtx4442bJl8uXbqUm2++mS9+8YvrLHO+NLOi\nFZ0vI4J9992XU045pcf5MiKQxODBgzvNl5/85Ce5//77+djHPsbYsWPXWb5gwQK22WabNa878mVX\nXxKZNSt3xvvIq6++yr777suCBQvYcccdOeCAA4AsUV144YXcddddDBgwgAULFrBw4cIu4330ox9l\n2LBhAOy4447MnTuXRYsWsc8++zB8+HAAxo4dy9NPP73Ouvvtt9+aJNzhtddeK2QuSDOz3qqWL998\n882myZerVq3ipJNO4tRTT2X77bfvxjs3M+uevsqXr732Gu9///t7lS/rObb89a9/zWuvvcbJJ5/M\nzJkz1xwfm62v3BnvIx339KxcuZJPfepTXHbZZXzhC1/gV7/6FS+99BJ33nknG264IX/zN3/Da6+9\n1mW8QYMGrXk+cOBAVq1aVXdb+uKb8REjRqx1Oeaf//xnRowY0aNYZrZ+q5YvjzvuOK677rqmyJdn\nnnkm7373uznttNOqLne+NLOilDlf1vPNOGTf4h9++OFMmzZtnc6486Wtb7q8Z1zSdpJul/S4pMck\nnZnKz5c0X9JD6XF4bp1zJc2R9JSkQ3PlY1LZHEnn5Mp3kHRPKv+lpI1S+aD0ek5avn2Rb74RBg8e\nzMSJE/nhD3/IqlWrePnll9lyyy3ZcMMNmTlzJnPnzgVgs8024+WXX+5W7N1224277rqLpUuXsmrV\nKqZOnVq1XseZy/xjxowZPe6IAxx22GHccMMNvP766zz33HM8/fTTjB49usfxzMwq8+Xy5ctLny8n\nTJjA8uXLmThxYqfbdr40W1uNY8stJE2X1J5+Dk/lknRJOh58WNJuuVjjU/12SeNz5aMlPZLWuUTp\n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\nX4uJEyey5ZZb8tJLLzF+/Hi22GILxo8fX3N+MzMzW3u5M76GdN0D+corr3DkkUcyceJEvvCFL3D9\n9dfz97//nTvvvJN1112XnXbaqabH4OQfPdS/f3+WL19eYetV9WRkfM6cOdx///3stNNOrFixgr/9\n7W8cfvjh3HDDDatsN3z4cBYseHuip2eeeYbhw4djZtZTRYqXPR0Z33LLLQHYaKONOOqoo7jnnntW\n64w7XpqZmVk5vmd8DRs4cCDnnnsuP/zhD1m+fDlLly5ls802Y91112XmzJk8/XT2mOGNNtqIl156\nqUdl77zzzvz+97/nxRdfZPny5UybNq3sdl0j410TDHUt5U4sTzzxRB555BHmzp3LjTfeyDbbbLPy\nPs28Qw89lClTphARzJkzh8GDB/sSdTPrkyLEy66R8Vri5fLly1m0KHtax5tvvsnNN9/Mdtttt9p2\nhx56KDfccAOvv/46Tz75JI899hi77LJLj9pvZmZm7WetGBl/9phNm/rc2Z122okddtiBqVOncvTR\nRzNu3Dg+9KEPMXr0aLbddlsge7TPHnvswZ577smBBx648pE9lWy55Zaceuqp7L///gwdOpSOjg4G\nDx7c63ZWM2lS9oj4E044gYMPPpgZM2bwgQ98gIEDB3LppZeusXrNrHFqeRRZd+rxnPFWipevv/46\n//RP/8Sbb77JW2+9xb777suxxx4LZJO23XfffXz961/nve99L0ceeSS7774766yzDhdeeCH9+/fv\nU91mZmbW+taKzngz5C9JBPjZz3628vWMGTPK5il9nE/X873HjRu3ygluvqyjjjqK4447juXLl/Op\nT32Kww8/vM9t7/LOd75zlWeMn3DCCStfS+LCCy+sW11mtvZq1Xi54YYbcuedd66S1nUZ/WGHHcZh\nhx22Mv20006r+IQKMzMzW/u4M97izj//fO644w5ef/119ttvPz7ykY80u0lmZoXkeGlmZmZF4s54\nizv33HOb3QQzs5bgeGlmZmZF4gnczMzMzMzMzBqsLTvj/fr144033mh2M9Z6b7zxBv36teVHzKxt\nOF4Wg+OlmZnZ2qctL1MfNGgQy5Yt49VXXwVg6dKlfZo1t9XzN6sN/fr1Y9CgQb2u08zWvHy8XFtj\nVRHyO16amZmtfdqyMy6JjTbaaOX7559/nlGjRvW6vFbPX5Q2mFnx5ONlEeJEs9vQ7PxmZma29vA1\n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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "#http://jonathansoma.com/lede/data-studio/classes/small-multiples/long-explanation-of-using-plt-subplots-to-create-small-multiples/\n", "print('Yearwise Counts for Ratings. Trend is similar across rating category.'); \n", "print('Most of the users have rated 5 on products and highest number of ratings came in 2013.'); print('--'*40)\n", "\n", "year_wise_ratings = pd.DataFrame(ratings.groupby(['Rating', 'Year'], as_index = False)['UserID'].count())\n", "year_wise_ratings.rename(columns = {'UserID': 'Counts'}, inplace = True)\n", "ratings_ = sorted(year_wise_ratings['Rating'].unique())\n", "\n", "fig, axes = plt.subplots(nrows = 2, ncols = 3, squeeze = False, figsize = (15, 7.2))\n", "plt.subplots_adjust(hspace = 0.5)\n", "axes_list = [item for sublist in axes for item in sublist] \n", "\n", "for rating in ratings_:\n", " ax = axes_list.pop(0)\n", " g = year_wise_ratings[year_wise_ratings['Rating'] == rating].plot(kind = 'bar', x ='Year', y = 'Counts', label = f'Rating = {rating}', \n", " ax = ax, legend = True)\n", " ax.set_title(f'Yearwise Count for Rating = {rating}')\n", "\n", "for ax in axes_list:\n", " ax.remove()\n", "\n", "del ax, axes, axes_list, fig, rating, ratings_, year_wise_ratings" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 255 }, "colab_type": "code", "id": "sm45CbRZzI9d", "outputId": "26b5ac16-f488-45cb-a692-aa180c821e9f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Adding a column with count of rating per user\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "(7824482, 6)" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UserIDProductIDRatingTimestampYearUserIDCounts
0AKM1MP6P0OYPR01327930405.002013-04-1320132
1A2CX7LUOHB2NDG03217329445.002012-07-0120124
2A2NWSAGRHCP8N504398863411.002013-04-2920131
3A2WNBOD3WNDNKT04398863413.002013-07-2220131
4A1GI0U4ZRJA8WN04398863411.002012-04-1820121
\n", "
" ], "text/plain": [ " UserID ProductID Rating Timestamp Year UserIDCounts\n", "0 AKM1MP6P0OYPR 0132793040 5.00 2013-04-13 2013 2\n", "1 A2CX7LUOHB2NDG 0321732944 5.00 2012-07-01 2012 4\n", "2 A2NWSAGRHCP8N5 0439886341 1.00 2013-04-29 2013 1\n", "3 A2WNBOD3WNDNKT 0439886341 3.00 2013-07-22 2013 1\n", "4 A1GI0U4ZRJA8WN 0439886341 1.00 2012-04-18 2012 1" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Adding a column with count of rating per user'); print('--'*40)\n", "userid = ratings['UserID'].value_counts()\n", "userid = pd.DataFrame(userid).reset_index()\n", "userid.columns = ['UserID', 'UserIDCounts']\n", "\n", "ratings_df = ratings.merge(userid, how = 'left', on = ['UserID'])\n", "display(ratings_df.shape, ratings_df.head())\n", "\n", "del userid" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "id": "AjHl_S6p0jym", "outputId": "93960de2-8714-4406-aec5-7d29f29593a5" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique USERS and PRODUCT IDs in the raw ratings dataframe\n", "--------------------------------------------------------------------------------\n", "Number of unique USERS in raw ratings dataframe = 4201696\n", "Number of unique PRODUCTS in raw ratings dataframe = 476002\n" ] } ], "source": [ "# Number of unique user id and product id in the data\n", "print('Number of unique USERS and PRODUCT IDs in the raw ratings dataframe'); print('--'*40)\n", "print('Number of unique USERS in raw ratings dataframe = ', ratings_df['UserID'].nunique())\n", "print('Number of unique PRODUCTS in raw ratings dataframe = ', ratings_df['ProductID'].nunique())" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 521 }, "colab_type": "code", "id": "xW3LOd5mJo72", "outputId": "2b55ccfc-a10f-4974-9552-a943acd406a1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distribution of Ratings per User is sparser\n", "Maximum number of rating per user being 520 and minimum being 1\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9MAAAHFCAYAAADxHarqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzde5hlV10n/O+vqro73Z0rCQmQBBJI\ncQm3CBJkREQiThCH6MglwCg4vKOO8o4zOq8TZkZkor7KvCPRGXGc5zUIIgoxirYSjCgXHcYJ4Q4J\nxGpCMDdyv3U6famuNX/sXd2nqyvdtbtPd1WnP5/nqaf2ZZ191jlnnTr1PWvttau1FgAAAGDpJpa7\nAgAAAHC4EaYBAABgIGEaAAAABhKmAQAAYCBhGgAAAAYSpgEAAGAgYRqA/VZV766qvzpIx35jVc0+\n3PpBuL+3VdXGg3X8oarqmVX1qaraUlU3LFMdzqiqVlUvXI77B4CVTJgGYDd9QG79z/aqurOq/mdV\n/WxVrV9Q/KeSvGrAsWer6o1LLP6BJKcu9dgD6vDC/rGdsWDXf0nybeO+vwPwn5Pcn+SpSZ63WIH+\nC4Y28nNHVX2kqgY/jqraWFVvW7D5xiSPTXLV0OMd7qrqxf1zetoi+w7al0gAHD6EaQAW87fpQtQT\nknxXkvcleXOSz1bVKfOFWmv3tdbuGecdV2dVa+2h1tpt4zz23rTWNrXW7jxU97cE00k+0Vq7obV2\nx17K7Uj3Wj02yXlJ7k3y4ao6+UAr0Frb0Vr7Zmtt+4Eea6WqqtXLXYfFVNWq5a4DAHsnTAOwmG19\niLqltfal1tp/T/KCJI9O8ivzhRb20FXV06vqyqq6t6oerKqvVNUP9ftuSDKZ5Hfme1L77W/se6y/\nq6o+l2Rrku9+uGHdVfXdVXVNP/z5qqo6Z2TfHrepqtP6+3tx3xv9t/2ur/fbP96X22OYd1W9oaqu\nraptVXVTVf1iVU2N7P94Vf12Vf1cVX2zqu6uqt+tqqP39uRW1WOr6v398/RQf5xv7fed0T83T0py\ncV/Ht+3teP1r9c3W2heTXJzk+CTPH7m/51TVh6vq9qraVFVXV9X5o4+jv7+fH+nlPmPhMO+R9VdX\n1Z9X1eaqun7haIOqOrOq/rJ/jW6sqp+cf65GylxQVZ/rj3FvdUPav2Uvz9m7q+qvqurfVNXN/e3+\nsKoetaDchVX1+f6+b6iqd9TIiIq+HpdW1S9U1a1J/mFvz+1SVDfa4ZNV9UD/84Wq+scj+0/p639H\nv/+TVfWikf3zveAvr24UyJYk/9eB1guAg0uYBmBJWms3p+uh/qdV9XCfH3+Q5K4k/yjJM5P8dJL5\nnuvnpetF/dfZ1ZM6byLJ2/vyT03y6Yc5/kS64c8/keTcJHck+VBVrV3iw7gxyQX98rl9Hf7pYgWr\n6uVJ3pXkvUmekeRnkvxkkp9fUPSVSR6V5MVJLkzyfUn+3cNVoKoqyZ+ke5zf19fjtiQfqaqTsmto\n9U3pnpPHphuCvk99aPzn/eq2kV3Hphs2/11JnpPkyiQbqurJ/f5/muSGJL+aXa/NjXu5q19J8rtJ\nnpXk/Ul+e/5Y/eP7YJLjkrwoyT9J8vIkO4NyVT0myR+may9PT/dFza8l2dc58ef2j+H8JN+b5Jwk\nl44c941J/nv/OM5O8sNJvjvJby04zqvTfTF0XpKX7uM+96r/cmVDuqHwz+l/3pZkc79/bZKPJTkm\nycvSPQ9XpHu9n7bgcL+a7jV/WpI/O5B6AXDwTe27CADsdE26YHZSktsX2f+EJO9orV3br18/v6O1\ndkeXs3Jfa+2bC25XSX6mtfa3Ozd0ZReqJP9Pa+0TfZkfShf6XpeRUPVwWms7qurufvWOReox6qIk\nf9Ra++V+/e/7EPgrVfULrbX5sPqN1tq/6Ze/WlUfSBfgfu5hjvuSdKHw6fPPU1X9cLow+xOttYuT\nfLOqdiTZtI86JslkVW3ql+d7YK9K8tcjj/vjC27zH6vqn6Q73/2XWmt3L3Z/D/MaJMlvtNYu68v8\nXJL/O13I/fv+sT87yXRrbWNf5p+l+3Jg3mOTrEpyWWvthn7bV/bxOJPuy5Qfaq3d1x/3J5NcWVVn\n9ff1tiRvaa29ty9/fVW9OcknqupfjZyScGu653puCfe5L8ckOSHJhtbaTL9tZmT/a9K9Z17TWpv/\nsuCXquq8JD+W7suleb/UWhOiAQ4TeqYBGGI+XbWH2f9f0vVSfry6YdPPGXDsq5dY7u/mF/pw9JV0\nvZvj9vQkf7Ng2yeSHJVuSPS8Lywoc0uSU/Lwnp7krpEvHNJa25ouAO/P49iRrof2uUl+KMnX0wXO\n0ZnQH11Vv1lVX+2HVG/q7+sJ+3F/SfL5kbrvSPfFyvxjPjvJnfNBui9zd5LrRm7/xXS941+uqg9W\n1U9V1elLuN9r54N075Pz91lVj07/ZU4/lH1T/zg/3Jc5a+R2nxlTkJ5vg7+dLtR/uKouqqqnjBR5\nXpLHJLl3Qb2+I9158aM+NY46AXBoCNMADPH0JPelG8q9h9baLyR5cpLL0g2N/t9V9YtLOO6O1tqW\nMdRvsYB0sCdy2rZgveUQf7621ja21q5rrf1ekl9O8ie1+8Ra704X3n62/31OukC8v5Nv7esxP9yX\nLfP13ZFuyPNL0n2J8oPpev6/bz/rk5H7/6l0j2/+59npQuuXRso+uITjzYf24xbZd3ySne21tfYv\n0n2Z8ZEk35nuS4IfG6nXVxbU6Zx0Q7n/xYLjLqVeAKwQwjQAS1JVpyZ5fZI/3luvXmvt+tbab7bW\nXpnkrUn+5cjubekmITsQOy/7VFXHpwsl8728t6cb9jzaM7ywd3w+CO6rHtekO+d31HcmeSjJ14ZU\neJHjnlhVZ89vqKo16SYM+/IBHHfeu5KsSzf7+rwXJfnN1tqG1tqX0g1zfuKC243jtUm61+LRVbWz\n976qTkj3JctOrfOp1tr/21p7Ubpe/x/Zx7GfVlXHjqz/o/n77Gd+vzHJU/ovFxb+DP2yZibdlzPn\njm7sz5H+liRfXfB4vtxae0dr7WXpTjn40X7Xp9M91/cvUqdbBtYJgBVEmAZgMaur6jFV9biqemZV\n/ct0w6tvT/KWxW5QVUdX1Tur6iX9bM7fkm6iqGtHin09yXf1xz1pP+rVkvznqnpRVT0z3SRYDyT5\n/X7/p/r1X6mq6epmrH7rgmN8I11I+t6qOrmqFut5TLoe3h/sh+0+uapene6c3F8dOV96f3y0r+fv\nV9W3V9Uz+sdxVLrJsw5I3+v7a0neUlXH9JuvS/L6/rU8J93EXwuD89eTfHtVPb6qTtrLJHP78lfp\nhr6/t6qeV1XPTjeJ22z6Huuq+kfVzYD+/P7+zks3mdm1D3vU/uEl+d2qekY/G/Y7052rPD+k/D8k\n+VdV9R/6Mk+pqu+vqv8x9EG01jalez1+uboZwp9UVc9N18t/UpL/0T+Ws6rq7dXN6P2EqnpBut7/\n+cfyvnTP7Yeq6nuqmxH9+VX1lqr6/qH1AmDlEKYBWMx3pOu9/IckH0/XI/0bSZ6zl2s/z6abiOnS\ndMNar0w3S/XrRsr8TLrhsDekm4l7qLkk/z5dkPl0unNRX95a25zsPDf3tel6r7+YbhKwnx09QF//\n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\nfUw+c2c3I/jtD+0ZqoeY20cn+J1b9gzgk9X16m/ZsZcbjjj96Mk8+bipnHHMVB7cPpd7ts7lnq0t\nd2/tlu/dNpe5lpyydiKPXT+Zx63rf9ZP5rHrJtOS3LllR+7eMpc7t8zlrq1zuWvLXO7bNpfjV0/k\ncf1tHrt+Mqeum8xj103kUUdN5IFtLfdu23Uf927t1ivJyWsncsrayZy8djKnrJvIY9ZO7hylsGVH\ncv+2uTywfS4PbG+5f1vL5tm5rJqoHDVVWTtZWTPZ/T5qqjJVXY/+9rlk646223KSrJ6o3Lqpsu3u\n7Vk1kaye7G4z/0XO/Bcm83+udq73G+b3zf9BGy23c38lq6qyZjKPuD98AAArwY65lge2t8y2lmNW\nTWTN5N7/55prLfds7f5/vXfrXNavmsiJR03kxDUTWb3IbbfPtdy0aUdueGA2NzzQ/b7j7lV59vZN\nOeOYqZxxzGQef/RU1k7tuu0D2+dy7d3b8+V7tufLd3c/N27akceun8wzTtg1GvXpJ6zK8Wsm0lrL\nZ+/cnj+94aFs+MZDueGB3f+h/9Qd2/L/feGBPPGYybzijLW54Iy1OefEVY+I/y9rX+e8VtVkkr9P\n8tIkNyW5OslrW2vXjpT5iSTPaq39eFVdmOQHWmuvqaqzk/xBknOTPC7JXyV5cmtt5zN83333HTYn\n3c7MzORXbz0xl1//0B7Dnee9pP/m5XA111q+cs9sPnbL1j0mLEu6wLtuqgt+92ydy/YDy92PeKsn\nui8XHq69HC5WT3TXOF89Wd3viWQuyexc12ZmW7JjLpltLS1dCF81kayarKyqPuz3owS27Wg7vyDY\nuqNb3zbXMtGXWz1RWTNRWTWZrJmoTE3sCvPzf692ezpb9tg2vzz65210/2QlUxN9Hfv7WDVRmUiy\nda6r35Yd6X+3bJntRjqsnuzKrZ6orJ7svtRYPVGZqO748zPlz99ft57F1/vlXett53Klq99UdV+G\nTU6kW56o7JjbdfrEtrlke//8zbZkVSVr+tdp4XO4o3U/s3MtO1rXLnf0T9BEKlW7RpXM/55tyZb+\n9ep+uudk+1zLUf0XQPO/2/YtOX792kxUZXt/asf2/lSP2bnuNpXuOZ/sH9vO572/ysB8nebarvrO\nPycT2f1LoV1fCM0vd8eZ/1xurWuP3WPujrtjrmu3E30bmOhf88mJbn2yumNMzD/vO5e7um2b6/4p\n6dpst7x9rmWqKqv698Wqvl2t3svzPjvXvdaj9znZfxk22bel2f41nS8/2x9n/ovHqb5drNrZTjLy\nunbvy/n1+edo9D5GH9eOnT+7bjPXWiZG6jb/fMz/n7Z9vl47n4duPf1rMlG1sy3t/Bl5jbr1vtyi\nr2d2Xn1ie8uuNjVyX1W7nu/552H+/Zwkmx7cnLXr1u18r83Nv+day9zoe3Dn/rZzfeH++ffg1ETt\n/PsxNfJ8LPybM/q+H7J91GJfcu7P9n3VY8l1XvD/4t6+jJ3/vdQ67u3v5R5/M0c+Bxbebm9Gn4/R\n/9/3rNtevmR+mPrv63ElyabNm7Nu3brdHsvCx5rs/lkwevtk/r008jej37bzfZ8umO16H+/+Hhx9\nH0/U6Ht/19/eubarzS92m/n/aeb/pu38+zTX/U2f/9s0/36Z6t/z2+cWfx9nwft4cmR9dvRUwZHP\nvNnW+jLd393Vk7uWk/lOiO7za9f/HF091kx0nQRr+s+uNf3/KVvnki2zLQ/1n/sPzXa/Z/vPu/mO\nj6Omus+9tZOVuSSbt7c8ODuXB2dbNs+2PLi9+71qIlm/qrJ+aiLrpirrV1XW9bfdtL3l/m1zuX9b\ny/19J8uooya7SYWPXTWRY1dXjl09kW07Wu7qO4Du6TuMFnPsqsqJR03kpKO6YH3jph256cEd++zo\nSpLHrpvI44+eym0P7dgjDO/N6UdPprXkpgeXfpv52/3hS0/MU48fNsfTcjruuOP2SP9LCdMvSPK2\n1to/7tffkiSttV8eKXNlX+bvqmoqyTeTPDrJRaNlR8vN3/ZwCtMAAAAceRYL00uZzfvUJDeOrN/U\nb1u0TGttNsl9SU5c4m0BAADgsOLSWAAAADDQUiYguznJ6SPrp/XbFitzUz/M+7h0E5Ht87aLdZcD\nAADASraUnumrk0xX1ZlVtTrJhUk2LCizIckb+uVXJvlo607G3pDkwqpaU1VnJplO8qnxVB0AAACW\nxz7DdH8O9JuTXJnkK0kua61dU1UXV9Ur+mKXJjmxqjYm+ensmnjsmiSXJbk2yV8k+cnRmbwPF1V1\nflVdV1Ubq+qi5a4PR4aqeldV3V5VXx7Z9qiq+khVzfS/T+i3V1X9176NfrGqnrN8NeeRqKpOr6qP\nVdW1VXVNVf1Uv12b5JCrqqOq6lNV9YW+Pf6nfvuZVXVV3+4+0HcCpP9S/wP99quq6ozlrD+PTFU1\n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\nJEnq6U+STNLwEVy8ugAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Distribution of Ratings per User is sparser')\n", "print('Maximum number of rating per user being {maxm} and minimum being {minm}'.format(maxm = ratings_df['UserIDCounts'].max(), \n", " minm = ratings_df['UserIDCounts'].min()))\n", "print('--'*40)\n", "fig = plt.figure(figsize = (15, 7.2))\n", "g = sns.distplot(ratings_df['UserIDCounts'], bins = 50).set_title('Distribution of Ratings per User')\n", "\n", "del fig, g" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "id": "REAcgSkiCb92", "outputId": "b403ca59-e5c4-43fa-ea43-b98d31d1cd76" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Taking a subset of dataset to make it less sparse/denser\n", "Keeping users those who have given more than 49 number of ratings\n", "--------------------------------------------------------------------------------\n", "Number of rows after filtering: 125871\n" ] } ], "source": [ "print('Taking a subset of dataset to make it less sparse/denser')\n", "print('Keeping users those who have given more than 49 number of ratings'); print('--'*40)\n", "\n", "ratings_df = ratings_df[ratings_df['UserIDCounts'] >= 50]\n", "print('Number of rows after filtering: {}'.format(ratings_df.shape[0]))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 470 }, "colab_type": "code", "id": "WQh_bINxKlBE", "outputId": "837bf32d-9fa1-4291-fb96-6c55550d9db8" }, "outputs": [ { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (15, 7.2))\n", "g = sns.distplot(ratings_df['UserIDCounts'], bins = 50).set_title('Distribution of Ratings per User after filtering users with less than 50 ratings')\n", "\n", "del fig, g" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "vLrw4c3WC1r5", "outputId": "f5f1c889-437b-4bd0-b1e5-96418ca0a543" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of product ids after filtering based on ratings given by users: 48190\n" ] } ], "source": [ "print('Number of product ids after filtering based on ratings given by users: {}'.format(ratings_df['ProductID'].nunique()))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "-Sg81xk3FiQP", "outputId": "41b22699-3f17-4c63-eb80-28768ca54f50" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Selecting only UserID, ProductID and 'Rating' column\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "print('Selecting only UserID, ProductID and \\'Rating\\' column'); print('--'*40)\n", "ratings = ratings_df[['UserID', 'ProductID', 'Rating']]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "id": "skDtHkdBysGk", "outputId": "1c3414ac-2c8a-48be-dafe-9f5101816ef2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique USERS and PRODUCT IDs in the filtered ratings dataframe\n", "--------------------------------------------------------------------------------\n", "Number of unique USERS in filtered ratings dataframe = 1540\n", "Number of unique PRODUCTS in filtered ratings dataframe = 48190\n" ] } ], "source": [ "# Number of unique user id and product id in the data\n", "print('Number of unique USERS and PRODUCT IDs in the filtered ratings dataframe'); print('--'*40)\n", "print('Number of unique USERS in filtered ratings dataframe = ', ratings['UserID'].nunique())\n", "print('Number of unique PRODUCTS in filtered ratings dataframe = ', ratings['ProductID'].nunique())" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 510 }, "colab_type": "code", "id": "dRWM7yQszdHD", "outputId": "dc83f0a9-0cdf-4cab-fd7f-b883231a5f6d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Top 10 users based on # of ratings given\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "UserID\n", "A5JLAU2ARJ0BO 520\n", "ADLVFFE4VBT8 501\n", "A3OXHLG6DIBRW8 498\n", "A6FIAB28IS79 431\n", "A680RUE1FDO8B 406\n", "A1ODOGXEYECQQ8 380\n", "A36K2N527TXXJN 314\n", "A2AY4YUOX2N1BQ 311\n", "AWPODHOB4GFWL 308\n", "A25C2M3QF9G7OQ 296\n", "dtype: int64" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Bottom 10 users based on # of ratings given\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "UserID\n", "A2RS66Y79Q8X0W 50\n", "A2Y4H3PXB07WQI 50\n", "A3VZH0PWLQ9BB1 50\n", "A19N3S7CBSU6O7 50\n", "A1IU4UAV9QIJAI 50\n", "A319Y83RT0MRVR 50\n", "A27H61OHW44XA7 50\n", "A2JRDFIGWTX50J 50\n", "A2RGA7UGAN3UL7 50\n", "ACH055GTTIGC9 50\n", "dtype: int64" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "# Top and bottom 10 users based on # of ratings given\n", "print('Top 10 users based on # of ratings given'); print('--'*40)\n", "most_rated = ratings.groupby('UserID').size().sort_values(ascending = False)[:10]\n", "display(most_rated)\n", "\n", "print('\\nBottom 10 users based on # of ratings given'); print('--'*40)\n", "least_rated = ratings.groupby('UserID').size().sort_values(ascending = True)[:10]\n", "display(least_rated)\n", "\n", "del most_rated, least_rated" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "aICAigneEx04" }, "source": [ "\n", "### Recommenders\n", "We will explore following methods of making recommendations:\n", "* Popularity based recommendations\n", "* Collaborative filtering (User-based and Item-based recommendations)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "lZUjXqeFHsQ2", "outputId": "206ef6ac-4cf9-43d6-8042-06ad1e5abf08" }, "outputs": [ { "data": { "text/plain": [ "(88109, 3)" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "data": { "text/plain": [ "(37762, 3)" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "train_data, test_data = train_test_split(ratings, test_size = 0.30, random_state = random_state)\n", "display(train_data.shape, test_data.shape)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 68 }, "colab_type": "code", "id": "sCMsMQkPsV_h", "outputId": "b474be7c-9dca-45e7-99ea-0be6f8803ee3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique users in training dataframe 1540\n", "Number of unique users in test dataframe: 1540\n", "Number of products that aren't present in test dataframe: \n" ] } ], "source": [ "print('Number of unique users in training dataframe {}'.format(train_data['UserID'].nunique()))\n", "print('Number of unique users in test dataframe: {}'.format(test_data['UserID'].nunique()))\n", "print('Number of products that aren\\'t present in test dataframe: '.format(len(list(set(list(train_data['ProductID'].unique())) - set(list(test_data['ProductID'].unique()))))))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 68 }, "colab_type": "code", "id": "ODCeYMViyPoh", "outputId": "cbcb7305-d5dc-47fc-b8b0-001909ec87e1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique products in training dataframe 38184\n", "Number of unique products in test dataframe: 21323\n", "Number of products that aren't present in test dataframe: 26867\n" ] } ], "source": [ "print('Number of unique products in training dataframe {}'.format(train_data['ProductID'].nunique()))\n", "print('Number of unique products in test dataframe: {}'.format(test_data['ProductID'].nunique()))\n", "print('Number of products that aren\\'t present in test dataframe: {}'.format(len(list(set(list(train_data['ProductID'].unique())) - set(list(test_data['ProductID'].unique()))))))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NRtXT-41Ff-o" }, "source": [ "\n", "#### **Popularity based recommendations**\n", "* Create a class to make recommendation using popularity based method.\n", "* Get top 5 recommendations for couple of users, recommendations are based on the Rating means for the Product IDs. However will later explore other methods as well.\n", "* Comment on the findings." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "jLJCwseiwas2" }, "outputs": [], "source": [ "#Class for Popularity based Recommender System\n", "class popularity_recommender(): \n", " def __init__(self):\n", " self.trainSet = None\n", " self.userId = None\n", " self.productId = None\n", " self.popularityRecommendations = None\n", " self.topN = None\n", " def create(self, trainSet, userId, productId, topN):\n", " self.trainSet = trainSet\n", " self.userId = userId\n", " self.productId = productId\n", " self.topN = topN\n", "\n", " byRating = self.trainSet.groupby('ProductID', sort = False, as_index = False)['Rating'].mean().sort_values(by = 'Rating', ascending = False)\n", " byRating['RatingRank'] = byRating['Rating'].rank(ascending = False, method = 'first')\n", "\n", " byUsers = self.trainSet.groupby('ProductID', sort = False, as_index = False)['Rating'].count().sort_values(by = 'Rating', ascending = False)\n", " byUsers.columns = ['ProductID', 'RatingCount']\n", " \n", " byRatingUsers = pd.merge(byRating, byUsers, on = 'ProductID', how = 'left')\n", " byRatingUsers = byRatingUsers.sort_values(by = 'RatingRank', ascending = False)\n", "\n", " self.popularity_recommendations = byRating.head(self.topN)\n", " return byRatingUsers\n", "\n", " def recommend(self, user_id): \n", " user_recommendations = self.popularity_recommendations\n", " \n", " user_recommendations['UserID'] = user_id\n", " \n", " cols = user_recommendations.columns.tolist()\n", " cols = cols[-1:] + cols[:-1]\n", " user_recommendations = user_recommendations[cols]\n", " try:\n", " print('User has already rated products (from data in training set): {}'.format(self.trainSet.loc[(self.trainSet['UserID'] == user_id), 'ProductID'].nunique()))\n", " print('Top 5 products from what\\'s already being rated: {}'.format(list(self.trainSet[(self.trainSet['UserID'] == user_id)].sort_values(by = 'Rating', ascending = False).head(5)['ProductID'])))\n", " except:\n", " print('There\\'s no data for the selected user in training set')\n", " print('\\nTop 5 recommendations for the user based on popularity based method: {}'.format(list(user_recommendations['ProductID'])))\n", " return list(user_recommendations['ProductID'])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "RYd1BKrlM1eY", "outputId": "9bd27a80-609d-4b36-9e96-ddebd15d9b94" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Get list of unique user and product ids in testset\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "# Get list of unique user and product ids in testset\n", "print('Get list of unique user and product ids in testset'); print('--'*40)\n", "test_userids = sorted(list(test_data['UserID'].unique()))\n", "test_productids = sorted(list(test_data['ProductID'].unique()))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 323 }, "colab_type": "code", "id": "kBLGTrglMCax", "outputId": "884a7d19-12a1-4555-9006-dd9ffd89894f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Popularity recommendation is based on the mean of Ratings received and not Rating counts, later we will explore other methods as well.\n", "Get top - K ( K = 5) recommendations.\n", "Since our goal is to recommend new products to each user based on his/her habits, we will recommend 5 new products.\n", "--------------------------------------------------------------------------------\n", "\n", "Make recommendation for the user id selected from the testset = \"A11D1KHM7DVOQK\"\n", "User has already rated products (from data in training set): 77\n", "Top 5 products from what's already being rated: ['B0009H9PZU', 'B0006B486K', 'B00009W3DS', 'B0009E5YNA', 'B00005V54U']\n", "\n", "Top 5 recommendations for the user based on popularity based method: ['B0000645V0', 'B0011YR8KO', 'B00JE0Q95M', 'B004T0B8O4', 'B000VQU3N2']\n", "\n", "\n", "Make recommendation for the user id selected from the testset = \"A149RNR5RH19YY\"\n", "--------------------------------------------------------------------------------\n", "User has already rated products (from data in training set): 97\n", "Top 5 products from what's already being rated: ['B00000JBAM', 'B000WR0CKE', 'B000BTL0OA', 'B0015AM30Y', 'B0000DIET2']\n", "\n", "Top 5 recommendations for the user based on popularity based method: ['B0000645V0', 'B0011YR8KO', 'B00JE0Q95M', 'B004T0B8O4', 'B000VQU3N2']\n" ] } ], "source": [ "# Get top 5 recommendations\n", "print('Popularity recommendation is based on the mean of Ratings received and not Rating counts, later we will explore other methods as well.')\n", "print('Get top - K ( K = 5) recommendations.')\n", "print('Since our goal is to recommend new products to each user based on his/her habits, we will recommend 5 new products.'); print('--'*40)\n", "compare_dict = {}; result = {}\n", "popularity = popularity_recommender()\n", "byRatingUsers = popularity.create(train_data, 'UserID', 'ProductID', 5)\n", "\n", "print('\\nMake recommendation for the user id selected from the testset = \"A11D1KHM7DVOQK\"')\n", "user_id = \"A11D1KHM7DVOQK\"\n", "result[user_id] = popularity.recommend(user_id)\n", "\n", "print('\\n\\nMake recommendation for the user id selected from the testset = \"A149RNR5RH19YY\"'); print('--'*40)\n", "user_id = \"A149RNR5RH19YY\"\n", "result[user_id] = popularity.recommend(user_id)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "W46ph2KV-qwY", "outputId": "138389fe-cd70-4452-a924-f9f5dc2953a0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Store the recommendations in a dictionary\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "print('Store the recommendations in a dictionary'); print('--'*40)\n", "compare_dict['PopularityRec'] = result" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "O4Fx3cAJ3B9K", "outputId": "71142a22-342a-4097-94c3-1bd366c1160f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluating Popularity based Recommender\n", "Creating a new dataframe with mean rating for each product in test dataframe and using our prediction dataframe i.e. byRatingUsers to calculate RMSE\n", "--------------------------------------------------------------------------------\n", "Shape of test mean dataframe: (21323, 3)\n", "Shape of predicted (recommender) dataframe: (38184, 4)\n", "--------------------------------------------------------------------------------\n", "RMSE OF THE POPULARITY BASED RECOMMENDER: 3.0894\n" ] } ], "source": [ "print('Evaluating Popularity based Recommender')\n", "print('Creating a new dataframe with mean rating for each product in test dataframe and using our prediction dataframe i.e. byRatingUsers to calculate RMSE'); print('--'*40)\n", "test_means = test_data.groupby('ProductID', sort = False, as_index = False)['Rating'].mean().sort_values(by = 'Rating', ascending = False)\n", "test_means = test_means.merge(byRatingUsers, on = 'ProductID', how = 'left', suffixes=('_act', '_pred')).drop(['RatingRank', 'RatingCount'], axis = 1).fillna(0)\n", "print('Shape of test mean dataframe: {}'.format(test_means.shape))\n", "print('Shape of predicted (recommender) dataframe: {}'.format(byRatingUsers.shape))\n", "\n", "RMSE_pop = sqrt(mean_squared_error(test_means['Rating_act'], test_means['Rating_pred']))\n", "print('--' * 40)\n", "print('RMSE OF THE POPULARITY BASED RECOMMENDER: {}'.format(round(RMSE_pop, 4)))" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "xU5FvPDG_Mpn", "outputId": "c4f713cb-1392-49c5-ed79-c9e7a9d0a480" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Recommendations based on mean of Rating, which is the method used above\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "['B0000645V0', 'B0011YR8KO', 'B00JE0Q95M', 'B004T0B8O4', 'B000VQU3N2']" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Recommendations based on count of Rating\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "['B0088CJT4U', 'B003ES5ZUU', 'B000N99BBC', 'B007WTAJTO', 'B00829TIEK']" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Recommendations based on a mix of mean and count of Rating\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/plain": [ "['B00IVFDZBC', 'B002NEGTTW', 'B000F7QRTG', 'B001ENW61I', 'B000FQ2JLW']" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Recommendations based on mean of Rating, which is the method used above'); print('--'*40)\n", "display(byRatingUsers.sort_values(by = 'RatingRank', ascending = True).head(5)['ProductID'].tolist())\n", "\n", "print('\\nRecommendations based on count of Rating'); print('--'*40)\n", "display(byRatingUsers.sort_values(by = 'RatingCount', ascending = False).head(5)['ProductID'].tolist())\n", "\n", "print('\\nRecommendations based on a mix of mean and count of Rating'); print('--'*40)\n", "display(byRatingUsers.sort_values(by = ['Rating', 'RatingCount'], ascending = False).head(5)['ProductID'].tolist())" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 763 }, "colab_type": "code", "id": "Ee06Eme6-4LK", "outputId": "58e533e5-4d59-46f5-ebb7-40a1676d945e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Plot of average ratings versus number of ratings\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "image/png": "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\nYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Plot of average ratings versus number of ratings'); print('--'*40)\n", "g = sns.jointplot(x = 'Rating', y = 'RatingCount', data = byRatingUsers, alpha = 0.4, height = 10)\n", "\n", "del g, byRatingUsers, popularity_recommender, user_id" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "FW_HpdwTDPD0" }, "source": [ "\n", "##### Observation 4 - Popularity Based Recommendation\n", "* For popularity recommendation system, we recommended products based on *mean of Ratings* given by users. We saw that the top 5 products which we recommended to users are those where only 1 user from the training set has rated.\n", "* Then we also explored other methods for popularity recommendations. Those were based on:\n", " * *Count of Ratings* received for the product\n", " * *Hybrid method* for popularity recommendation where in we used both mean and count of rating to decide on the product recommended\n", "* For all of the above cases (recommendations based on mean, count, and mean and count), popularity based method lacks personalization i.e. same recommendations for all users. However, using Popularity based recommendation system it would easier to recommend products to a new user w/o having knowledge about who the users are or what their preferences are and recommending them the products that are in-trend.\n", "* **RMSE of the popularity based recommendation method using mean of rating is 3.0894.**" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "3inD5WG-vKQ8" }, "source": [ "\n", "#### **Collaborative Filtering**\n", "Objective is to build a recommendation system to recommend products to customers based on their previous ratings for other products i.e. item-based collaborative filtering.\n", "\n", "**\"You tend to like that item because you've liked those items.\"**\n", "\n", "whereas as we know that in user-based it's \"You may like it because your friends liked it\".\n", "\n", " * Model-based Collaborative Filtering: Singular Value Decomposition and evaluate k-NN based algos.\n", " * Use the filtered ratings dataframe and scipy based SVD to evaluate Item-based collaborative filtering method for suggesting products based to users based on what he has liked in past.\n", " * Also explore user based collaborative filtering.\n", "\n", "* Comment on the findings.\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "5R53smxEhOaM" }, "source": [ "\n", "##### **Model based Collaborative Filtering: SVD**" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 318 }, "colab_type": "code", "id": "77OJwT4u5PIL", "outputId": "17e4b821-a0d5-43dd-8463-c03ecb3f3ee3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Matrix with one row per 'Product' and one column per 'User' for Item-based collaborative filtering\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ProductID059445164705944818130970407998097268327514005014661400501520140050177614005326201400532655140053271X...B00L5YZCCGB00L8I6SFYB00L8QCVL6B00LA6T0LSB00LBZ1Z7KB00LED02VYB00LGN7Y3GB00LGQ6HL8B00LI4ZZO8B00LKG1MC8
UserID
A100UD67AHFODS0.000.000.000.000.000.000.000.000.000.00...0.000.000.000.000.000.000.000.000.000.00
A100WO06OQR8BQ0.000.000.000.000.000.000.000.000.000.00...0.000.000.000.000.000.000.000.000.000.00
A105S56ODHGJEK0.000.000.000.000.000.000.000.000.000.00...0.000.000.000.000.000.000.000.000.000.00
A105TOJ6LTVMBG0.000.000.000.000.000.000.000.000.000.00...0.000.000.000.000.000.000.000.000.000.00
A10AFVU66A79Y10.000.000.000.000.000.000.000.000.000.00...0.000.000.000.000.000.000.000.000.000.00
\n", "

5 rows × 48190 columns

\n", "
" ], "text/plain": [ "ProductID 0594451647 0594481813 0970407998 0972683275 1400501466 \\\n", "UserID \n", "A100UD67AHFODS 0.00 0.00 0.00 0.00 0.00 \n", "A100WO06OQR8BQ 0.00 0.00 0.00 0.00 0.00 \n", "A105S56ODHGJEK 0.00 0.00 0.00 0.00 0.00 \n", "A105TOJ6LTVMBG 0.00 0.00 0.00 0.00 0.00 \n", "A10AFVU66A79Y1 0.00 0.00 0.00 0.00 0.00 \n", "\n", "ProductID 1400501520 1400501776 1400532620 1400532655 140053271X \\\n", "UserID \n", "A100UD67AHFODS 0.00 0.00 0.00 0.00 0.00 \n", "A100WO06OQR8BQ 0.00 0.00 0.00 0.00 0.00 \n", "A105S56ODHGJEK 0.00 0.00 0.00 0.00 0.00 \n", "A105TOJ6LTVMBG 0.00 0.00 0.00 0.00 0.00 \n", "A10AFVU66A79Y1 0.00 0.00 0.00 0.00 0.00 \n", "\n", "ProductID ... B00L5YZCCG B00L8I6SFY B00L8QCVL6 B00LA6T0LS \\\n", "UserID ... \n", "A100UD67AHFODS ... 0.00 0.00 0.00 0.00 \n", "A100WO06OQR8BQ ... 0.00 0.00 0.00 0.00 \n", "A105S56ODHGJEK ... 0.00 0.00 0.00 0.00 \n", "A105TOJ6LTVMBG ... 0.00 0.00 0.00 0.00 \n", "A10AFVU66A79Y1 ... 0.00 0.00 0.00 0.00 \n", "\n", "ProductID B00LBZ1Z7K B00LED02VY B00LGN7Y3G B00LGQ6HL8 B00LI4ZZO8 \\\n", "UserID \n", "A100UD67AHFODS 0.00 0.00 0.00 0.00 0.00 \n", "A100WO06OQR8BQ 0.00 0.00 0.00 0.00 0.00 \n", "A105S56ODHGJEK 0.00 0.00 0.00 0.00 0.00 \n", "A105TOJ6LTVMBG 0.00 0.00 0.00 0.00 0.00 \n", "A10AFVU66A79Y1 0.00 0.00 0.00 0.00 0.00 \n", "\n", "ProductID B00LKG1MC8 \n", "UserID \n", "A100UD67AHFODS 0.00 \n", "A100WO06OQR8BQ 0.00 \n", "A105S56ODHGJEK 0.00 \n", "A105TOJ6LTVMBG 0.00 \n", "A10AFVU66A79Y1 0.00 \n", "\n", "[5 rows x 48190 columns]" ] }, "execution_count": 36, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Item-based Collaborative Filtering\n", "print('Matrix with one row per \\'Product\\' and one column per \\'User\\' for Item-based collaborative filtering'); print('--'*40)\n", "ratings_item = ratings.pivot(index = 'UserID', columns = 'ProductID', values = 'Rating').fillna(0)\n", "ratings_item.head()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 119 }, "colab_type": "code", "id": "EiL1FZ3h1YuD", "outputId": "8621c74b-ebe3-407f-bca8-ab3db5eda1a3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Calculate the density of the ratings matrix\n", "--------------------------------------------------------------------------------\n", "Shape of ratings matrix: (1540, 48190)\n", "given_num_of_ratings = 125871\n", "possible_num_of_ratings = 74212600\n", "density: 0.17%\n" ] } ], "source": [ "# Calculate the density of the rating matrix\n", "print('Calculate the density of the ratings matrix'); print('--'*40)\n", "\n", "print('Shape of ratings matrix: ', ratings_item.shape)\n", "\n", "given_num_of_ratings = np.count_nonzero(ratings_item)\n", "print('given_num_of_ratings = ', given_num_of_ratings)\n", "\n", "possible_num_of_ratings = ratings_item.shape[0] * ratings_item.shape[1]\n", "print('possible_num_of_ratings = ', possible_num_of_ratings)\n", "\n", "density = (given_num_of_ratings/possible_num_of_ratings)\n", "density *= 100\n", "print ('density: {:4.2f}%'.format(density))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 284 }, "colab_type": "code", "id": "4Wh0xziSAq7Q", "outputId": "d41248c5-7059-4ba1-b52d-b84fe2244376" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ProductID059445164705944818130970407998097268327514005014661400501520140050177614005326201400532655140053271X...B00L5YZCCGB00L8I6SFYB00L8QCVL6B00LA6T0LSB00LBZ1Z7KB00LED02VYB00LGN7Y3GB00LGQ6HL8B00LI4ZZO8B00LKG1MC8
UserID
A100UD67AHFODS0.000.000.000.010.000.000.010.000.010.00...0.000.040.000.06-0.000.010.000.130.060.02
A100WO06OQR8BQ0.000.000.010.020.010.000.010.00-0.000.00...0.000.030.000.00-0.00-0.000.00-0.04-0.010.00
A105S56ODHGJEK-0.00-0.000.000.020.01-0.000.010.00-0.01-0.00...-0.000.01-0.00-0.020.02-0.00-0.00-0.00-0.01-0.00
A105TOJ6LTVMBG0.000.000.000.010.000.000.000.000.010.00...0.00-0.000.00-0.00-0.000.000.00-0.02-0.010.00
A10AFVU66A79Y10.000.000.000.010.000.000.010.00-0.000.00...0.00-0.00-0.00-0.030.00-0.000.00-0.05-0.02-0.00
\n", "

5 rows × 48190 columns

\n", "
" ], "text/plain": [ "ProductID 0594451647 0594481813 0970407998 0972683275 1400501466 \\\n", "UserID \n", "A100UD67AHFODS 0.00 0.00 0.00 0.01 0.00 \n", "A100WO06OQR8BQ 0.00 0.00 0.01 0.02 0.01 \n", "A105S56ODHGJEK -0.00 -0.00 0.00 0.02 0.01 \n", "A105TOJ6LTVMBG 0.00 0.00 0.00 0.01 0.00 \n", "A10AFVU66A79Y1 0.00 0.00 0.00 0.01 0.00 \n", "\n", "ProductID 1400501520 1400501776 1400532620 1400532655 140053271X \\\n", "UserID \n", "A100UD67AHFODS 0.00 0.01 0.00 0.01 0.00 \n", "A100WO06OQR8BQ 0.00 0.01 0.00 -0.00 0.00 \n", "A105S56ODHGJEK -0.00 0.01 0.00 -0.01 -0.00 \n", "A105TOJ6LTVMBG 0.00 0.00 0.00 0.01 0.00 \n", "A10AFVU66A79Y1 0.00 0.01 0.00 -0.00 0.00 \n", "\n", "ProductID ... B00L5YZCCG B00L8I6SFY B00L8QCVL6 B00LA6T0LS \\\n", "UserID ... \n", "A100UD67AHFODS ... 0.00 0.04 0.00 0.06 \n", "A100WO06OQR8BQ ... 0.00 0.03 0.00 0.00 \n", "A105S56ODHGJEK ... -0.00 0.01 -0.00 -0.02 \n", "A105TOJ6LTVMBG ... 0.00 -0.00 0.00 -0.00 \n", "A10AFVU66A79Y1 ... 0.00 -0.00 -0.00 -0.03 \n", "\n", "ProductID B00LBZ1Z7K B00LED02VY B00LGN7Y3G B00LGQ6HL8 B00LI4ZZO8 \\\n", "UserID \n", "A100UD67AHFODS -0.00 0.01 0.00 0.13 0.06 \n", "A100WO06OQR8BQ -0.00 -0.00 0.00 -0.04 -0.01 \n", "A105S56ODHGJEK 0.02 -0.00 -0.00 -0.00 -0.01 \n", "A105TOJ6LTVMBG -0.00 0.00 0.00 -0.02 -0.01 \n", "A10AFVU66A79Y1 0.00 -0.00 0.00 -0.05 -0.02 \n", "\n", "ProductID B00LKG1MC8 \n", "UserID \n", "A100UD67AHFODS 0.02 \n", "A100WO06OQR8BQ 0.00 \n", "A105S56ODHGJEK -0.00 \n", "A105TOJ6LTVMBG 0.00 \n", "A10AFVU66A79Y1 -0.00 \n", "\n", "[5 rows x 48190 columns]" ] }, "execution_count": 38, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Singular Value Decomposition\n", "U, sigma, Vt = svds(ratings_item, k = 10)\n", "sigma = np.diag(sigma)\n", "\n", "all_user_predicted_ratings = np.dot(np.dot(U, sigma), Vt)\n", "preds_df = pd.DataFrame(all_user_predicted_ratings, columns = ratings_item.columns, index = ratings_item.index) #predicted ratings\n", "preds_df.head()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "vzuT6NbRBFbJ", "outputId": "81de18d5-9745-4c00-ad37-041749aadd86" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creating a function to recommend products with highest predicted ratings\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "# Recommend products with highest predicted ratings\n", "print('Creating a function to recommend products with highest predicted ratings'); print('--'*40)\n", "def recommend_items(user_id, ratings_item, preds_df, num_recommendations = 5):\n", " try:\n", " print('User has already rated products (from data in training set): {}'.format(train_data.loc[(train_data['UserID'] == user_id), 'ProductID'].nunique()))\n", " print('Top 5 products from what\\'s already being rated: {}'.format(list(train_data[(train_data['UserID'] == user_id)].sort_values(by = 'Rating', ascending = False).head(5)['ProductID'])))\n", " except:\n", " print('There\\'s no data for the selected user in training set')\n", " sorted_user_ratings = ratings_item.loc[user_id].sort_values(ascending = False)\n", " \n", " sorted_user_predictions = preds_df.loc[user_id].sort_values(ascending = False)\n", " temp = pd.concat([sorted_user_ratings, sorted_user_predictions], axis = 1)\n", " temp.index.name = 'Recommended Items'\n", " temp.columns = ['user_ratings', 'user_predictions']\n", " \n", " temp = temp.loc[temp.user_ratings == 0]\n", " temp = temp.sort_values('user_predictions', ascending = False)\n", " print('\\nTop 5 recommendations for the user based on item-based collaborative filtering method')\n", " display(temp.head(num_recommendations))\n", " return temp.head(num_recommendations).index.tolist()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 725 }, "colab_type": "code", "id": "a0JDWw4UNJc-", "outputId": "a47d562a-782a-41e2-eb84-afaa1cfddf49" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Get top - K ( K = 5) recommendations.\n", "Since our goal is to recommend new products to each user based on his/her habits, we will recommend 5 new products.\n", "--------------------------------------------------------------------------------\n", "\n", "Make recommendation for the user id selected from the testset = \"A11D1KHM7DVOQK\"\n", "User has already rated products (from data in training set): 77\n", "Top 5 products from what's already being rated: ['B0009H9PZU', 'B0006B486K', 'B00009W3DS', 'B0009E5YNA', 'B00005V54U']\n", "\n", "Top 5 recommendations for the user based on item-based collaborative filtering method\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_ratingsuser_predictions
Recommended Items
B007WTAJTO0.000.07
B005CT56F80.000.06
B00829THK00.000.06
B003ZSHNGS0.000.06
B00825BZUY0.000.06
\n", "
" ], "text/plain": [ " user_ratings user_predictions\n", "Recommended Items \n", "B007WTAJTO 0.00 0.07\n", "B005CT56F8 0.00 0.06\n", "B00829THK0 0.00 0.06\n", "B003ZSHNGS 0.00 0.06\n", "B00825BZUY 0.00 0.06" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Make recommendation for the user id selected from the testset = \"A149RNR5RH19YY\"\n", "User has already rated products (from data in training set): 97\n", "Top 5 products from what's already being rated: ['B00000JBAM', 'B000WR0CKE', 'B000BTL0OA', 'B0015AM30Y', 'B0000DIET2']\n", "\n", "Top 5 recommendations for the user based on item-based collaborative filtering method\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_ratingsuser_predictions
Recommended Items
B00829THK00.000.33
B007WTAJTO0.000.32
B00829TIEK0.000.28
B002R5AM7C0.000.27
B003ES5ZUU0.000.27
\n", "
" ], "text/plain": [ " user_ratings user_predictions\n", "Recommended Items \n", "B00829THK0 0.00 0.33\n", "B007WTAJTO 0.00 0.32\n", "B00829TIEK 0.00 0.28\n", "B002R5AM7C 0.00 0.27\n", "B003ES5ZUU 0.00 0.27" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Get top - K ( K = 5) recommendations.')\n", "print('Since our goal is to recommend new products to each user based on his/her habits, we will recommend 5 new products.'); print('--'*40)\n", "result = {}\n", "\n", "user_id = \"A11D1KHM7DVOQK\"\n", "print(f'\\nMake recommendation for the user id selected from the testset = \"{user_id}\"')\n", "result[user_id] = recommend_items(user_id, ratings_item, preds_df)\n", "\n", "user_id = \"A149RNR5RH19YY\"\n", "print(f'\\n\\nMake recommendation for the user id selected from the testset = \"{user_id}\"')\n", "result[user_id] = recommend_items(user_id, ratings_item, preds_df)" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "AxZuIi1SSSSE" }, "outputs": [], "source": [ "compare_dict['SVD Item-based Collaborative Filtering'] = result" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 68 }, "colab_type": "code", "id": "jB1N0mhfSvQw", "outputId": "8294eaa3-656a-4c15-c89f-c9f1449608b9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluating SVD for Item-based Collaborative Filtering\n", "------------------------------------------------------------------------------------------------------------------------\n", "RMSE OF ITEM BASED COLLABORATIVE FILTERING USING MATRIX FACTORIZATION METHOD (SVD): 0.0033\n" ] } ], "source": [ "print('Evaluating SVD for Item-based Collaborative Filtering'); print('--'*60)\n", "rmse_df = pd.concat([ratings_item.mean(), preds_df.mean()], axis = 1)\n", "rmse_df.columns = ['Avg_actual_ratings', 'Avg_predicted_ratings']\n", "RMSE = round((((rmse_df['Avg_actual_ratings'] - rmse_df['Avg_predicted_ratings']) ** 2).mean() ** 0.5), 4)\n", "print('RMSE OF ITEM BASED COLLABORATIVE FILTERING USING MATRIX FACTORIZATION METHOD (SVD): {}'.format(RMSE))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "tKNTAkffSnLF" }, "source": [ "\n", "###### Observation 5 - Item Based Collaborative Filtering -- SVD\n", "* Above we evaluated SVD for item-based collaborative filtering and it can be seen that the RMSE of SVD model 0.0033." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "96z6wYFIUcXD" }, "outputs": [], "source": [ "del (RMSE, U, sigma, Vt, all_user_predicted_ratings, given_num_of_ratings, possible_num_of_ratings, result, rmse_df, \n", " density, preds_df, recommend_items, user_id)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-Q1aSV8rcLGS" }, "source": [ "\n", "##### **Product Similarity based on Sklearn Nearest Neighbor**" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 170 }, "colab_type": "code", "id": "hcHCsjYwOqRR", "outputId": "d9fb434a-62c0-4a9e-b3fe-59440052e4fd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Product similarity based on Sklearn Nearest Neighbor\n", "--------------------------------------------------------------------------------\n", "Recommendations for B008R79VMQ:\n", "\n", "1: B0017S37IG, with distance of 0.3845425451033364:\n", "2: B003VVYL46, with distance of 0.3845425451033364:\n", "3: B0016VA4L2, with distance of 0.3845425451033364:\n", "4: B0014KO1M8, with distance of 0.3845425451033364:\n", "5: B007UE2SPE, with distance of 0.3845425451033364:\n" ] } ], "source": [ "print('Product similarity based on Sklearn Nearest Neighbor'); print('--'*40)\n", "k = 5\n", "df_knn = ratings.pivot(index = 'ProductID', columns = 'UserID', values = 'Rating').fillna(0)\n", "df_knn_matrix = csr_matrix(df_knn.values)\n", "\n", "model_knn = NearestNeighbors(metric = 'cosine', algorithm = 'brute', n_neighbors = k)\n", "model_knn.fit(df_knn_matrix)\n", "\n", "query_item = np.random.choice(df_knn.shape[0])\n", "query_user = np.random.choice(df_knn.shape[1])\n", "distances, indices = model_knn.kneighbors(df_knn.iloc[query_item, :].values.reshape(1, -1), n_neighbors = k+1)\n", "\n", "for i in range(0, len(distances.flatten())):\n", " if i == 0:\n", " print('Recommendations for {0}:\\n'.format(df_knn.index[query_item]))\n", " else:\n", " print('{0}: {1}, with distance of {2}:'.format(i, df_knn.index[indices.flatten()[i]], distances.flatten()[i]))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "T4JzgxdNhbhW" }, "source": [ "\n", "##### **Model based Collaborative Filtering: k-NN**" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 119 }, "colab_type": "code", "id": "kCqfrsSaLWR-", "outputId": "4e0dd5dd-54f4-427f-8bb3-3121e672b978" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Further reducing the number of users\n", "Earlier we had considered users those who rated >=50 products, now to avoid memory issues let's take users those who've rated >100 products\n", "--------------------------------------------------------------------------------\n", "Number of rows 43309 and number of columns 6 in filtered dataframe\n", "Number of unique USERS in further filtered ratings dataframe = 280\n", "Number of unique PRODUCTS in further filteredratings dataframe = 22267\n" ] } ], "source": [ "print('Further reducing the number of users'); \n", "print('Earlier we had considered users those who rated >=50 products, now to avoid memory issues let\\'s take users those who\\'ve rated >100 products')\n", "print('--'*40)\n", "\n", "ratings_df = ratings_df[ratings_df['UserIDCounts'] > 100]\n", "print(f'Number of rows {ratings_df.shape[0]} and number of columns {ratings_df.shape[1]} in filtered dataframe')\n", "print('Number of unique USERS in further filtered ratings dataframe = ', ratings_df['UserID'].nunique())\n", "print('Number of unique PRODUCTS in further filteredratings dataframe = ', ratings_df['ProductID'].nunique())\n", "\n", "ratings = ratings_df[['UserID', 'ProductID', 'Rating']]" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "K9Q1PIrmNEN5", "outputId": "cf399b18-214b-4330-db72-9efdf687f58c" }, "outputs": [ { "data": { "text/plain": [ "101" ] }, "execution_count": 46, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "ratings['UserID'].value_counts().min()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "9MKQoZ8QHwkg", "outputId": "2da238a0-060d-402a-b923-34ec9bbc33bb" }, "outputs": [ { "data": { "text/plain": [ "(30316, 3)" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "data": { "text/plain": [ "(12993, 3)" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "train_data, test_data = train_test_split(ratings, test_size = 0.30, random_state = random_state)\n", "display(train_data.shape, test_data.shape)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "OiXY870BHBDH", "outputId": "e4bb28ef-cc7a-4e8b-f1e8-baf611b74d1e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Getting the trainset and testset ready for recommender to be used\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "print('Getting the trainset and testset ready for recommender to be used'); print('--'*40)\n", "reader = Reader(rating_scale = (0, 5))\n", "data = Dataset.load_from_df(ratings[['UserID', 'ProductID', 'Rating']], reader)\n", "trainset = Dataset.load_from_df(train_data[['UserID', 'ProductID', 'Rating']], reader); \n", "testset = Dataset.load_from_df(test_data[['UserID', 'ProductID', 'Rating']], reader); " ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "HsKmGBhQNZfQ", "outputId": "64f66c28-d537-4024-ffd3-2fca9211118b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS\n", "Grid Search across parameter grid to find best parameters using KNNBasic algorithm\n", "--------------------------------------------------------------------------------\n", "1.0315383659842756\n", "{'k': 5, 'sim_options': {'name': 'pearson_baseline', 'user_based': False}, 'verbose': False}\n", "CPU times: user 2min 12s, sys: 6.22 s, total: 2min 18s\n", "Wall time: 2min 18s\n" ] } ], "source": [ "%%time\n", "print('ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS')\n", "print('Grid Search across parameter grid to find best parameters using KNNBasic algorithm'); print('--'*40)\n", "param_grid_KNNBasic = {'k': [3, 5, 10], 'sim_options': {'name': ['pearson_baseline', 'cosine'], 'user_based': [False]}, 'verbose': [False]}\n", "\n", "gs_KNNBasic = GridSearchCV(KNNBasic, param_grid_KNNBasic, measures = ['rmse', 'mae'], cv = 3)\n", "gs_KNNBasic.fit(trainset)\n", "print(gs_KNNBasic.best_score['rmse'])\n", "print(gs_KNNBasic.best_params['rmse'])" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "xZtTE3EUNvva", "outputId": "a11ed541-6e30-46f6-8a24-81a4829c38d9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS\n", "Grid Search across parameter grid to find best parameters using KNNWithMeans algorithm\n", "--------------------------------------------------------------------------------\n", "1.079754480905722\n", "{'k': 10, 'sim_options': {'name': 'cosine', 'user_based': False}, 'verbose': False}\n", "CPU times: user 2min 16s, sys: 1.2 s, total: 2min 18s\n", "Wall time: 2min 17s\n" ] } ], "source": [ "%%time\n", "print('ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS')\n", "print('Grid Search across parameter grid to find best parameters using KNNWithMeans algorithm'); print('--'*40)\n", "param_grid_KNNWithMeans = {'k': [3, 5, 10], 'sim_options': {'name': ['pearson_baseline', 'cosine'], 'user_based': [False]}, 'verbose': [False]}\n", "\n", "gs_KNNWithMeans = GridSearchCV(KNNWithMeans, param_grid_KNNWithMeans, measures = ['rmse', 'mae'], cv = 3)\n", "gs_KNNWithMeans.fit(trainset)\n", "print(gs_KNNWithMeans.best_score['rmse'])\n", "print(gs_KNNWithMeans.best_params['rmse'])" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "Oca5lzxGRCZB", "outputId": "65ec2148-3091-4ff0-d21f-842430381199" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS\n", "Grid Search across parameter grid to find best parameters using KNNWithZScore algorithm\n", "--------------------------------------------------------------------------------\n", "1.0836895583873687\n", "{'k': 10, 'sim_options': {'name': 'pearson_baseline', 'user_based': False}, 'verbose': False}\n", "CPU times: user 2min 34s, sys: 1.2 s, total: 2min 35s\n", "Wall time: 2min 35s\n" ] } ], "source": [ "%%time\n", "print('ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS')\n", "print('Grid Search across parameter grid to find best parameters using KNNWithZScore algorithm'); print('--'*40)\n", "param_grid_KNNWithZScore = {'k': [3, 5, 10], 'sim_options': {'name': ['pearson_baseline', 'cosine'], 'user_based': [False]}, 'verbose': [False]}\n", "\n", "gs_KNNWithZScore = GridSearchCV(KNNWithZScore, param_grid_KNNWithZScore, measures = ['rmse', 'mae'], cv = 3)\n", "gs_KNNWithZScore.fit(trainset)\n", "print(gs_KNNWithZScore.best_score['rmse'])\n", "print(gs_KNNWithZScore.best_params['rmse'])" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "SCbCP8PNRKVi", "outputId": "60a9f8dc-1f63-4f11-8711-6703f6abba0d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS\n", "Grid Search across parameter grid to find best parameters using KNNBaseline algorithm\n", "--------------------------------------------------------------------------------\n", "0.9655170623803802\n", "{'bsl_options': {'method': 'als', 'reg': 1}, 'k': 5, 'sim_options': {'name': 'pearson_baseline', 'user_based': False}, 'verbose': False}\n", "CPU times: user 8min 58s, sys: 4.71 s, total: 9min 3s\n", "Wall time: 9min 1s\n" ] } ], "source": [ "%%time\n", "print('ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS')\n", "print('Grid Search across parameter grid to find best parameters using KNNBaseline algorithm'); print('--'*40)\n", "param_grid_KNNBaseline = {'bsl_options': {'method': ['als', 'sgd'], 'reg': [1, 2]}, 'k': [2, 3, 5], \n", " 'sim_options': {'name': ['pearson_baseline', 'cosine'], 'user_based': [False]},\n", " 'verbose': [False]}\n", "\n", "gs_KNNBaseline = GridSearchCV(KNNBaseline, param_grid_KNNBaseline, measures = ['rmse', 'mae'], cv = 3)\n", "gs_KNNBaseline.fit(trainset)\n", "print(gs_KNNBaseline.best_score['rmse'])\n", "print(gs_KNNBaseline.best_params['rmse'])" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "brWQ7c0MRZ7x", "outputId": "e02326a5-17c0-4074-caa0-cb999458d1af" }, "outputs": [ { "data": { "text/plain": [ "24" ] }, "execution_count": 53, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "del param_grid_KNNBasic, param_grid_KNNWithMeans, param_grid_KNNWithZScore, gs_KNNBasic, gs_KNNWithMeans, gs_KNNWithZScore\n", "gc.collect()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Q1aVYciIRuuz" }, "source": [ "\n", "###### Observation 6 - Algorithm choosen for Model based (Item) Collaborative Filtering using k-NN inspired method\n", "* Above we evaluated different k-NN inspired algorithms for item-based collaborative filtering. It can be seen that KNNBaseline algorithm gives the lowest RMSE of ~0.966.\n", "* k-fold cross-validate KNNBaseline algorithm using the best parameters, to see if there's any improvement in the RMSE." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 170 }, "colab_type": "code", "id": "shrkEnq_RrWz", "outputId": "f4c21471-53dd-457f-9f70-003cc140c8bd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS\n", "2-Fold cross validation using KNNBaseline and with best parameters identified during grid search\n", "--------------------------------------------------------------------------------\n", "RMSE: 0.9638\n", "RMSE: 0.9672\n", "--------------------------------------------------------------------------------\n", "RMSE OF ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGORITHM AND 2-FOLD CROSS VALIDATION 0.9655\n", "CPU times: user 18.6 s, sys: 4.82 s, total: 23.4 s\n", "Wall time: 34.1 s\n" ] } ], "source": [ "%%time\n", "print('ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS')\n", "print('2-Fold cross validation using KNNBaseline and with best parameters identified during grid search'); print('--'*40)\n", "kf = KFold(n_splits = 2)\n", "algo = KNNBaseline(**gs_KNNBaseline.best_params['rmse'])\n", "rmse_scores = []\n", "\n", "for train_, test_ in kf.split(data):\n", " algo.fit(train_)\n", " predictions = algo.test(test_)\n", " rmse = round(accuracy.rmse(predictions, verbose = True), 4)\n", " rmse_scores.append(rmse)\n", "\n", " dump.dump('./dump_KNNBaseline_Item', predictions, algo)\n", "\n", "print('--'*40)\n", "print(f'RMSE OF ITEM BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGORITHM AND 2-FOLD CROSS VALIDATION {round(np.mean(rmse_scores), 4)}')" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "kQZjkIcXSBiD", "outputId": "c04e9b34-4ae7-461b-f329-548d008fcf81" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UserIDProductIDActualRatingEstRatingDetailsError
11142A2HRHF83I3NDGTB005EOWBHC5.005.00{'actual_k': 1, 'was_impossible': False}0.00
13565A2IFGGXG3YV3Y6B003ES5ZUU5.005.00{'actual_k': 2, 'was_impossible': False}0.00
13620A1G650TTTHEAL5B00ENZRS765.005.00{'actual_k': 5, 'was_impossible': False}0.00
13777A2B7BUH8834Y6MB004CLYEFK5.005.00{'actual_k': 1, 'was_impossible': False}0.00
359A3V5F050GVZ56QB00F6E4HXG5.005.00{'actual_k': 2, 'was_impossible': False}0.00
\n", "
" ], "text/plain": [ " UserID ProductID ActualRating EstRating \\\n", "11142 A2HRHF83I3NDGT B005EOWBHC 5.00 5.00 \n", "13565 A2IFGGXG3YV3Y6 B003ES5ZUU 5.00 5.00 \n", "13620 A1G650TTTHEAL5 B00ENZRS76 5.00 5.00 \n", "13777 A2B7BUH8834Y6M B004CLYEFK 5.00 5.00 \n", "359 A3V5F050GVZ56Q B00F6E4HXG 5.00 5.00 \n", "\n", " Details Error \n", "11142 {'actual_k': 1, 'was_impossible': False} 0.00 \n", "13565 {'actual_k': 2, 'was_impossible': False} 0.00 \n", "13620 {'actual_k': 5, 'was_impossible': False} 0.00 \n", "13777 {'actual_k': 1, 'was_impossible': False} 0.00 \n", "359 {'actual_k': 2, 'was_impossible': False} 0.00 " ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "predictions, algo = dump.load('./dump_KNNBaseline_Item')\n", "df_user = pd.DataFrame(predictions, columns = ['UserID', 'ProductID', 'ActualRating', 'EstRating', 'Details'])\n", "df_user['Error'] = abs(df_user['EstRating'] - df_user['ActualRating'])\n", "df_user.sort_values('Error', inplace = True, ascending = True)\n", "\n", "display(df_user.head())" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 522 }, "colab_type": "code", "id": "blAI8Vv_SC-l", "outputId": "f38dfd8c-4697-440d-f24e-27e7184b5324" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Actual vs Prediction Comparison\n", "--------------------------------------------------------------------------------\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+4AAAHXCAYAAAAiDgDyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de5hdZXk3/u9NIgFEApRqUUC0Rqyt\nbeUFJBAOSjl4KFhrxYqCFqVV2x+tfT1Wi1pt7VHUoq0VqljUKqikFmsBpchbQbQiggiTcihBNJZD\nIALBkOf3x16JmzETMsnM7JXM53Nd+5q9nnW615o1ge9+1np2tdYCAAAA9NNWoy4AAAAAmJjgDgAA\nAD0muAMAAECPCe4AAADQY4I7AAAA9JjgDgAAAD0muAOwRaqqQ6uqVdUuo65lulTVVVX11qHpG6vq\n/27iNi+qqr/d5OJmMecQgKkmuAOwSapq76p6oKr+30as+9aqumo66hqFqvpw92FBq6ofVdX1VfVX\nVfXwGSph3yTv35AFq+qlVbViHbOel+SNU1rVxDX8clX9c1V9r6pWVtWS7hw+ZSb2P41m7BwCMDsI\n7gBsqpdnEBZ/oap+btTF9MAFSXZN8vgkb07yqiR/NdHCVfWwqdpxa+0HrbV7NnEbt7fW7p6qmiZS\nVc9JclmS7ZO8JMmTkrwwya1J3jXd+58OVbV1MnPnEIDZQ3AHYKNV1bZJXpTkg0nOTnLiOpZ5dFWd\nVVW3VdU9VXVFVT29ql6a5JQkPz/US/3Sbp1WVc8ft50H3QZeVa+pqiur6odVdUtVfaiqdpxE7X9a\nVV9fR/t/VtV7u/dPqaoLq+quqlpRVd+sqqc/xKZXtta+11q7ubX2sSRnJXlut701t+8/q6q+WlX3\nJzmym/erVfX1qrqvqm6oqneuCYLd/EdW1blVdW9V3VRVv7WO2sefo/lV9YGqurXb7jVVdWxVHZrk\nH5M8fOjcv7Vb50G3eVfVTlX1kaq6o9v3BVX180PzX9qdm8O6W/d/WFVfqqrHrefcb9ft/wuttWe3\n1s5vrd3QWvtaa+2NSY4bWvbgqrqsq//7VfXuceflou4Y/7qqbq+qH1TVyVU1r6pOq6o7q+p/quol\nQ+vs2R3zi6rqkm7b36mqI4aWmVNVp3e/i3uraqyqXldVWw0t8+Gq+lxVvb6qliZZOsE5fF53rd7b\n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\nDz88Bx98cE444YSsWLEiSXLBBRdk3333zcEHH5x/+Zd/Wbuts846K6997WuTJMuWLctxxx2XAw88\nMAceeGAuu+yyvO1tb8sNN9yQRYsW5S1veUtuuummLFy4MEly33335VWvelUOOOCAHHTQQbn44ovX\nbvPFL35xfv3Xfz177713/viP/zhJ8sADD+SVr3xlFi5cmAMOOCCnnXbaTJ42AACALZYe9x5ZtWpV\nzj///PzKr/xKkuS///u/84EPfCD77rtvbrvttvzlX/5lPvvZz+bhD394Tj311Jx22mk5+eSTc/LJ\nJ2fx4sV5/OMfn5e97GXr3PbrX//6HHjggTnrrLPywAMPZMWKFTnllFNyzTXXrO3tv+mmm9Yu/w//\n8A+pqvznf/5nrrvuujzvec/L1772tSTJt771rVx88cWZN29e9tlnn5x00kn53//939x66635yle+\nkmRwGz4AAACbTo97D9x7771ZtGhRDj300Oy22255yUtekiTZfffds++++yZJLr/88lx77bU58sgj\ns2jRonz84x/PzTffnOuuuy577LFHfvZnfzZVlRe84AXr3MfFF1+cE088MUkyZ86czJ8/f701XXrp\npWu39cQnPjG77757lixZkiQ55JBDMn/+/GyzzTZ50pOelJtvvjl77rlnbrzxxrz2ta/NBRdckB12\n2GFKzg0AAMBsp8e9B4afcR/28Ic/fO371lqe/vSn5/TTT3/QMldeeeW01zfevHnz1r6fM2dOVq1a\nlR133DGXXHJJLrzwwpxxxhn5zGc+43Z5AACAKaDHfTOx77775rLLLsv111+fJPnhD3+YJUuW5IlP\nfGJuvvnm3HDDDUmSc845Z53rH3LIIWtD/wMPPJDly5fnEY94RO6+++51Lr9w4cJ86lOfSpIsWbIk\nN998cxYsWDBhfbfddltWr16dY445Jm9+85vzzW9+c6OPFQAAgB8T3DcTu+yyS0477bSceOKJOeCA\nA3L44YfnuuuuyzbbbJNTTz01L3jBC3LwwQdnl112Wef673rXu/LlL385BxxwQA455JBce+212Xnn\nnbP//vtn4cKFectb3vKg5V/+8pdn9erVOeCAA/Kyl70s73//+x/U0z7ed7/73TznOc/JokWLctJJ\nJ+WUU06Z0uMHAACYraq1NuoaZsTy5cvXeaDLly9/yOe9mTqb2/keGxtb750GsKVxzTPbuOaZbVzz\nzDab4zU/f/78Gt82Iz3uVXVGVS2rqquG2v6yqr5TVVdW1WeqaseheW+sqiVVdW1VHTnUflTXtqSq\n3jDU/riquqxr/+eq2nomjgsAAACm20wNTvfhJH+b5MyhtvOTvLG1tqqq/jzJG5O8vqqenOSFSX4+\nyaOTXFBVT+zWOS3J4UmWJrm8qha31r6d5M+TvLu19omq+rskJyb5wAwcFwAAAA9h21NOGs2OX/za\n0ex3is1Ij3tr7eIkt49r+/fW2qpu8tIku3Xvj0nyidbaytbaDUmWJNmvey1prV3fWrs/ySeSHFNV\nleQZSc7u1v9IkudO6wEBAADADOnL4HS/leTz3fvHJLl5aN7Srm2i9p9KcufQhwBr2gEAAGCzN/Lv\nca+qP0qyKslZM7XPsbGxte+32Wab9Y6WztS66667smzZslGXMSnD1wvMBq55ZhvXPLONa55R2Gvl\nypHte3O45h9qAL2RBveqemmS5yQ5rP14ePtbkuw+tNhuXVsmaL8tyY5VNbfrdR9efp2GT8ry5cuz\nzTbbbMJRMBk77LBDdt9994desCc2x1EoYVO45pltXPPMNq55RmWUnaVbwjU/slvlq+qoJK9LcnRr\n7Z6hWYuTvLCq5lXV45IsSPLVJJcnWdCNIL91BgPYLe4C/5eSPL9b/4Qk587UcUyVz33uc9lxxx1z\n3XXXrXe5s846K7feeutG7+fLX/5yjj322I1eHwAAgJk1Iz3uVfXxJIcm2aWqliY5JYNR5OclOX8w\nvlwuba39Tmvt6qr6ZJJvZ3AL/atbaw902/ndJF9IMifJGa21q7tdvD7JJ6rqHUm+keT0ja11qkc7\nvPdtH9yg5c4555wsXLgwZ599dt70pjdNuNzHPvaxPPnJT86uu+46VSUCAADQYzM1qvxvttZ2ba09\nrLW2W2vt9NbaE1pru7fWfrl7/c7Q8u9srf1sa22v1trnh9rPa609sZv3zqH261tr+3Xb/I3W2uge\noNgIK1asyKWXXpr3ve99+fSnP722/dRTT80BBxyQAw88MG9961tz7rnn5oorrsgrXvGKLFq0KPfe\ne2+e8pSn5LbbbkuSfOMb38izn/3sJMnXv/71HH744TnooINyxBFHbBbPdQAAAPCTRj44Hcl5552X\nww47LE94whOy884754orrsgPfvCDnHfeebnggguy3Xbb5Y477shOO+2UD37wg3nHO96Rpz71qevd\n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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "# Actual vs Prediction Comparison\n", "print('Actual vs Prediction Comparison'); print('--'*40)\n", "\n", "fig, ax = plt.subplots(figsize = (15, 7.2))\n", "fig.suptitle('Actual vs Prediction Comparison', fontsize = 14)\n", "df_user['EstRating'].plot.hist(bins = 25, alpha = 0.8)\n", "df_user['ActualRating'].plot.hist(bins = 25, alpha = 0.8)\n", "ax.legend(['Predictions', 'Actual'])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 255 }, "colab_type": "code", "id": "dl3H1-KSSFfM", "outputId": "28fbd6e8-c135-475c-8e7b-8cdf36ba21f7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Get top - K ( K = 5) recommendations.\n", "Since our goal is to recommend new products to each user based on his/her habits, we will recommend 5 new products.\n", "--------------------------------------------------------------------------------\n", "A check on what has the user liked in past (based on data available in training set, if there is) and making recommendations\n", "-------------------------------------------------------------------------------- \n", "\n", "User \"A11D1KHM7DVOQK\" has already rated products (from data in training set): 76\n", "Top 5 products from what's already being rated: ['B00005V54U', 'B0001LD00A', 'B00061IYFQ', 'B0002I5RHG', 'B0009FUFPG']\n", "Top 5 recommendations for the user are: ['B00008ZPNR', 'B00022TN9A', 'B0001FV35U', 'B0007Y79AI', 'B0000E1717']\n", "\n", "\n", "User \"A149RNR5RH19YY\" has already rated products (from data in training set): 95\n", "Top 5 products from what's already being rated: ['B000BTL0OA', 'B00003006E', 'B001OOZ1X2', 'B000062TTF', 'B00385XTWA']\n", "Top 5 recommendations for the user are: ['B00003006E', 'B001F51G16', 'B000AMLXHW', 'B00001P4ZH', 'B000089GN3']\n" ] } ], "source": [ "# Query top 5 recommendations for specific UserID\n", "print('Get top - K ( K = 5) recommendations.')\n", "print('Since our goal is to recommend new products to each user based on his/her habits, we will recommend 5 new products.'); print('--'*40)\n", "result = {}\n", "\n", "def query_user(user_id):\n", " try:\n", " print('User \"{}\" has already rated products (from data in training set): {}'.format(user_id, train_data.loc[(train_data['UserID'] == user_id), 'ProductID'].nunique()))\n", " print('Top 5 products from what\\'s already being rated: {}'.format(list(train_data[(train_data['UserID'] == user_id)].sort_values(by = 'Rating', ascending = False).head(5)['ProductID'])))\n", " except:\n", " print('There\\'s no data for the selected user in training set')\n", " print('Top 5 recommendations for the user are: {}'.format(list(df_user[(df_user['UserID'] == user_id)].sort_values(by = 'EstRating', ascending = False).head(5)['ProductID'])))\n", " return list(df_user[(df_user['UserID'] == user_id)].sort_values(by = 'EstRating', ascending = False).head(5)['ProductID'])\n", "\n", "# For e.g. querying for the following user\n", "print('A check on what has the user liked in past (based on data available in training set, if there is) and making recommendations');\n", "print('--'*40, '\\n')\n", "\n", "result['A11D1KHM7DVOQK'] = query_user('A11D1KHM7DVOQK')\n", "print('\\n')\n", "result['A149RNR5RH19YY'] = query_user('A149RNR5RH19YY')" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 527 }, "colab_type": "code", "id": "KjDLetaZSHLO", "outputId": "d0c3e98d-8f02-4ed6-9d12-ff72a0023614" }, "outputs": [ { "data": { "text/plain": [ "{'PopularityRec': {'A11D1KHM7DVOQK': ['B0000645V0',\n", " 'B0011YR8KO',\n", " 'B00JE0Q95M',\n", " 'B004T0B8O4',\n", " 'B000VQU3N2'],\n", " 'A149RNR5RH19YY': ['B0000645V0',\n", " 'B0011YR8KO',\n", " 'B00JE0Q95M',\n", " 'B004T0B8O4',\n", " 'B000VQU3N2']},\n", " 'SVD Item-based Collaborative Filtering': {'A11D1KHM7DVOQK': ['B007WTAJTO',\n", " 'B005CT56F8',\n", " 'B00829THK0',\n", " 'B003ZSHNGS',\n", " 'B00825BZUY'],\n", " 'A149RNR5RH19YY': ['B00829THK0',\n", " 'B007WTAJTO',\n", " 'B00829TIEK',\n", " 'B002R5AM7C',\n", " 'B003ES5ZUU']},\n", " 'k-NN Item-based Collaborative Filtering': {'A11D1KHM7DVOQK': ['B00008ZPNR',\n", " 'B00022TN9A',\n", " 'B0001FV35U',\n", " 'B0007Y79AI',\n", " 'B0000E1717'],\n", " 'A149RNR5RH19YY': ['B00003006E',\n", " 'B001F51G16',\n", " 'B000AMLXHW',\n", " 'B00001P4ZH',\n", " 'B000089GN3']}}" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "compare_dict['k-NN Item-based Collaborative Filtering'] = result\n", "display(compare_dict)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "pG3aqY2ShPQy", "outputId": "362fd653-4669-402b-9f13-6a0e4dbba1d6" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UserIDProductIDActualRatingEstRatingDetailsError
11142A2HRHF83I3NDGTB005EOWBHC5.005.00{'actual_k': 1, 'was_impossible': False}0.00
13565A2IFGGXG3YV3Y6B003ES5ZUU5.005.00{'actual_k': 2, 'was_impossible': False}0.00
13620A1G650TTTHEAL5B00ENZRS765.005.00{'actual_k': 5, 'was_impossible': False}0.00
13777A2B7BUH8834Y6MB004CLYEFK5.005.00{'actual_k': 1, 'was_impossible': False}0.00
359A3V5F050GVZ56QB00F6E4HXG5.005.00{'actual_k': 2, 'was_impossible': False}0.00
\n", "
" ], "text/plain": [ " UserID ProductID ActualRating EstRating \\\n", "11142 A2HRHF83I3NDGT B005EOWBHC 5.00 5.00 \n", "13565 A2IFGGXG3YV3Y6 B003ES5ZUU 5.00 5.00 \n", "13620 A1G650TTTHEAL5 B00ENZRS76 5.00 5.00 \n", "13777 A2B7BUH8834Y6M B004CLYEFK 5.00 5.00 \n", "359 A3V5F050GVZ56Q B00F6E4HXG 5.00 5.00 \n", "\n", " Details Error \n", "11142 {'actual_k': 1, 'was_impossible': False} 0.00 \n", "13565 {'actual_k': 2, 'was_impossible': False} 0.00 \n", "13620 {'actual_k': 5, 'was_impossible': False} 0.00 \n", "13777 {'actual_k': 1, 'was_impossible': False} 0.00 \n", "359 {'actual_k': 2, 'was_impossible': False} 0.00 " ] }, "execution_count": 59, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "df_user.head()" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "oSSJ3oszSJR0" }, "outputs": [], "source": [ "del (algo, ax, fig, gs_KNNBaseline, kf, param_grid_KNNBaseline, predictions, rmse, rmse_scores, train_, test_)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YFQ3dvFSuT3D" }, "source": [ "\n", "###### Observation 7 - Item based Collaborative Filtering (k-NN)\n", "* Using k-NN inspired algos for item based collaborative filtering and 2-Fold cross validation, we get a RMSE score of ~0.9655." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "jD0i14Nq9zZV", "outputId": "a3717d08-025d-40f4-8cb7-5552c11e4024" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "USER BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS\n", "Grid Search across parameter grid to find best parameters using KNNBaseline algorithm\n", "--------------------------------------------------------------------------------\n", "0.981338916827777\n", "{'bsl_options': {'method': 'als', 'reg': 1}, 'k': 5, 'sim_options': {'name': 'pearson_baseline', 'user_based': True}, 'verbose': False}\n", "CPU times: user 18.8 s, sys: 9.47 ms, total: 18.8 s\n", "Wall time: 18.8 s\n" ] } ], "source": [ "%%time\n", "print('USER BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS')\n", "print('Grid Search across parameter grid to find best parameters using KNNBaseline algorithm'); print('--'*40)\n", "param_grid_KNNBaseline = {'bsl_options': {'method': ['als', 'sgd'], 'reg': [1, 2]}, 'k': [2, 3, 5], \n", " 'sim_options': {'name': ['pearson_baseline', 'cosine'], 'user_based': [True]},\n", " 'verbose': [False]}\n", "\n", "gs_KNNBaseline = GridSearchCV(KNNBaseline, param_grid_KNNBaseline, measures = ['rmse', 'mae'], cv = 3)\n", "gs_KNNBaseline.fit(trainset)\n", "print(gs_KNNBaseline.best_score['rmse'])\n", "print(gs_KNNBaseline.best_params['rmse'])" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 170 }, "colab_type": "code", "id": "8B_qwJx--RZg", "outputId": "ff025afc-f9db-4d16-8d6a-b71e4e996319" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "USER BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS\n", "2-Fold cross validation using KNNBaseline and with best parameters identified during grid search\n", "--------------------------------------------------------------------------------\n", "RMSE: 0.9860\n", "RMSE: 0.9793\n", "--------------------------------------------------------------------------------\n", "RMSE OF USER BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGORITHM AND 2-FOLD CROSS VALIDATION 0.9826\n", "CPU times: user 1.4 s, sys: 16 ms, total: 1.41 s\n", "Wall time: 1.42 s\n" ] } ], "source": [ "%%time\n", "print('USER BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGOS')\n", "print('2-Fold cross validation using KNNBaseline and with best parameters identified during grid search'); print('--'*40)\n", "kf = KFold(n_splits = 2)\n", "algo = KNNBaseline(**gs_KNNBaseline.best_params['rmse'])\n", "rmse_scores = []\n", "\n", "for train_, test_ in kf.split(data):\n", " algo.fit(train_)\n", " predictions = algo.test(test_)\n", " rmse = round(accuracy.rmse(predictions, verbose = True), 4)\n", " rmse_scores.append(rmse)\n", "\n", " dump.dump('./dump_KNNBaseline_User', predictions, algo)\n", "\n", "print('--'*40)\n", "print(f'RMSE OF USER BASED COLLABORATIVE FILTERING USING k-NN INSPIRED ALGORITHM AND 2-FOLD CROSS VALIDATION {round(np.mean(rmse_scores), 4)}')" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "WHco9PHy-eeS", "outputId": "f302e20e-dd05-4968-df8f-76dde5eb2f33" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
UserIDProductIDActualRatingEstRatingDetailsError
4751A3OXHLG6DIBRW8B000TKHBDK5.005.00{'actual_k': 2, 'was_impossible': False}0.00
8928A18U49406IPPIJB009QUDLC45.005.00{'actual_k': 1, 'was_impossible': False}0.00
4367A31N0XY2UTB25CB00BOHNYTW5.005.00{'actual_k': 3, 'was_impossible': False}0.00
6663A2KOV8XWZOZ0FQB001TH7T2U5.005.00{'actual_k': 1, 'was_impossible': False}0.00
20132AEJAGHLC675A7B001TH7GUU5.005.00{'actual_k': 3, 'was_impossible': False}0.00
\n", "
" ], "text/plain": [ " UserID ProductID ActualRating EstRating \\\n", "4751 A3OXHLG6DIBRW8 B000TKHBDK 5.00 5.00 \n", "8928 A18U49406IPPIJ B009QUDLC4 5.00 5.00 \n", "4367 A31N0XY2UTB25C B00BOHNYTW 5.00 5.00 \n", "6663 A2KOV8XWZOZ0FQ B001TH7T2U 5.00 5.00 \n", "20132 AEJAGHLC675A7 B001TH7GUU 5.00 5.00 \n", "\n", " Details Error \n", "4751 {'actual_k': 2, 'was_impossible': False} 0.00 \n", "8928 {'actual_k': 1, 'was_impossible': False} 0.00 \n", "4367 {'actual_k': 3, 'was_impossible': False} 0.00 \n", "6663 {'actual_k': 1, 'was_impossible': False} 0.00 \n", "20132 {'actual_k': 3, 'was_impossible': False} 0.00 " ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "predictions, algo = dump.load('./dump_KNNBaseline_User')\n", "df_user = pd.DataFrame(predictions, columns = ['UserID', 'ProductID', 'ActualRating', 'EstRating', 'Details'])\n", "df_user['Error'] = abs(df_user['EstRating'] - df_user['ActualRating'])\n", "df_user.sort_values('Error', inplace = True, ascending = True)\n", "\n", "display(df_user.head())" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "873C9pVF-vs3", "outputId": "f92c718d-e9da-4e6c-d632-00de4ce29a69" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A check on what has the user liked in past (based on data available in training set, if there is) and making recommendations\n", "-------------------------------------------------------------------------------- \n", "\n", "User \"A11D1KHM7DVOQK\" has already rated products (from data in training set): 76\n", "Top 5 products from what's already being rated: ['B00005V54U', 'B0001LD00A', 'B00061IYFQ', 'B0002I5RHG', 'B0009FUFPG']\n", "Top 5 recommendations for the user are: ['B00004T8R2', 'B0009H9PZU', 'B00009L1RI', 'B00008VF63', 'B000069106']\n", "\n", "\n", "User \"A149RNR5RH19YY\" has already rated products (from data in training set): 95\n", "Top 5 products from what's already being rated: ['B000BTL0OA', 'B00003006E', 'B001OOZ1X2', 'B000062TTF', 'B00385XTWA']\n", "Top 5 recommendations for the user are: ['B000VE7S9Q', 'B000089GN3', 'B00008I9K8', 'B00006HYKM', 'B000MK4GGM']\n" ] } ], "source": [ "print('A check on what has the user liked in past (based on data available in training set, if there is) and making recommendations');\n", "print('--'*40, '\\n')\n", "result = {}\n", "\n", "result['A11D1KHM7DVOQK'] = query_user('A11D1KHM7DVOQK')\n", "print('\\n')\n", "result['A149RNR5RH19YY'] = query_user('A149RNR5RH19YY')" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 697 }, "colab_type": "code", "id": "-Q1WSrSePpbO", "outputId": "e2704c45-b39f-4892-8e0d-7a441509db2e" }, "outputs": [ { "data": { "text/plain": [ "{'PopularityRec': {'A11D1KHM7DVOQK': ['B0000645V0',\n", " 'B0011YR8KO',\n", " 'B00JE0Q95M',\n", " 'B004T0B8O4',\n", " 'B000VQU3N2'],\n", " 'A149RNR5RH19YY': ['B0000645V0',\n", " 'B0011YR8KO',\n", " 'B00JE0Q95M',\n", " 'B004T0B8O4',\n", " 'B000VQU3N2']},\n", " 'SVD Item-based Collaborative Filtering': {'A11D1KHM7DVOQK': ['B007WTAJTO',\n", " 'B005CT56F8',\n", " 'B00829THK0',\n", " 'B003ZSHNGS',\n", " 'B00825BZUY'],\n", " 'A149RNR5RH19YY': ['B00829THK0',\n", " 'B007WTAJTO',\n", " 'B00829TIEK',\n", " 'B002R5AM7C',\n", " 'B003ES5ZUU']},\n", " 'k-NN Item-based Collaborative Filtering': {'A11D1KHM7DVOQK': ['B00008ZPNR',\n", " 'B00022TN9A',\n", " 'B0001FV35U',\n", " 'B0007Y79AI',\n", " 'B0000E1717'],\n", " 'A149RNR5RH19YY': ['B00003006E',\n", " 'B001F51G16',\n", " 'B000AMLXHW',\n", " 'B00001P4ZH',\n", " 'B000089GN3']},\n", " 'k-NN User-based Collaborative Filtering': {'A11D1KHM7DVOQK': ['B00004T8R2',\n", " 'B0009H9PZU',\n", " 'B00009L1RI',\n", " 'B00008VF63',\n", " 'B000069106'],\n", " 'A149RNR5RH19YY': ['B000VE7S9Q',\n", " 'B000089GN3',\n", " 'B00008I9K8',\n", " 'B00006HYKM',\n", " 'B000MK4GGM']}}" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "compare_dict['k-NN User-based Collaborative Filtering'] = result\n", "display(compare_dict)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "QOhBN2VbECvY" }, "source": [ "\n", "###### Observation 8 - User based Collaborative Filtering (k-NN)\n", "* Using k-NN inspired algos for user based collaborative filtering and 2-Fold cross validation, we get a RMSE score of ~0.9826. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "3o9cZydXCdv0" }, "source": [ "\n", "### Conclusion\n", "* Non-personalized based recommendation system (such as popularity) is generated by averaging the recommendations for all the users. Here we recommended top 5 products to the users. Also saw how we can make use of count to suggest popular products to the users and hybrid popularity based recommender based on a combination of mean and count. However in popularity based recommendation, all users receive same recommendations. RMSE of popularity recommendation method based on mean of ratings was 3.0894.\n", "\n", "* Collaborative-based recommendations are personalized since the rating \"prediction\" differs depending on the target user and it is based on\n", " * User-to-user: ratings for a given product expressed by users that are similar to the active user.\n", " * Item-to-item: weighted average of the ratings of the active users for the similar items.\n", "\n", "* Collaborative based filtering method requires a minimal knowledge engineering efforts when compared to methods such as content-based recsys. This method is based on user history, but what if the user is new (where there is no user history)? It's one of the limitations of the method known as cold-start problem.\n", "\n", "* Items with lots of history gets recommended a lot, while those without never make it into the recommendation engine.\n", "\n", "* Additionally, collaborative based filtering methods face scalability issues particularly in our case where the number of users (4,201,696) and items (476,002) were high (sparse data), especially when recommendations need to be generated in real-time online. To overcome this, we filtered users who have rated at least 50 products, this left about 1,540 number of users and 48,190 products in the dataframe and these were further reduced to select only those users with > 100 ratings to avoid memory issues while using k-NN inspired algorithms.\n", "\n", "* Since our goal was to build a recsys to recommend products to customers based on their previous ratings for other products, we built an item-based collaborative filtering recommendation system. Used two model-based approaches to do that: SVD and k-NN inspired algos.\n", "\n", "* We saw that SVD had a RMSE score of 0.0033. We also compared various k-NN based algorithms using grid search method and found that KNN Baseline algo gave the lowest RMSE, we then used 2-fold cross validation technique which gave a RMSE of 0.9655.\n", "\n", "* Also explored kNN Baseline algo for user-based collaborative filtering, RMSE (0.9826) was slightly higher than item-based CF." ] } ], "metadata": { "colab": { "collapsed_sections": [], "machine_shape": "hm", "name": "06_Recommendation System_Pratik.ipynb", "provenance": [] }, "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.7.6" } }, "nbformat": 4, "nbformat_minor": 1 }