From d9a4c4212c19266ce5d8f0794d5e51701e6817cf Mon Sep 17 00:00:00 2001
From: Parth Sharma <56518722+ParthSharmaT@users.noreply.github.com>
Date: Tue, 8 Mar 2022 09:24:36 +0530
Subject: [PATCH 1/2] Ml algo
---
product_recommendation_system.ipynb | 1273 +++++++++++++++++++++++++++
1 file changed, 1273 insertions(+)
create mode 100644 product_recommendation_system.ipynb
diff --git a/product_recommendation_system.ipynb b/product_recommendation_system.ipynb
new file mode 100644
index 0000000..019dc19
--- /dev/null
+++ b/product_recommendation_system.ipynb
@@ -0,0 +1,1273 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "uVyxXyhMRQvd"
+ },
+ "source": [
+ "### Amar Shaw\n",
+ "* Computer Science Engineering,(August, 2019)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "j12wnJZ9RQvs"
+ },
+ "source": [
+ "## Product Recommendation System for e-commerce businesses\n",
+ "A well developed recommendation system will help businesses improve their shopper's experience on website and result in better customer acquisition and retention.\n",
+ "\n",
+ "The recommendation system, I have designed below is based on the journey of a new customer from the time he/she lands on the business’s website for the first time to when he/she makes repeat purchases.\n",
+ "\n",
+ "The recommendation system is designed in 3 parts based on the business context:\n",
+ "\n",
+ "* **Recommendation system part I:** Product pupularity based system targetted at new customers\n",
+ "\n",
+ "* **Recommendation system part II:** Model-based collaborative filtering system based on customer's purchase history and ratings provided by other users who bought items similar items\n",
+ "\n",
+ "When a new customer without any previous purchase history visits the e-commerce website for the first time, he/she is recommended the most popular products sold on the company's website. Once, he/she makes a purchase, the recommendation system updates and recommends other products based on the purchase history and ratings provided by other users on the website. The latter part is done using collaborative filtering techniques."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "TIv92NNXRQvy"
+ },
+ "source": [
+ "## Recommendation System - Part I\n",
+ "### Product popularity based recommendation system targeted at new customers\n",
+ "* Popularity based are a great strategy to target the new customers with the most popular products sold on a business's website and is very useful to cold start a recommendation engine.\n",
+ "[[](http://)](http://)\n",
+ "* **Dataset : **[Amazon product review dataset](https://www.kaggle.com/skillsmuggler/amazon-ratings)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "e30EFFPSRQv1"
+ },
+ "source": [
+ "#### Importing libraries"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "en_1BcMoRQv2"
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "# %matplotlib inline\n",
+ "plt.style.use(\"ggplot\")\n",
+ "\n",
+ "import sklearn\n",
+ "from sklearn.decomposition import TruncatedSVD"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "wK9fODZ5RQv7"
+ },
+ "source": [
+ "#### Loading the dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vPx8TmVZRQv9",
+ "outputId": "12195e81-9786-4015-d764-9fd97b7ab60c"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " UserId \n",
+ " ProductId \n",
+ " Rating \n",
+ " Timestamp \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " A39HTATAQ9V7YF \n",
+ " 0205616461 \n",
+ " 5.0 \n",
+ " 1369699200 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " A3JM6GV9MNOF9X \n",
+ " 0558925278 \n",
+ " 3.0 \n",
+ " 1355443200 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " A1Z513UWSAAO0F \n",
+ " 0558925278 \n",
+ " 5.0 \n",
+ " 1404691200 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " A1WMRR494NWEWV \n",
+ " 0733001998 \n",
+ " 4.0 \n",
+ " 1382572800 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " A3IAAVS479H7M7 \n",
+ " 0737104473 \n",
+ " 1.0 \n",
+ " 1274227200 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " UserId ProductId Rating Timestamp\n",
+ "0 A39HTATAQ9V7YF 0205616461 5.0 1369699200\n",
+ "1 A3JM6GV9MNOF9X 0558925278 3.0 1355443200\n",
+ "2 A1Z513UWSAAO0F 0558925278 5.0 1404691200\n",
+ "3 A1WMRR494NWEWV 0733001998 4.0 1382572800\n",
+ "4 A3IAAVS479H7M7 0737104473 1.0 1274227200"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "amazon_ratings = pd.read_csv('../input/amazon-ratings/ratings_Beauty.csv')\n",
+ "amazon_ratings = amazon_ratings.dropna()\n",
+ "amazon_ratings.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "jV-HvLqyRQwC",
+ "outputId": "3d206407-0ddb-49b4-8cbb-f81b6337aff4"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2023070, 4)"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "amazon_ratings.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "4l-_ugFmRQwE",
+ "outputId": "d9692d4b-982b-40dc-a66d-dd28f2a6817f"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Rating \n",
+ " \n",
+ " \n",
+ " ProductId \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " B001MA0QY2 \n",
+ " 7533 \n",
+ " \n",
+ " \n",
+ " B0009V1YR8 \n",
+ " 2869 \n",
+ " \n",
+ " \n",
+ " B0043OYFKU \n",
+ " 2477 \n",
+ " \n",
+ " \n",
+ " B0000YUXI0 \n",
+ " 2143 \n",
+ " \n",
+ " \n",
+ " B003V265QW \n",
+ " 2088 \n",
+ " \n",
+ " \n",
+ " B000ZMBSPE \n",
+ " 2041 \n",
+ " \n",
+ " \n",
+ " B003BQ6QXK \n",
+ " 1918 \n",
+ " \n",
+ " \n",
+ " B004OHQR1Q \n",
+ " 1885 \n",
+ " \n",
+ " \n",
+ " B00121UVU0 \n",
+ " 1838 \n",
+ " \n",
+ " \n",
+ " B000FS05VG \n",
+ " 1589 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Rating\n",
+ "ProductId \n",
+ "B001MA0QY2 7533\n",
+ "B0009V1YR8 2869\n",
+ "B0043OYFKU 2477\n",
+ "B0000YUXI0 2143\n",
+ "B003V265QW 2088\n",
+ "B000ZMBSPE 2041\n",
+ "B003BQ6QXK 1918\n",
+ "B004OHQR1Q 1885\n",
+ "B00121UVU0 1838\n",
+ "B000FS05VG 1589"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "popular_products = pd.DataFrame(amazon_ratings.groupby('ProductId')['Rating'].count())\n",
+ "most_popular = popular_products.sort_values('Rating', ascending=False)\n",
+ "most_popular.head(10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "L4H53re1RQwG",
+ "outputId": "71626e84-88fd-431e-ec17-6f25f56a660e"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "most_popular.head(30).plot(kind = \"bar\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "McqPBgQjRQwI"
+ },
+ "source": [
+ "** Analysis:**\n",
+ "\n",
+ "* The above graph gives us the most popular products (arranged in descending order) sold by the business.\n",
+ "\n",
+ "* For eaxmple, product, ID # B001MA0QY2 has sales of over 7000, the next most popular product, ID # B0009V1YR8 has sales of 3000, etc. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "kvOxcdF7RQwJ"
+ },
+ "source": [
+ "## Recommendation System - Part II\n",
+ "### Model-based collaborative filtering system\n",
+ "\n",
+ "* Recommend items to users based on purchase history and similarity of ratings provided by other users who bought items to that of a particular customer.\n",
+ "* A model based collaborative filtering technique is closen here as it helps in making predictinfg products for a particular user by identifying patterns based on preferences from multiple user data."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "gzfXKSmaRQwK"
+ },
+ "source": [
+ "#### Utility Matrix based on products sold and user reviews\n",
+ "**Utility Matrix : **An utlity matrix is consists of all possible user-item preferences (ratings) details represented as a matrix. The utility matrix is sparce as none of the users would buy all teh items in the list, hence, most of the values are unknown."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ibmBXWG-RQwL"
+ },
+ "outputs": [],
+ "source": [
+ "# Subset of Amazon Ratings\n",
+ "\n",
+ "amazon_ratings1 = amazon_ratings.head(10000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "F_5-SZpiRQwN",
+ "outputId": "3c4253d3-964e-4e9d-a804-1d8e28396ba9"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " ProductId \n",
+ " 0205616461 \n",
+ " 0558925278 \n",
+ " 0733001998 \n",
+ " 0737104473 \n",
+ " 0762451459 \n",
+ " 1304139212 \n",
+ " 1304139220 \n",
+ " 130414089X \n",
+ " 130414643X \n",
+ " 1304146537 \n",
+ " ... \n",
+ " B000052YPE \n",
+ " B000052YPF \n",
+ " B000052YPG \n",
+ " B000052YPH \n",
+ " B000052YPM \n",
+ " B000052YPU \n",
+ " B000052YPV \n",
+ " B000052YPY \n",
+ " B000052YQ0 \n",
+ " B000052YQ2 \n",
+ " \n",
+ " \n",
+ " UserId \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " A00205921JHJK5X9LNP42 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " A024581134CV80ZBLIZTZ \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " A03056581JJIOL5FSKJY7 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " A03099101ZRK4K607JVHH \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " A0505229A7NSH3FRXRR4 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
5 rows × 886 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ "ProductId 0205616461 0558925278 0733001998 0737104473 \\\n",
+ "UserId \n",
+ "A00205921JHJK5X9LNP42 0 0 0 0 \n",
+ "A024581134CV80ZBLIZTZ 0 0 0 0 \n",
+ "A03056581JJIOL5FSKJY7 0 0 0 0 \n",
+ "A03099101ZRK4K607JVHH 0 0 0 0 \n",
+ "A0505229A7NSH3FRXRR4 0 0 0 0 \n",
+ "\n",
+ "ProductId 0762451459 1304139212 1304139220 130414089X \\\n",
+ "UserId \n",
+ "A00205921JHJK5X9LNP42 0 0 0 0 \n",
+ "A024581134CV80ZBLIZTZ 0 0 0 0 \n",
+ "A03056581JJIOL5FSKJY7 0 0 0 0 \n",
+ "A03099101ZRK4K607JVHH 0 0 0 0 \n",
+ "A0505229A7NSH3FRXRR4 0 0 0 0 \n",
+ "\n",
+ "ProductId 130414643X 1304146537 ... B000052YPE B000052YPF \\\n",
+ "UserId ... \n",
+ "A00205921JHJK5X9LNP42 0 0 ... 0 0 \n",
+ "A024581134CV80ZBLIZTZ 0 0 ... 0 0 \n",
+ "A03056581JJIOL5FSKJY7 0 0 ... 0 0 \n",
+ "A03099101ZRK4K607JVHH 0 0 ... 0 0 \n",
+ "A0505229A7NSH3FRXRR4 0 0 ... 0 0 \n",
+ "\n",
+ "ProductId B000052YPG B000052YPH B000052YPM B000052YPU \\\n",
+ "UserId \n",
+ "A00205921JHJK5X9LNP42 0 0 0 0 \n",
+ "A024581134CV80ZBLIZTZ 0 0 0 0 \n",
+ "A03056581JJIOL5FSKJY7 0 0 0 0 \n",
+ "A03099101ZRK4K607JVHH 0 0 0 0 \n",
+ "A0505229A7NSH3FRXRR4 0 0 0 0 \n",
+ "\n",
+ "ProductId B000052YPV B000052YPY B000052YQ0 B000052YQ2 \n",
+ "UserId \n",
+ "A00205921JHJK5X9LNP42 0 0 0 0 \n",
+ "A024581134CV80ZBLIZTZ 0 0 0 0 \n",
+ "A03056581JJIOL5FSKJY7 0 0 0 0 \n",
+ "A03099101ZRK4K607JVHH 0 0 0 0 \n",
+ "A0505229A7NSH3FRXRR4 0 0 0 0 \n",
+ "\n",
+ "[5 rows x 886 columns]"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ratings_utility_matrix = amazon_ratings1.pivot_table(values='Rating', index='UserId', columns='ProductId', fill_value=0)\n",
+ "ratings_utility_matrix.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-WFAJjA9RQwO"
+ },
+ "source": [
+ "As expected, the utility matrix obtaned above is sparce, I have filled up the unknown values wth 0."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "e-FK4QPiRQwP",
+ "outputId": "ba4cdf8b-70fc-4657-caa4-3e819f654f41"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(9697, 886)"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ratings_utility_matrix.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ReF4Jv8YRQwQ"
+ },
+ "source": [
+ "Transposing the matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "1OTKO8PURQwR",
+ "outputId": "cb8d2480-2b17-43ac-eb01-9da2b2670159"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " UserId \n",
+ " A00205921JHJK5X9LNP42 \n",
+ " A024581134CV80ZBLIZTZ \n",
+ " A03056581JJIOL5FSKJY7 \n",
+ " A03099101ZRK4K607JVHH \n",
+ " A0505229A7NSH3FRXRR4 \n",
+ " A05492663T95KW63BR75K \n",
+ " A059547920Q3LZVFHLPI3 \n",
+ " A07410232KYRFR25CIUGJ \n",
+ " A082796624UNM47DSAI6K \n",
+ " A0864963DOAY7LXGS5I6 \n",
+ " ... \n",
+ " AZW1HXXYAC15B \n",
+ " AZWRTJPN7NXT \n",
+ " AZWTXHXZXFAYP \n",
+ " AZYQEFB9Y5N22 \n",
+ " AZZHB6U54UDYW \n",
+ " AZZHJZP4GQPPZ \n",
+ " AZZNK89PXD006 \n",
+ " AZZOFVMQC0BJG \n",
+ " AZZQXL8VDCFTV \n",
+ " AZZTJQ7CQZUD8 \n",
+ " \n",
+ " \n",
+ " ProductId \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0205616461 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 0558925278 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 0733001998 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 0737104473 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 0762451459 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
5 rows × 9697 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ "UserId A00205921JHJK5X9LNP42 A024581134CV80ZBLIZTZ \\\n",
+ "ProductId \n",
+ "0205616461 0 0 \n",
+ "0558925278 0 0 \n",
+ "0733001998 0 0 \n",
+ "0737104473 0 0 \n",
+ "0762451459 0 0 \n",
+ "\n",
+ "UserId A03056581JJIOL5FSKJY7 A03099101ZRK4K607JVHH \\\n",
+ "ProductId \n",
+ "0205616461 0 0 \n",
+ "0558925278 0 0 \n",
+ "0733001998 0 0 \n",
+ "0737104473 0 0 \n",
+ "0762451459 0 0 \n",
+ "\n",
+ "UserId A0505229A7NSH3FRXRR4 A05492663T95KW63BR75K \\\n",
+ "ProductId \n",
+ "0205616461 0 0 \n",
+ "0558925278 0 0 \n",
+ "0733001998 0 0 \n",
+ "0737104473 0 0 \n",
+ "0762451459 0 0 \n",
+ "\n",
+ "UserId A059547920Q3LZVFHLPI3 A07410232KYRFR25CIUGJ \\\n",
+ "ProductId \n",
+ "0205616461 0 0 \n",
+ "0558925278 0 0 \n",
+ "0733001998 0 0 \n",
+ "0737104473 0 0 \n",
+ "0762451459 0 0 \n",
+ "\n",
+ "UserId A082796624UNM47DSAI6K A0864963DOAY7LXGS5I6 ... AZW1HXXYAC15B \\\n",
+ "ProductId ... \n",
+ "0205616461 0 0 ... 0 \n",
+ "0558925278 0 0 ... 0 \n",
+ "0733001998 0 0 ... 0 \n",
+ "0737104473 0 0 ... 0 \n",
+ "0762451459 0 0 ... 0 \n",
+ "\n",
+ "UserId AZWRTJPN7NXT AZWTXHXZXFAYP AZYQEFB9Y5N22 AZZHB6U54UDYW \\\n",
+ "ProductId \n",
+ "0205616461 0 0 0 0 \n",
+ "0558925278 0 0 0 0 \n",
+ "0733001998 0 0 0 0 \n",
+ "0737104473 0 0 0 0 \n",
+ "0762451459 0 0 0 0 \n",
+ "\n",
+ "UserId AZZHJZP4GQPPZ AZZNK89PXD006 AZZOFVMQC0BJG AZZQXL8VDCFTV \\\n",
+ "ProductId \n",
+ "0205616461 0 0 0 0 \n",
+ "0558925278 0 0 0 0 \n",
+ "0733001998 0 0 0 0 \n",
+ "0737104473 0 0 0 0 \n",
+ "0762451459 0 0 0 0 \n",
+ "\n",
+ "UserId AZZTJQ7CQZUD8 \n",
+ "ProductId \n",
+ "0205616461 0 \n",
+ "0558925278 0 \n",
+ "0733001998 0 \n",
+ "0737104473 0 \n",
+ "0762451459 0 \n",
+ "\n",
+ "[5 rows x 9697 columns]"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X = ratings_utility_matrix.T\n",
+ "X.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Oi8aiLZnRQwS",
+ "outputId": "f73c7e22-fe61-487d-86ef-0c6dfd4efdd4"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(886, 9697)"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "6ZuWY0roRQwT"
+ },
+ "source": [
+ "Unique products in subset of data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "80cPGLhERQwU"
+ },
+ "outputs": [],
+ "source": [
+ "X1 = X"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "NwPaVyP8RQwV"
+ },
+ "source": [
+ "### Decomposing the Matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "QHHmjYQXRQwV",
+ "outputId": "33051977-14c1-4f53-f1d3-cad62aa54e54"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(886, 10)"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "SVD = TruncatedSVD(n_components=10)\n",
+ "decomposed_matrix = SVD.fit_transform(X)\n",
+ "decomposed_matrix.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9kQz_tcmRQwX"
+ },
+ "source": [
+ "### Correlation Matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "GZmekSFzRQwX",
+ "outputId": "c4a9fd5e-4f2d-4180-a0f4-2d70c5b44f79"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(886, 886)"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "correlation_matrix = np.corrcoef(decomposed_matrix)\n",
+ "correlation_matrix.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QVyqnlnVRQwY"
+ },
+ "source": [
+ "correlation_matrix"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "_4tCGms0RQwZ"
+ },
+ "source": [
+ "### Isolating Product ID # 6117036094 from the Correlation Matrix\n",
+ "\n",
+ "Assuming the customer buys Product ID # 6117036094 (randomly chosen)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": true,
+ "id": "86-tm5xqRQwZ",
+ "outputId": "38e66f5a-99c4-4f7c-eb5b-ddd8653d0bf8"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'6117036094'"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X.index[99]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xJWcpIt1RQwa"
+ },
+ "source": [
+ "Index # of product ID purchased by customer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "B8nK5ri2RQwa",
+ "outputId": "68860da5-cdad-4444-c120-5f66ffd786c1"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "99"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "i = \"6117036094\"\n",
+ "\n",
+ "product_names = list(X.index)\n",
+ "product_ID = product_names.index(i)\n",
+ "product_ID"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "bG4yDqdLRQwb"
+ },
+ "source": [
+ "Correlation for all items with the item purchased by this customer based on items rated by other customers people who bought the same product"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "fkfxflgaRQwc",
+ "outputId": "89576824-71c5-4ecb-d664-144c0b080524"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(886,)"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "correlation_product_ID = correlation_matrix[product_ID]\n",
+ "correlation_product_ID.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HdJGseMxRQwd"
+ },
+ "source": [
+ "### Recommending top 10 highly correlated products in sequence"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "gUmGy1lrRQwd",
+ "outputId": "29e601e8-94b5-4d1c-f9a5-2b27524efcff"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['0733001998',\n",
+ " '1304139212',\n",
+ " '1304139220',\n",
+ " '130414089X',\n",
+ " '130414643X',\n",
+ " '130414674X',\n",
+ " '1304174778',\n",
+ " '1304174867',\n",
+ " '1304174905']"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Recommend = list(X.index[correlation_product_ID > 0.90])\n",
+ "\n",
+ "# Removes the item already bought by the customer\n",
+ "Recommend.remove(i) \n",
+ "\n",
+ "Recommend[0:9]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "yx0g7kbmRQwe"
+ },
+ "source": [
+ "**Product Id # **\n",
+ "Here are the top 10 products to be displayed by the recommendation system to the above customer based on the purchase history of other customers in the website. "
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.6"
+ },
+ "colab": {
+ "name": "product-recommendation-system.ipynb",
+ "provenance": []
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
From 1ed30ed0da3959213858091c2f443fa7be591254 Mon Sep 17 00:00:00 2001
From: Parth Sharma <56518722+ParthSharmaT@users.noreply.github.com>
Date: Tue, 8 Mar 2022 11:19:54 +0530
Subject: [PATCH 2/2] Ml model
---
product_recommendation_system.ipynb | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/product_recommendation_system.ipynb b/product_recommendation_system.ipynb
index 019dc19..5b148e6 100644
--- a/product_recommendation_system.ipynb
+++ b/product_recommendation_system.ipynb
@@ -6,8 +6,8 @@
"id": "uVyxXyhMRQvd"
},
"source": [
- "### Amar Shaw\n",
- "* Computer Science Engineering,(August, 2019)"
+ "### Parth Sharma\n",
+ "* Computer Science and Engineering,(March, 2022)"
]
},
{
@@ -1270,4 +1270,4 @@
},
"nbformat": 4,
"nbformat_minor": 0
-}
\ No newline at end of file
+}