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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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
0A39HTATAQ9V7YF02056164615.01369699200
1A3JM6GV9MNOF9X05589252783.01355443200
2A1Z513UWSAAO0F05589252785.01404691200
3A1WMRR494NWEWV07330019984.01382572800
4A3IAAVS479H7M707371044731.01274227200
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Rating
ProductId
B001MA0QY27533
B0009V1YR82869
B0043OYFKU2477
B0000YUXI02143
B003V265QW2088
B000ZMBSPE2041
B003BQ6QXK1918
B004OHQR1Q1885
B00121UVU01838
B000FS05VG1589
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ProductId0205616461055892527807330019980737104473076245145913041392121304139220130414089X130414643X1304146537...B000052YPEB000052YPFB000052YPGB000052YPHB000052YPMB000052YPUB000052YPVB000052YPYB000052YQ0B000052YQ2
UserId
A00205921JHJK5X9LNP420000000000...0000000000
A024581134CV80ZBLIZTZ0000000000...0000000000
A03056581JJIOL5FSKJY70000000000...0000000000
A03099101ZRK4K607JVHH0000000000...0000000000
A0505229A7NSH3FRXRR40000000000...0000000000
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
UserIdA00205921JHJK5X9LNP42A024581134CV80ZBLIZTZA03056581JJIOL5FSKJY7A03099101ZRK4K607JVHHA0505229A7NSH3FRXRR4A05492663T95KW63BR75KA059547920Q3LZVFHLPI3A07410232KYRFR25CIUGJA082796624UNM47DSAI6KA0864963DOAY7LXGS5I6...AZW1HXXYAC15BAZWRTJPN7NXTAZWTXHXZXFAYPAZYQEFB9Y5N22AZZHB6U54UDYWAZZHJZP4GQPPZAZZNK89PXD006AZZOFVMQC0BJGAZZQXL8VDCFTVAZZTJQ7CQZUD8
ProductId
02056164610000000000...0000000000
05589252780000000000...0000000000
07330019980000000000...0000000000
07371044730000000000...0000000000
07624514590000000000...0000000000
\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 +}