{"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":"import pandas as pd\nimport numpy as np\nimport tensorflow as tf\nimport keras\n\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.applications.efficientnet import EfficientNetB7,preprocess_input\nfrom tensorflow.keras.applications.vgg19 import VGG19, preprocess_input\nfrom tensorflow.keras import layers","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:18:43.68297Z","iopub.execute_input":"2022-03-05T02:18:43.683314Z","iopub.status.idle":"2022-03-05T02:18:51.353694Z","shell.execute_reply.started":"2022-03-05T02:18:43.683232Z","shell.execute_reply":"2022-03-05T02:18:51.35238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Import and Examine Articles Dataset","metadata":{}},{"cell_type":"code","source":"articles_df = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/articles.csv')","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:19:22.29257Z","iopub.execute_input":"2022-03-05T02:19:22.292901Z","iopub.status.idle":"2022-03-05T02:19:23.188342Z","shell.execute_reply.started":"2022-03-05T02:19:22.292864Z","shell.execute_reply":"2022-03-05T02:19:23.187136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:19:25.746163Z","iopub.execute_input":"2022-03-05T02:19:25.746702Z","iopub.status.idle":"2022-03-05T02:19:25.783086Z","shell.execute_reply.started":"2022-03-05T02:19:25.746674Z","shell.execute_reply":"2022-03-05T02:19:25.782083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"columns = list(articles_df.columns.values)","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:19:30.783196Z","iopub.execute_input":"2022-03-05T02:19:30.783787Z","iopub.status.idle":"2022-03-05T02:19:30.789042Z","shell.execute_reply.started":"2022-03-05T02:19:30.783751Z","shell.execute_reply":"2022-03-05T02:19:30.787451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data clean up\n- we want to remove columns with 'name' as they are repeats of columns with 'no' which will be enough to identify the features","metadata":{}},{"cell_type":"code","source":"columns","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:19:32.674391Z","iopub.execute_input":"2022-03-05T02:19:32.674654Z","iopub.status.idle":"2022-03-05T02:19:32.68209Z","shell.execute_reply.started":"2022-03-05T02:19:32.674625Z","shell.execute_reply":"2022-03-05T02:19:32.680921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Remvoing the header **detail_desc** for now\n- possible idea to use it for NLP","metadata":{}},{"cell_type":"code","source":"remove_header = []\nfor header in columns:\n    if 'name' in header:\n        articles_df = articles_df.drop(columns=[header])\narticles_df = articles_df.drop(columns=['detail_desc'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles_df","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:19:42.387234Z","iopub.execute_input":"2022-03-05T02:19:42.387545Z","iopub.status.idle":"2022-03-05T02:19:42.409458Z","shell.execute_reply.started":"2022-03-05T02:19:42.387512Z","shell.execute_reply":"2022-03-05T02:19:42.408776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(articles_df['index_code'].unique())","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:19:58.10639Z","iopub.execute_input":"2022-03-05T02:19:58.106631Z","iopub.status.idle":"2022-03-05T02:19:58.119417Z","shell.execute_reply.started":"2022-03-05T02:19:58.106606Z","shell.execute_reply":"2022-03-05T02:19:58.118737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Map index_code to numbers and show the relationship","metadata":{}},{"cell_type":"code","source":"# create a mapping for index_code\nunique_index_codes = set(articles_df.index_code.values)\nindex_code2idx = {}\ncount = 0\nfor index_code in unique_index_codes:\n  index_code2idx[index_code] = count\n  count += 1","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:20:02.142117Z","iopub.execute_input":"2022-03-05T02:20:02.142447Z","iopub.status.idle":"2022-03-05T02:20:02.152036Z","shell.execute_reply.started":"2022-03-05T02:20:02.142408Z","shell.execute_reply":"2022-03-05T02:20:02.151277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"index_code2idx","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:20:04.54242Z","iopub.execute_input":"2022-03-05T02:20:04.543037Z","iopub.status.idle":"2022-03-05T02:20:04.550162Z","shell.execute_reply.started":"2022-03-05T02:20:04.542987Z","shell.execute_reply":"2022-03-05T02:20:04.548866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles_df['index_code'] = articles_df.apply(lambda row: index_code2idx[row.index_code], axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:20:07.544907Z","iopub.execute_input":"2022-03-05T02:20:07.545177Z","iopub.status.idle":"2022-03-05T02:20:08.968259Z","shell.execute_reply.started":"2022-03-05T02:20:07.545149Z","shell.execute_reply":"2022-03-05T02:20:08.966978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles_df","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:20:10.70509Z","iopub.execute_input":"2022-03-05T02:20:10.705416Z","iopub.status.idle":"2022-03-05T02:20:10.722063Z","shell.execute_reply.started":"2022-03-05T02:20:10.705385Z","shell.execute_reply":"2022-03-05T02:20:10.721088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Export dataset to CSV","metadata":{}},{"cell_type":"code","source":"articles_df.to_csv('articles_edited.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:21:17.094306Z","iopub.execute_input":"2022-03-05T02:21:17.094569Z","iopub.status.idle":"2022-03-05T02:21:17.560459Z","shell.execute_reply.started":"2022-03-05T02:21:17.094541Z","shell.execute_reply":"2022-03-05T02:21:17.559357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Merge Dataset","metadata":{}},{"cell_type":"markdown","source":"### Import edited transaction_train","metadata":{}},{"cell_type":"code","source":"transactions_df = pd.read_csv(r'../input/hnm-edited/small_transaction_train.csv')","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:33:58.789389Z","iopub.execute_input":"2022-03-05T02:33:58.789665Z","iopub.status.idle":"2022-03-05T02:33:59.262475Z","shell.execute_reply.started":"2022-03-05T02:33:58.789634Z","shell.execute_reply":"2022-03-05T02:33:59.261279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:34:01.672425Z","iopub.execute_input":"2022-03-05T02:34:01.67268Z","iopub.status.idle":"2022-03-05T02:34:01.683381Z","shell.execute_reply.started":"2022-03-05T02:34:01.672652Z","shell.execute_reply":"2022-03-05T02:34:01.682505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"joined_transactions_df = transactions_df.join(articles_df.set_index('article_id'),on='article_id', how='inner')","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:34:05.010876Z","iopub.execute_input":"2022-03-05T02:34:05.01114Z","iopub.status.idle":"2022-03-05T02:34:05.2418Z","shell.execute_reply.started":"2022-03-05T02:34:05.011109Z","shell.execute_reply":"2022-03-05T02:34:05.241114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"joined_transactions_df.shape","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:34:07.950195Z","iopub.execute_input":"2022-03-05T02:34:07.950518Z","iopub.status.idle":"2022-03-05T02:34:07.95701Z","shell.execute_reply.started":"2022-03-05T02:34:07.950475Z","shell.execute_reply":"2022-03-05T02:34:07.956252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"joined_transactions_df.nunique()","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:34:09.79243Z","iopub.execute_input":"2022-03-05T02:34:09.792671Z","iopub.status.idle":"2022-03-05T02:34:10.054321Z","shell.execute_reply.started":"2022-03-05T02:34:09.792647Z","shell.execute_reply":"2022-03-05T02:34:10.053243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"joined_transactions_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:34:17.139371Z","iopub.execute_input":"2022-03-05T02:34:17.141932Z","iopub.status.idle":"2022-03-05T02:34:17.156583Z","shell.execute_reply.started":"2022-03-05T02:34:17.141874Z","shell.execute_reply":"2022-03-05T02:34:17.155354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"joined_transactions_df.to_csv('joined_transactions_df.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-03-05T02:34:35.66352Z","iopub.execute_input":"2022-03-05T02:34:35.664039Z","iopub.status.idle":"2022-03-05T02:34:41.699695Z","shell.execute_reply.started":"2022-03-05T02:34:35.663995Z","shell.execute_reply":"2022-03-05T02:34:41.698751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"train.drop(['customer_id','article_id'],axis=1 , inplace=True)","metadata":{"execution":{"iopub.status.busy":"2022-03-04T22:27:06.298611Z","iopub.execute_input":"2022-03-04T22:27:06.299157Z","iopub.status.idle":"2022-03-04T22:27:06.509929Z","shell.execute_reply.started":"2022-03-04T22:27:06.299068Z","shell.execute_reply":"2022-03-04T22:27:06.508839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_x=train.drop(['article2idx'],axis=1)\ntrain_y=train['article2idx']","metadata":{"execution":{"iopub.status.busy":"2022-03-04T22:33:27.352934Z","iopub.execute_input":"2022-03-04T22:33:27.353326Z","iopub.status.idle":"2022-03-04T22:33:27.405631Z","shell.execute_reply.started":"2022-03-04T22:33:27.353288Z","shell.execute_reply":"2022-03-04T22:33:27.404131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_x.shape,train_y.shape","metadata":{"execution":{"iopub.status.busy":"2022-03-04T22:33:36.401939Z","iopub.execute_input":"2022-03-04T22:33:36.402343Z","iopub.status.idle":"2022-03-04T22:33:36.410437Z","shell.execute_reply.started":"2022-03-04T22:33:36.402309Z","shell.execute_reply":"2022-03-04T22:33:36.409535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## TENSORFLOW MODEL ~v1(TabTransformer)","metadata":{}},{"cell_type":"code","source":"dropout_rate=\nepsilon=\nlr=\nclasses=\nnum_heads=\nNumber_Transformer_Block=\nMLP_HIDDEN_UNITS_FACTORS = [\n]  \nNUM_MLP_BLOCKS = ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def MLP_call(hidden_units, dropout_rate, activation, normalization_layer):\n    MLP_layers=[]\n    for units in hidden_units:\n        MLP_layers.append(normalization_layer)\n        MLP_layers.append(layers.Dense(units,activation=activation))\n        MLP_layers.append(layers.Dropout(dropout_rate))\n\n\n        \ndef TabTransformer(Number_Transformer_Block,num_heads, embedding_dims, embeddings, dropout_rate, MLP_HIDDEN_UNITS_FACTORS,classes):\n    for block in range(Number_Transformer_Block):\n        attention=layers.MultiHeadAttention(\n                num_heads=num_heads,\n                key_dim=embedding_dims,\n                dropout=dropout_rate,\n                name=f'attention_block{block}'\n        )(embeddings, embeddings)\n        skip_connection= layers.Add(name=f'Skip_Connection1_{block}')([\n            attention, embeddings\n        ])\n        layer_norm=layers.layerNormalization(name=f'layer_Norm1_{block}', epsilon=1e-6)(skip_connection)\n        MLP_features=MLP_call(hidden_units=[embedding_dims],\n                     dropout_rate=dropout_rate,\n                     activation=keras.activation.gelu,\n                     normalization_layer=layers.LayerNormalization(epsilon=1e-6),\n                     name=f\"feedforward_{block}\",\n                                )(layer_norm)\n        skip_connection= layers.Add(name=f'skip_connection2_{block}')([MLP_features, layer_norm])\n        tab_features=layers.layerNormalization(name=f'layer_Norm2_{block}', epsilon=1e-6)(skip_connection)\n    tab_features=layers.Flatten()(tab_features)\n    MLP_units= [factor*tab_features.shape[-1] for factor in MLP_HIDDEN_UNITS_FACTORS]\n    features=MLP_call(\n        hidden_units=MLP_units,\n        dropout_rate=dropout_rate,\n        activation=keras.activations.selu,\n        normalization_layer=layers.BatchNormalization(),\n        name=\"MLP\",\n    )(tab_features)\n    output=layers.Dense(units=classes, activation='softmax', name='softmax')(features)\n    return output\n    \n                    \n        \n\n\n\nclass TrainData(tf.keras.Model):\n    def __init__(self,input_layer, data, **kwargs):\n        super().__init__(**kwargs)\n        \n        self.data=data\n        self.concat_tabular_embeddings, self.embedding_dims== __create_embed(input_layer, data)\n        \n    \n    def __create_embed(self,input_layer, data):\n        x=input_layer\n        output=[]\n        embedding_dims=[]\n        for category in data.columns:\n            num_unique_values=data[category].nunique()\n            embed_dim=int(min(np.ceil(num_unique_values/2),128))\n            embed_layer=layers.Embedding(num_unique_values+1,embed_dim, name=category)(inp_var)\n            out=layers.Dropout(0.3)(embed_layer)\n            out=layers.Reshape(target_shape=(embed_dim,))(out)\n            output.append(out)\n            embedding_dims.append(embed_dims)\n        concat_embeds=layers.Concatenate()(output)\n        return concat_embeds,embedding_dims\n    \n    def TabTransform(self,\n                     Number_Transformer_Block,\n                     num_heads, \n                     embedding_dims, \n                     embeddings, \n                     dropout_rate, \n                     MLP_HIDDEN_UNITS_FACTORS,\n                     classes):\n            \n            \n        \n        \n        ","metadata":{},"execution_count":null,"outputs":[]}]}