{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"**Using Content Based Filtering to recommend similar items by:**\n1. Creating user-feature matrix\n1. Creating item-feature matrix\n1. Measuring similraity using dot product as metric\n1. Recommending top-k similar items \n","metadata":{"papermill":{"duration":0.025745,"end_time":"2022-03-17T07:24:14.640541","exception":false,"start_time":"2022-03-17T07:24:14.614796","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"**Second Approach**\n\nPerform dimensionality reduction using PCA on user_feature and item_feature matrices","metadata":{"papermill":{"duration":0.023954,"end_time":"2022-03-17T07:24:14.68929","exception":false,"start_time":"2022-03-17T07:24:14.665336","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"**I used first 20000 rows from transactions record**\n\n**Limited customers to customers who bought at least two items**\n","metadata":{"papermill":{"duration":0.023756,"end_time":"2022-03-17T07:24:14.737099","exception":false,"start_time":"2022-03-17T07:24:14.713343","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt\nimport plotly.graph_objects as go\nfrom skimage import io","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":0.755267,"end_time":"2022-03-17T07:24:15.516588","exception":false,"start_time":"2022-03-17T07:24:14.761321","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:36:37.894286Z","iopub.execute_input":"2023-05-06T09:36:37.894965Z","iopub.status.idle":"2023-05-06T09:36:37.902890Z","shell.execute_reply.started":"2023-05-06T09:36:37.894902Z","shell.execute_reply":"2023-05-06T09:36:37.900907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/transactions_train.csv', chunksize=100000)\narticles = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/articles.csv')\nusers = next(df)\ndf = users.merge(articles, on='article_id')\ndf = df[['t_dat', 'customer_id', 'article_id', 'prod_name', 'product_type_name',\n       'product_group_name', \n       'graphical_appearance_name', 'colour_group_name',\n       'perceived_colour_value_name',\n       'perceived_colour_master_name',\n       'department_name', 'index_name',\n       'index_group_name', 'section_name',\n       'garment_group_name', 'detail_desc']]\n\nfeature_subset = ['product_group_name', \n       'graphical_appearance_name', 'colour_group_name',\n       'perceived_colour_value_name',\n       'perceived_colour_master_name',\n       'department_name', 'index_name',\n       'index_group_name', 'section_name',\n       'garment_group_name']","metadata":{"papermill":{"duration":1.849423,"end_time":"2022-03-17T07:24:17.390568","exception":false,"start_time":"2022-03-17T07:24:15.541145","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:36:37.905423Z","iopub.execute_input":"2023-05-06T09:36:37.906571Z","iopub.status.idle":"2023-05-06T09:36:39.496431Z","shell.execute_reply.started":"2023-05-06T09:36:37.906505Z","shell.execute_reply":"2023-05-06T09:36:39.494885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{"papermill":{"duration":0.037199,"end_time":"2022-03-17T07:24:17.451828","exception":false,"start_time":"2022-03-17T07:24:17.414629","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:36:39.498192Z","iopub.execute_input":"2023-05-06T09:36:39.499114Z","iopub.status.idle":"2023-05-06T09:36:39.508068Z","shell.execute_reply.started":"2023-05-06T09:36:39.499048Z","shell.execute_reply":"2023-05-06T09:36:39.506212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"papermill":{"duration":0.054823,"end_time":"2022-03-17T07:24:17.531816","exception":false,"start_time":"2022-03-17T07:24:17.476993","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:36:39.511054Z","iopub.execute_input":"2023-05-06T09:36:39.511520Z","iopub.status.idle":"2023-05-06T09:36:39.537510Z","shell.execute_reply.started":"2023-05-06T09:36:39.511478Z","shell.execute_reply":"2023-05-06T09:36:39.536102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Choose features to build feature space\nfeatures = feature_subset\ndf1 = df[['customer_id', 'article_id'] + features]\ndummies_df = pd.get_dummies(df1, columns=features)\ndummies_df","metadata":{"papermill":{"duration":0.469964,"end_time":"2022-03-17T07:24:18.027669","exception":false,"start_time":"2022-03-17T07:24:17.557705","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:36:39.541180Z","iopub.execute_input":"2023-05-06T09:36:39.541707Z","iopub.status.idle":"2023-05-06T09:36:39.807380Z","shell.execute_reply.started":"2023-05-06T09:36:39.541663Z","shell.execute_reply":"2023-05-06T09:36:39.806002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"minimum_items = 4\ngroupby_customer = dummies_df.groupby('customer_id')\n\nl = []\ncutomer_ids = []\narticle_ids = []\nfor key in groupby_customer.groups.keys():\n    temp = groupby_customer.get_group(key)\n    if temp.article_id.nunique() >= minimum_items:\n        l.append(temp.drop('article_id', axis=1).sum(numeric_only=True).values)\n        cutomer_ids.append(key)\n        article_ids.extend(temp.article_id.values.tolist())","metadata":{"papermill":{"duration":57.035824,"end_time":"2022-03-17T07:25:15.090016","exception":false,"start_time":"2022-03-17T07:24:18.054192","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:36:39.809356Z","iopub.execute_input":"2023-05-06T09:36:39.810192Z","iopub.status.idle":"2023-05-06T09:37:11.683769Z","shell.execute_reply.started":"2023-05-06T09:36:39.810141Z","shell.execute_reply":"2023-05-06T09:37:11.682399Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nuser_feature = pd.DataFrame(l, columns = dummies_df.columns[2:])\nnormalized_user_feature = user_feature.div(user_feature.sum(axis=1), axis=0)\nnormalized_user_feature.insert(0, 'customer_id', cutomer_ids)\nnormalized_user_feature = normalized_user_feature.set_index('customer_id')\nnormalized_user_feature","metadata":{"papermill":{"duration":7.992833,"end_time":"2022-03-17T07:25:23.112219","exception":false,"start_time":"2022-03-17T07:25:15.119386","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:11.685424Z","iopub.execute_input":"2023-05-06T09:37:11.685845Z","iopub.status.idle":"2023-05-06T09:37:14.858754Z","shell.execute_reply.started":"2023-05-06T09:37:11.685808Z","shell.execute_reply":"2023-05-06T09:37:14.857358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_feature = dummies_df.drop_duplicates(subset='article_id')\nitem_feature = item_feature[item_feature.article_id.isin(article_ids)].drop('customer_id', axis=1)\nitem_feature = item_feature.set_index('article_id')\nitem_feature","metadata":{"papermill":{"duration":0.194438,"end_time":"2022-03-17T07:25:23.336178","exception":false,"start_time":"2022-03-17T07:25:23.14174","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:14.861183Z","iopub.execute_input":"2023-05-06T09:37:14.862104Z","iopub.status.idle":"2023-05-06T09:37:14.960706Z","shell.execute_reply.started":"2023-05-06T09:37:14.862032Z","shell.execute_reply":"2023-05-06T09:37:14.959108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scores = normalized_user_feature.dot(item_feature.T)\nscores","metadata":{"papermill":{"duration":5.092181,"end_time":"2022-03-17T07:25:28.45833","exception":false,"start_time":"2022-03-17T07:25:23.366149","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:14.966235Z","iopub.execute_input":"2023-05-06T09:37:14.966681Z","iopub.status.idle":"2023-05-06T09:37:16.944071Z","shell.execute_reply.started":"2023-05-06T09:37:14.966640Z","shell.execute_reply":"2023-05-06T09:37:16.942140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# normalized_user_feature.to_csv('normalized_user_feature.csv')\n# ite_feature.to_csv('item_feature.csv')\n# scores.to_csv('scores.csv')","metadata":{"papermill":{"duration":0.039617,"end_time":"2022-03-17T07:25:28.540926","exception":false,"start_time":"2022-03-17T07:25:28.501309","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:16.949119Z","iopub.execute_input":"2023-05-06T09:37:16.949699Z","iopub.status.idle":"2023-05-06T09:37:16.955147Z","shell.execute_reply.started":"2023-05-06T09:37:16.949640Z","shell.execute_reply":"2023-05-06T09:37:16.953809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_rcmnd(customer_id, scores):\n    cutomer_scores = scores.loc[customer_id]\n    customer_prev_items = groupby_customer.get_group(customer_id)['article_id']\n    prev_dropped = cutomer_scores.drop(customer_prev_items.values)\n    ordered = prev_dropped.sort_values(ascending=False)   \n    return ordered, customer_prev_items","metadata":{"papermill":{"duration":0.04178,"end_time":"2022-03-17T07:25:28.613905","exception":false,"start_time":"2022-03-17T07:25:28.572125","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:16.956927Z","iopub.execute_input":"2023-05-06T09:37:16.958261Z","iopub.status.idle":"2023-05-06T09:37:16.967568Z","shell.execute_reply.started":"2023-05-06T09:37:16.958209Z","shell.execute_reply":"2023-05-06T09:37:16.966618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_prev(prev_items):\n    fig = plt.figure(figsize=(20, 10))\n    for item, i in zip(prev_items, range(1, len(prev_items)+1)):\n        item = '0' + str(item)\n        sub = item[:3]\n        image = path + \"/\"+ sub + \"/\"+ item +\".jpg\"\n        image = plt.imread(image)\n        fig.add_subplot(1, 6, i)\n        plt.imshow(image)","metadata":{"papermill":{"duration":0.041678,"end_time":"2022-03-17T07:25:28.686289","exception":false,"start_time":"2022-03-17T07:25:28.644611","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:16.969344Z","iopub.execute_input":"2023-05-06T09:37:16.970694Z","iopub.status.idle":"2023-05-06T09:37:16.979536Z","shell.execute_reply.started":"2023-05-06T09:37:16.970637Z","shell.execute_reply":"2023-05-06T09:37:16.978552Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_rcmnd(rcmnds):\n    fig = plt.figure(figsize=(20, 10))\n    for item, i in zip(rcmnds, range(1, k+1)):\n        item = '0' + str(item)\n        sub = item[:3]\n        image = path + \"/\"+ sub + \"/\"+ item +\".jpg\"\n        image = plt.imread(image)\n        fig.add_subplot(1, 6, i)\n        plt.imshow(image)","metadata":{"papermill":{"duration":0.040845,"end_time":"2022-03-17T07:25:28.757709","exception":false,"start_time":"2022-03-17T07:25:28.716864","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:16.981477Z","iopub.execute_input":"2023-05-06T09:37:16.983158Z","iopub.status.idle":"2023-05-06T09:37:16.993234Z","shell.execute_reply.started":"2023-05-06T09:37:16.983095Z","shell.execute_reply":"2023-05-06T09:37:16.992138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.decomposition import PCA","metadata":{"papermill":{"duration":0.925603,"end_time":"2022-03-17T07:25:29.7141","exception":false,"start_time":"2022-03-17T07:25:28.788497","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:16.994901Z","iopub.execute_input":"2023-05-06T09:37:16.996295Z","iopub.status.idle":"2023-05-06T09:37:17.006554Z","shell.execute_reply.started":"2023-05-06T09:37:16.996241Z","shell.execute_reply":"2023-05-06T09:37:17.005391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pca = PCA(n_components=100)\npca.fit(normalized_user_feature)\npca.explained_variance_ratio_.sum()","metadata":{"papermill":{"duration":2.178788,"end_time":"2022-03-17T07:25:31.92389","exception":false,"start_time":"2022-03-17T07:25:29.745102","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:17.008261Z","iopub.execute_input":"2023-05-06T09:37:17.009304Z","iopub.status.idle":"2023-05-06T09:37:17.511919Z","shell.execute_reply.started":"2023-05-06T09:37:17.009249Z","shell.execute_reply":"2023-05-06T09:37:17.510488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"user_feature_pca = pd.DataFrame(pca.transform(normalized_user_feature), columns=['component_{}'.format(i) for i in range(1, 101)]).set_index(normalized_user_feature.index)\nitem_feature_pca = pd.DataFrame(pca.transform(item_feature), columns=['component_{}'.format(i) for i in range(1, 101)]).set_index(item_feature.index)","metadata":{"papermill":{"duration":0.29396,"end_time":"2022-03-17T07:25:32.249013","exception":false,"start_time":"2022-03-17T07:25:31.955053","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:17.514091Z","iopub.execute_input":"2023-05-06T09:37:17.515042Z","iopub.status.idle":"2023-05-06T09:37:17.725887Z","shell.execute_reply.started":"2023-05-06T09:37:17.514984Z","shell.execute_reply":"2023-05-06T09:37:17.723896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scores_pca = user_feature_pca.dot(item_feature_pca.T)","metadata":{"papermill":{"duration":1.733448,"end_time":"2022-03-17T07:25:34.039438","exception":false,"start_time":"2022-03-17T07:25:32.30599","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:17.728751Z","iopub.execute_input":"2023-05-06T09:37:17.729882Z","iopub.status.idle":"2023-05-06T09:37:18.530175Z","shell.execute_reply.started":"2023-05-06T09:37:17.729821Z","shell.execute_reply":"2023-05-06T09:37:18.528151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# user_feature_pca.to_csv('user_feature_pca.csv')\n# item_feature_pca.to_csv('item_feature_pca.csv')\n# scores_pca.to_csv('scores_pca.csv')","metadata":{"papermill":{"duration":0.066825,"end_time":"2022-03-17T07:25:34.163824","exception":false,"start_time":"2022-03-17T07:25:34.096999","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:18.532798Z","iopub.execute_input":"2023-05-06T09:37:18.533825Z","iopub.status.idle":"2023-05-06T09:37:18.538966Z","shell.execute_reply.started":"2023-05-06T09:37:18.533748Z","shell.execute_reply":"2023-05-06T09:37:18.537567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"k = 6\ncustomer_id = scores.index[1]\nrcmnds, prev_items = get_rcmnd(customer_id, scores)\nrcmnds_pca, prev_items = get_rcmnd(customer_id, scores_pca)\nrcmnds = rcmnds.index.values[:k]\nrcmnds_pca = rcmnds_pca.index.values[:k]\npath = \"../input/h-and-m-personalized-fashion-recommendations/images\"","metadata":{"papermill":{"duration":0.054558,"end_time":"2022-03-17T07:25:34.250434","exception":false,"start_time":"2022-03-17T07:25:34.195876","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:18.540823Z","iopub.execute_input":"2023-05-06T09:37:18.541404Z","iopub.status.idle":"2023-05-06T09:37:18.583694Z","shell.execute_reply.started":"2023-05-06T09:37:18.541353Z","shell.execute_reply":"2023-05-06T09:37:18.581668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_prev(prev_items)","metadata":{"papermill":{"duration":1.096177,"end_time":"2022-03-17T07:25:35.379472","exception":false,"start_time":"2022-03-17T07:25:34.283295","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:18.586961Z","iopub.execute_input":"2023-05-06T09:37:18.588443Z","iopub.status.idle":"2023-05-06T09:37:21.162382Z","shell.execute_reply.started":"2023-05-06T09:37:18.588362Z","shell.execute_reply":"2023-05-06T09:37:21.160888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_rcmnd(rcmnds)","metadata":{"papermill":{"duration":3.392296,"end_time":"2022-03-17T07:25:38.806371","exception":false,"start_time":"2022-03-17T07:25:35.414075","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:21.163874Z","iopub.execute_input":"2023-05-06T09:37:21.164287Z","iopub.status.idle":"2023-05-06T09:37:25.079147Z","shell.execute_reply.started":"2023-05-06T09:37:21.164249Z","shell.execute_reply":"2023-05-06T09:37:25.077590Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_rcmnd(rcmnds_pca)","metadata":{"papermill":{"duration":3.142912,"end_time":"2022-03-17T07:25:41.990661","exception":false,"start_time":"2022-03-17T07:25:38.847749","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-05-06T09:37:25.081232Z","iopub.execute_input":"2023-05-06T09:37:25.082372Z","iopub.status.idle":"2023-05-06T09:37:28.922314Z","shell.execute_reply.started":"2023-05-06T09:37:25.082310Z","shell.execute_reply":"2023-05-06T09:37:28.921186Z"},"trusted":true},"execution_count":null,"outputs":[]}]}