{"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.689290","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","execution":{"iopub.execute_input":"2022-03-17T07:24:14.797353Z","iopub.status.busy":"2022-03-17T07:24:14.796652Z","iopub.status.idle":"2022-03-17T07:24:15.515762Z","shell.execute_reply":"2022-03-17T07:24:15.516282Z","shell.execute_reply.started":"2022-03-17T07:19:17.722669Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:24:15.574667Z","iopub.status.busy":"2022-03-17T07:24:15.573760Z","iopub.status.idle":"2022-03-17T07:24:17.390427Z","shell.execute_reply":"2022-03-17T07:24:17.389809Z","shell.execute_reply.started":"2022-03-17T07:19:17.937587Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:24:17.447585Z","iopub.status.busy":"2022-03-17T07:24:17.446688Z","iopub.status.idle":"2022-03-17T07:24:17.451137Z","shell.execute_reply":"2022-03-17T07:24:17.451651Z","shell.execute_reply.started":"2022-03-17T07:19:19.424048Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:24:17.508287Z","iopub.status.busy":"2022-03-17T07:24:17.507549Z","iopub.status.idle":"2022-03-17T07:24:17.531653Z","shell.execute_reply":"2022-03-17T07:24:17.531035Z","shell.execute_reply.started":"2022-03-17T07:19:19.431338Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:24:17.600629Z","iopub.status.busy":"2022-03-17T07:24:17.595258Z","iopub.status.idle":"2022-03-17T07:24:18.026900Z","shell.execute_reply":"2022-03-17T07:24:18.027455Z","shell.execute_reply.started":"2022-03-17T07:19:19.461757Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"minimum_items = 2\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":{"execution":{"iopub.execute_input":"2022-03-17T07:24:18.099405Z","iopub.status.busy":"2022-03-17T07:24:18.093462Z","iopub.status.idle":"2022-03-17T07:25:15.089848Z","shell.execute_reply":"2022-03-17T07:25:15.089192Z","shell.execute_reply.started":"2022-03-17T07:19:19.865764Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:15.191438Z","iopub.status.busy":"2022-03-17T07:25:15.150233Z","iopub.status.idle":"2022-03-17T07:25:23.110999Z","shell.execute_reply":"2022-03-17T07:25:23.111920Z","shell.execute_reply.started":"2022-03-17T07:20:17.181988Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:23.177830Z","iopub.status.busy":"2022-03-17T07:25:23.177059Z","iopub.status.idle":"2022-03-17T07:25:23.335437Z","shell.execute_reply":"2022-03-17T07:25:23.335963Z","shell.execute_reply.started":"2022-03-17T07:20:25.727082Z"},"papermill":{"duration":0.194438,"end_time":"2022-03-17T07:25:23.336178","exception":false,"start_time":"2022-03-17T07:25:23.141740","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scores = normalized_user_feature.dot(item_feature.T)\nscores","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:23.400833Z","iopub.status.busy":"2022-03-17T07:25:23.400074Z","iopub.status.idle":"2022-03-17T07:25:28.457103Z","shell.execute_reply":"2022-03-17T07:25:28.458023Z","shell.execute_reply.started":"2022-03-17T07:20:25.881733Z"},"papermill":{"duration":5.092181,"end_time":"2022-03-17T07:25:28.458330","exception":false,"start_time":"2022-03-17T07:25:23.366149","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# normalized_user_feature.to_csv('normalized_user_feature.csv')\n# item_feature.to_csv('item_feature.csv')\n# scores.to_csv('scores.csv')","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:28.539362Z","iopub.status.busy":"2022-03-17T07:25:28.538153Z","iopub.status.idle":"2022-03-17T07:25:28.540186Z","shell.execute_reply":"2022-03-17T07:25:28.540711Z","shell.execute_reply.started":"2022-03-17T06:20:12.502612Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:28.611530Z","iopub.status.busy":"2022-03-17T07:25:28.610382Z","iopub.status.idle":"2022-03-17T07:25:28.613176Z","shell.execute_reply":"2022-03-17T07:25:28.613680Z","shell.execute_reply.started":"2022-03-17T07:20:30.310924Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:28.683284Z","iopub.status.busy":"2022-03-17T07:25:28.682547Z","iopub.status.idle":"2022-03-17T07:25:28.685593Z","shell.execute_reply":"2022-03-17T07:25:28.686072Z","shell.execute_reply.started":"2022-03-17T07:20:30.325820Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:28.755136Z","iopub.status.busy":"2022-03-17T07:25:28.754522Z","iopub.status.idle":"2022-03-17T07:25:28.757573Z","shell.execute_reply":"2022-03-17T07:25:28.757035Z","shell.execute_reply.started":"2022-03-17T07:20:30.340733Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.decomposition import PCA","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:28.822667Z","iopub.status.busy":"2022-03-17T07:25:28.822040Z","iopub.status.idle":"2022-03-17T07:25:29.713952Z","shell.execute_reply":"2022-03-17T07:25:29.713347Z","shell.execute_reply.started":"2022-03-17T07:21:03.348061Z"},"papermill":{"duration":0.925603,"end_time":"2022-03-17T07:25:29.714100","exception":false,"start_time":"2022-03-17T07:25:28.788497","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pca = PCA(n_components=100)\npca.fit(normalized_user_feature)\npca.explained_variance_ratio_.sum()","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:29.789003Z","iopub.status.busy":"2022-03-17T07:25:29.787734Z","iopub.status.idle":"2022-03-17T07:25:31.923744Z","shell.execute_reply":"2022-03-17T07:25:31.923126Z","shell.execute_reply.started":"2022-03-17T07:21:04.683622Z"},"papermill":{"duration":2.178788,"end_time":"2022-03-17T07:25:31.923890","exception":false,"start_time":"2022-03-17T07:25:29.745102","status":"completed"},"tags":[]},"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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:32.000654Z","iopub.status.busy":"2022-03-17T07:25:31.999288Z","iopub.status.idle":"2022-03-17T07:25:32.248774Z","shell.execute_reply":"2022-03-17T07:25:32.247620Z","shell.execute_reply.started":"2022-03-17T07:21:06.594961Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"scores_pca = user_feature_pca.dot(item_feature_pca.T)","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:33.075412Z","iopub.status.busy":"2022-03-17T07:25:32.359268Z","iopub.status.idle":"2022-03-17T07:25:34.038282Z","shell.execute_reply":"2022-03-17T07:25:34.039131Z","shell.execute_reply.started":"2022-03-17T07:21:06.853489Z"},"papermill":{"duration":1.733448,"end_time":"2022-03-17T07:25:34.039438","exception":false,"start_time":"2022-03-17T07:25:32.305990","status":"completed"},"tags":[]},"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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:34.161762Z","iopub.status.busy":"2022-03-17T07:25:34.161007Z","iopub.status.idle":"2022-03-17T07:25:34.163670Z","shell.execute_reply":"2022-03-17T07:25:34.163024Z","shell.execute_reply.started":"2022-03-17T07:21:10.965425Z"},"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_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":{"execution":{"iopub.execute_input":"2022-03-17T07:25:34.231897Z","iopub.status.busy":"2022-03-17T07:25:34.231248Z","iopub.status.idle":"2022-03-17T07:25:34.249609Z","shell.execute_reply":"2022-03-17T07:25:34.250193Z","shell.execute_reply.started":"2022-03-17T07:21:10.973025Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"plot_prev(prev_items)","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:34.318649Z","iopub.status.busy":"2022-03-17T07:25:34.317949Z","iopub.status.idle":"2022-03-17T07:25:35.378739Z","shell.execute_reply":"2022-03-17T07:25:35.379269Z","shell.execute_reply.started":"2022-03-17T07:21:13.356478Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"plot_rcmnd(rcmnds)","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:35.451978Z","iopub.status.busy":"2022-03-17T07:25:35.451296Z","iopub.status.idle":"2022-03-17T07:25:38.805601Z","shell.execute_reply":"2022-03-17T07:25:38.806140Z","shell.execute_reply.started":"2022-03-17T07:21:14.349682Z"},"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_count":null,"outputs":[]},{"cell_type":"code","source":"plot_rcmnd(rcmnds_pca)","metadata":{"execution":{"iopub.execute_input":"2022-03-17T07:25:38.892431Z","iopub.status.busy":"2022-03-17T07:25:38.891708Z","iopub.status.idle":"2022-03-17T07:25:41.989947Z","shell.execute_reply":"2022-03-17T07:25:41.990456Z","shell.execute_reply.started":"2022-03-17T07:21:17.645362Z"},"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_count":null,"outputs":[]}]}