{"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":{}},{"cell_type":"markdown","source":"**Second Approach**\n\nPerform dimensionality reduction using PCA on user_feature and item_feature matrices","metadata":{}},{"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":{}},{"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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-03-17T07:19:17.722183Z","iopub.execute_input":"2022-03-17T07:19:17.722704Z","iopub.status.idle":"2022-03-17T07:19:17.727411Z","shell.execute_reply.started":"2022-03-17T07:19:17.722669Z","shell.execute_reply":"2022-03-17T07:19:17.726577Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:19:17.937306Z","iopub.execute_input":"2022-03-17T07:19:17.937619Z","iopub.status.idle":"2022-03-17T07:19:19.422143Z","shell.execute_reply.started":"2022-03-17T07:19:17.937587Z","shell.execute_reply":"2022-03-17T07:19:19.421147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:19:19.423867Z","iopub.execute_input":"2022-03-17T07:19:19.424075Z","iopub.status.idle":"2022-03-17T07:19:19.429920Z","shell.execute_reply.started":"2022-03-17T07:19:19.424048Z","shell.execute_reply":"2022-03-17T07:19:19.429102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:19:19.431143Z","iopub.execute_input":"2022-03-17T07:19:19.431368Z","iopub.status.idle":"2022-03-17T07:19:19.459180Z","shell.execute_reply.started":"2022-03-17T07:19:19.431338Z","shell.execute_reply":"2022-03-17T07:19:19.458387Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:19:19.461325Z","iopub.execute_input":"2022-03-17T07:19:19.461804Z","iopub.status.idle":"2022-03-17T07:19:19.864312Z","shell.execute_reply.started":"2022-03-17T07:19:19.461757Z","shell.execute_reply":"2022-03-17T07:19:19.863448Z"},"trusted":true},"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.status.busy":"2022-03-17T07:19:19.865539Z","iopub.execute_input":"2022-03-17T07:19:19.865793Z","iopub.status.idle":"2022-03-17T07:20:17.179585Z","shell.execute_reply.started":"2022-03-17T07:19:19.865764Z","shell.execute_reply":"2022-03-17T07:20:17.178519Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:20:17.181752Z","iopub.execute_input":"2022-03-17T07:20:17.182020Z","iopub.status.idle":"2022-03-17T07:20:25.725420Z","shell.execute_reply.started":"2022-03-17T07:20:17.181988Z","shell.execute_reply":"2022-03-17T07:20:25.724800Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:20:25.726695Z","iopub.execute_input":"2022-03-17T07:20:25.727112Z","iopub.status.idle":"2022-03-17T07:20:25.879496Z","shell.execute_reply.started":"2022-03-17T07:20:25.727082Z","shell.execute_reply":"2022-03-17T07:20:25.878653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scores = normalized_user_feature.dot(item_feature.T)\nscores","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:20:25.881260Z","iopub.execute_input":"2022-03-17T07:20:25.881791Z","iopub.status.idle":"2022-03-17T07:20:30.308987Z","shell.execute_reply.started":"2022-03-17T07:20:25.881733Z","shell.execute_reply":"2022-03-17T07:20:30.308133Z"},"trusted":true},"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.status.busy":"2022-03-17T06:20:12.50207Z","iopub.execute_input":"2022-03-17T06:20:12.502653Z","iopub.status.idle":"2022-03-17T06:28:04.930968Z","shell.execute_reply.started":"2022-03-17T06:20:12.502612Z","shell.execute_reply":"2022-03-17T06:28:04.929309Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:20:30.310494Z","iopub.execute_input":"2022-03-17T07:20:30.310967Z","iopub.status.idle":"2022-03-17T07:20:30.319630Z","shell.execute_reply.started":"2022-03-17T07:20:30.310924Z","shell.execute_reply":"2022-03-17T07:20:30.318354Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:20:30.325213Z","iopub.execute_input":"2022-03-17T07:20:30.325877Z","iopub.status.idle":"2022-03-17T07:20:30.336245Z","shell.execute_reply.started":"2022-03-17T07:20:30.325820Z","shell.execute_reply":"2022-03-17T07:20:30.334911Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:20:30.340332Z","iopub.execute_input":"2022-03-17T07:20:30.340783Z","iopub.status.idle":"2022-03-17T07:20:30.351622Z","shell.execute_reply.started":"2022-03-17T07:20:30.340733Z","shell.execute_reply":"2022-03-17T07:20:30.350697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.decomposition import PCA","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:21:03.347830Z","iopub.execute_input":"2022-03-17T07:21:03.348088Z","iopub.status.idle":"2022-03-17T07:21:03.352390Z","shell.execute_reply.started":"2022-03-17T07:21:03.348061Z","shell.execute_reply":"2022-03-17T07:21:03.351392Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:21:04.683347Z","iopub.execute_input":"2022-03-17T07:21:04.683675Z","iopub.status.idle":"2022-03-17T07:21:06.592504Z","shell.execute_reply.started":"2022-03-17T07:21:04.683622Z","shell.execute_reply":"2022-03-17T07:21:06.591595Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:21:06.594568Z","iopub.execute_input":"2022-03-17T07:21:06.594993Z","iopub.status.idle":"2022-03-17T07:21:06.851035Z","shell.execute_reply.started":"2022-03-17T07:21:06.594961Z","shell.execute_reply":"2022-03-17T07:21:06.849453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scores_pca = user_feature_pca.dot(item_feature_pca.T)","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:21:06.852872Z","iopub.execute_input":"2022-03-17T07:21:06.853549Z","iopub.status.idle":"2022-03-17T07:21:10.961883Z","shell.execute_reply.started":"2022-03-17T07:21:06.853489Z","shell.execute_reply":"2022-03-17T07:21:10.960837Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:21:10.964454Z","iopub.execute_input":"2022-03-17T07:21:10.965515Z","iopub.status.idle":"2022-03-17T07:21:10.970352Z","shell.execute_reply.started":"2022-03-17T07:21:10.965425Z","shell.execute_reply":"2022-03-17T07:21:10.969506Z"},"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":{"execution":{"iopub.status.busy":"2022-03-17T07:21:10.972350Z","iopub.execute_input":"2022-03-17T07:21:10.973082Z","iopub.status.idle":"2022-03-17T07:21:11.010754Z","shell.execute_reply.started":"2022-03-17T07:21:10.973025Z","shell.execute_reply":"2022-03-17T07:21:11.009627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_prev(prev_items)","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:21:13.356220Z","iopub.execute_input":"2022-03-17T07:21:13.356510Z","iopub.status.idle":"2022-03-17T07:21:14.347567Z","shell.execute_reply.started":"2022-03-17T07:21:13.356478Z","shell.execute_reply":"2022-03-17T07:21:14.346605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_rcmnd(rcmnds)","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:21:14.349418Z","iopub.execute_input":"2022-03-17T07:21:14.349721Z","iopub.status.idle":"2022-03-17T07:21:17.643945Z","shell.execute_reply.started":"2022-03-17T07:21:14.349682Z","shell.execute_reply":"2022-03-17T07:21:17.643182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_rcmnd(rcmnds_pca)","metadata":{"execution":{"iopub.status.busy":"2022-03-17T07:21:17.645168Z","iopub.execute_input":"2022-03-17T07:21:17.645392Z","iopub.status.idle":"2022-03-17T07:21:20.688393Z","shell.execute_reply.started":"2022-03-17T07:21:17.645362Z","shell.execute_reply":"2022-03-17T07:21:20.687275Z"},"trusted":true},"execution_count":null,"outputs":[]}]}