{"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":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        os.path.join(dirname, filename)\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-04-04T13:51:40.879730Z","iopub.execute_input":"2022-04-04T13:51:40.880127Z","iopub.status.idle":"2022-04-04T13:52:20.921781Z","shell.execute_reply.started":"2022-04-04T13:51:40.880013Z","shell.execute_reply":"2022-04-04T13:52:20.921058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles=pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/articles.csv')\nsub_pd=pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/sample_submission.csv')\ntransaction=pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/transactions_train.csv',usecols=['t_dat','customer_id','article_id'],dtype={'article_id': np.string_})","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:52:20.923210Z","iopub.execute_input":"2022-04-04T13:52:20.923455Z","iopub.status.idle":"2022-04-04T13:53:36.822021Z","shell.execute_reply.started":"2022-04-04T13:52:20.923426Z","shell.execute_reply":"2022-04-04T13:53:36.820367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data pre-processing","metadata":{}},{"cell_type":"code","source":"transaction['customer_id'].unique()\ndif=[]\n\nss=sub_pd['customer_id'].unique().tolist()[:10]\ntt=transaction['customer_id'].unique().tolist()[:10]\nfor s in ss:\n    if s not in tt:\n        print(s)\n        dif.append(s)\n        \ndel ss\ndel tt\nprint(\"number of who have not bought before\",len(dif))","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:53:36.824784Z","iopub.execute_input":"2022-04-04T13:53:36.825263Z","iopub.status.idle":"2022-04-04T13:53:52.680166Z","shell.execute_reply.started":"2022-04-04T13:53:36.825211Z","shell.execute_reply":"2022-04-04T13:53:52.679258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"top12=transaction.groupby('article_id')['customer_id'].nunique().sort_values(ascending=False).head(12).index.astype(int)\ntop12_forsub=''\nfor t in top12:\n    top12_forsub=top12_forsub+' '+str(t)\ndel top12\ntop12_forsub=top12_forsub[1:]\ntop12_forsub","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:53:52.682096Z","iopub.execute_input":"2022-04-04T13:53:52.682327Z","iopub.status.idle":"2022-04-04T13:54:18.434959Z","shell.execute_reply.started":"2022-04-04T13:53:52.682299Z","shell.execute_reply":"2022-04-04T13:54:18.433887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We recommend this items who didnt buy before.","metadata":{}},{"cell_type":"code","source":"articles.index=articles['article_id']\narticles=articles.loc[transaction['article_id'].unique().astype(int).tolist()]\narticles.head()\narticles=articles.drop(['article_id'], axis=1)\n\narticles=articles.drop(['product_code', 'prod_name','product_group_name','department_no','product_type_no','index_name','graphical_appearance_no','graphical_appearance_name','colour_group_code','index_code','index_group_no','section_no','garment_group_no','detail_desc','perceived_colour_value_id', 'perceived_colour_value_name','perceived_colour_master_id', 'perceived_colour_master_name'],axis=1)    \narticles['article_id']=articles.index\narticles.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:54:18.436220Z","iopub.execute_input":"2022-04-04T13:54:18.436518Z","iopub.status.idle":"2022-04-04T13:54:22.227586Z","shell.execute_reply.started":"2022-04-04T13:54:18.436490Z","shell.execute_reply":"2022-04-04T13:54:22.227006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#dummify categorical features\narticle_data = pd.get_dummies(articles, columns = ['product_type_name'])\ndel articles\narticle_data = article_data.reset_index(drop=True)\narticle_data = article_data.sort_values('article_id').reset_index().drop('index', axis=1)\narticle_data.head(5)","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:54:22.228505Z","iopub.execute_input":"2022-04-04T13:54:22.228849Z","iopub.status.idle":"2022-04-04T13:54:22.472225Z","shell.execute_reply.started":"2022-04-04T13:54:22.228809Z","shell.execute_reply":"2022-04-04T13:54:22.471579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from scipy.sparse import csr_matrix\narticle_data=article_data.drop(['colour_group_name','department_name','index_group_name','section_name','garment_group_name'],axis=1)    \narticles_csr = csr_matrix(article_data.drop('article_id', axis=1).values)\ndel article_data\narticles_csr","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:54:22.473435Z","iopub.execute_input":"2022-04-04T13:54:22.473796Z","iopub.status.idle":"2022-04-04T13:54:22.687062Z","shell.execute_reply.started":"2022-04-04T13:54:22.473755Z","shell.execute_reply":"2022-04-04T13:54:22.686473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transaction['t_dat']=pd.to_datetime(transaction['t_dat'])\ntransaction.index=transaction['t_dat']\ntransaction=transaction['2018-09-20':'2018-09-23']\ntransaction.index=transaction['customer_id']\ntransaction.drop(['customer_id','t_dat'],axis=1,inplace=True)\ntransaction_dm=pd.get_dummies(transaction,prefix='',prefix_sep='')\ndel transaction","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:54:22.688252Z","iopub.execute_input":"2022-04-04T13:54:22.688611Z","iopub.status.idle":"2022-04-04T13:54:48.938420Z","shell.execute_reply.started":"2022-04-04T13:54:22.688569Z","shell.execute_reply":"2022-04-04T13:54:48.937475Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"But we can do this for a few days because the data is huge. 16gb memory and time is not enough for all data.","metadata":{}},{"cell_type":"code","source":"from scipy.sparse import csr_matrix\nfrom tqdm import tqdm\ntransaction_csr = csr_matrix(transaction_dm.values)\ntransaction_csr","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:54:48.939966Z","iopub.execute_input":"2022-04-04T13:54:48.940561Z","iopub.status.idle":"2022-04-04T13:55:30.613773Z","shell.execute_reply.started":"2022-04-04T13:54:48.940514Z","shell.execute_reply":"2022-04-04T13:55:30.613043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"user_id = list(transaction_dm.index)\nuser_dict = {}\ncounter = 0 \nfor i in user_id:\n    user_dict[i] = counter\n    counter += 1","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:55:30.615678Z","iopub.execute_input":"2022-04-04T13:55:30.616046Z","iopub.status.idle":"2022-04-04T13:55:30.666061Z","shell.execute_reply.started":"2022-04-04T13:55:30.616016Z","shell.execute_reply":"2022-04-04T13:55:30.665258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modelling","metadata":{}},{"cell_type":"code","source":"from lightfm import LightFM\nmodel = LightFM(loss='warp',\n                random_state=2016,\n                learning_rate=0.90,\n                no_components=150,\n                user_alpha=0.000005)\n\nmodel = model.fit(transaction_csr,\n                  epochs=100,\n                  num_threads=16, verbose=False)","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:55:30.667733Z","iopub.execute_input":"2022-04-04T13:55:30.668220Z","iopub.status.idle":"2022-04-04T13:56:12.555610Z","shell.execute_reply.started":"2022-04-04T13:55:30.668187Z","shell.execute_reply":"2022-04-04T13:56:12.554570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"def sample_recommendation_user(model,interactions,sub_pd,user_dict,threshold = 0,nrec_items = 12, show = True):\n    j=-1\n    for user_id in tqdm(sub_pd.customer_id):\n        j=j+1\n        n_users, n_items = interactions.shape\n        if user_id in user_dict:\n            user_x = user_dict[user_id]\n            scores = pd.Series(model.predict(user_x,np.arange(n_items), item_features=articles_csr))\n            scores.index = interactions.columns\n            scores = list(pd.Series(scores.sort_values(ascending=False).index)) \n            known_items = list(pd.Series(interactions.loc[user_id,:] \\\n                                         [interactions.loc[user_id,:] > threshold].index).sort_values(ascending=False))\n            scores = [x for x in scores if x not in known_items]\n            return_score_list = scores[0:nrec_items]\n            a=''\n            for i in return_score_list:\n                a=a+' '+str(i)\n                a=a[1:]\n            sub_pd['prediction'][j]=a\n        else:\n            sub_pd['prediction'][j]=top12_forsub\n    return sub_pd","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:56:12.557337Z","iopub.execute_input":"2022-04-04T13:56:12.557702Z","iopub.status.idle":"2022-04-04T13:56:12.571471Z","shell.execute_reply.started":"2022-04-04T13:56:12.557662Z","shell.execute_reply":"2022-04-04T13:56:12.570795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_pd=sample_recommendation_user(model, transaction_dm,sub_pd, user_dict)\nsub_pd.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-04-04T13:56:12.572341Z","iopub.execute_input":"2022-04-04T13:56:12.573332Z","iopub.status.idle":"2022-04-05T00:24:25.033513Z","shell.execute_reply.started":"2022-04-04T13:56:12.573291Z","shell.execute_reply":"2022-04-05T00:24:25.032541Z"},"trusted":true},"execution_count":null,"outputs":[]}]}