{"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 tensorflow as tf\nfrom tensorflow.keras.layers import Input, Dense, Concatenate,Flatten,Lambda,Conv2D,BatchNormalization,Add,MaxPool2D,GlobalAveragePooling2D,Dropout\nfrom tensorflow.keras.models import Model,Sequential\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom keras.utils import plot_model\nfrom tensorflow.keras.optimizers import RMSprop,Adam\nfrom PIL import Image, ImageFont, ImageDraw\nfrom keras import backend as K\n# import seaborn as sns\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-07-08T01:22:22.284923Z","iopub.execute_input":"2023-07-08T01:22:22.285321Z","iopub.status.idle":"2023-07-08T01:22:31.776309Z","shell.execute_reply.started":"2023-07-08T01:22:22.285288Z","shell.execute_reply":"2023-07-08T01:22:31.775318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip '/kaggle/input/dogs-vs-cats/train.zip'","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:23:19.038864Z","iopub.execute_input":"2023-07-08T01:23:19.039309Z","iopub.status.idle":"2023-07-08T01:23:19.044957Z","shell.execute_reply.started":"2023-07-08T01:23:19.039266Z","shell.execute_reply":"2023-07-08T01:23:19.043528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ! rm -r '/kaggle/working/train'","metadata":{"execution":{"iopub.status.busy":"2023-07-07T23:42:38.477125Z","iopub.execute_input":"2023-07-07T23:42:38.477615Z","iopub.status.idle":"2023-07-07T23:42:38.482908Z","shell.execute_reply.started":"2023-07-07T23:42:38.477568Z","shell.execute_reply":"2023-07-07T23:42:38.481780Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ! mkdir '/kaggle/working/train/cats'\n# ! mkdir '/kaggle/working/train/dogs'","metadata":{"execution":{"iopub.status.busy":"2023-07-07T23:42:39.823121Z","iopub.execute_input":"2023-07-07T23:42:39.824048Z","iopub.status.idle":"2023-07-07T23:42:39.829848Z","shell.execute_reply.started":"2023-07-07T23:42:39.824012Z","shell.execute_reply":"2023-07-07T23:42:39.828826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport glob \nimage = []\nlabel = []\nbase_dir = '/kaggle/working'\ntrain_path_content = os.listdir(f'{base_dir}/train')\nprint(f'train_size: {len(train_path_content)}')\ntrain_dir = os.path.join(base_dir, 'train')\n\ntrain_imgs = glob.glob(os.path.join(train_dir, \"*\"))\nfor img in train_imgs:\n    image_name = os.path.splitext(os.path.basename(img))[0]\n    if 'cat' in image_name:\n    # move it to directory /content/train/cats\n        image.append(img)\n        label.append('cat')\n    elif 'dog' in image_name:\n    # move it to directory /content/train/dogs\n        image.append(img)\n        label.append('dog')\ndf = pd.DataFrame({'path':image,'label':label})        ","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:23:22.298094Z","iopub.execute_input":"2023-07-08T01:23:22.298656Z","iopub.status.idle":"2023-07-08T01:23:22.517501Z","shell.execute_reply.started":"2023-07-08T01:23:22.298613Z","shell.execute_reply":"2023-07-08T01:23:22.516426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:23:26.310840Z","iopub.execute_input":"2023-07-08T01:23:26.312222Z","iopub.status.idle":"2023-07-08T01:23:26.341389Z","shell.execute_reply.started":"2023-07-08T01:23:26.312159Z","shell.execute_reply":"2023-07-08T01:23:26.340232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:23:28.163976Z","iopub.execute_input":"2023-07-08T01:23:28.164408Z","iopub.status.idle":"2023-07-08T01:23:28.188151Z","shell.execute_reply.started":"2023-07-08T01:23:28.164373Z","shell.execute_reply":"2023-07-08T01:23:28.186927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sns.countplot(x=df['label'])\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-08T00:51:13.661242Z","iopub.execute_input":"2023-07-08T00:51:13.661660Z","iopub.status.idle":"2023-07-08T00:51:13.665916Z","shell.execute_reply.started":"2023-07-08T00:51:13.661626Z","shell.execute_reply":"2023-07-08T00:51:13.664956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Pre-Processing","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n\n# Define the input shape expected by the model\ninput_shape = (150, 150, 3)\n\n# Define the data generator\ndatagen = ImageDataGenerator(rescale=1./255,\n                            rotation_range=40,\n                            width_shift_range=0.2,\n                            height_shift_range=0.2,\n                            shear_range=0.2,\n                            zoom_range=0.2,\n                            horizontal_flip=True,\n                            fill_mode='nearest',\n                            validation_split=0.2)\n\n\ntrain_generator = datagen.flow_from_dataframe(dataframe=df,\n                                              directory=None,\n                                              x_col='path',\n                                              y_col='label',\n                                              subset='training',\n                                              target_size=input_shape[:2],\n                                              batch_size=16,\n                                              class_mode='categorical')\n\nval_generator = datagen.flow_from_dataframe(dataframe=df,\n                                            directory=None,\n                                            x_col='path',\n                                            y_col='label',\n                                            subset='validation',\n                                            target_size=input_shape[:2],\n                                            batch_size=16,\n                                            class_mode='categorical')\n","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:24:27.271977Z","iopub.execute_input":"2023-07-08T01:24:27.272442Z","iopub.status.idle":"2023-07-08T01:24:27.824841Z","shell.execute_reply.started":"2023-07-08T01:24:27.272408Z","shell.execute_reply":"2023-07-08T01:24:27.823764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Build Models","metadata":{}},{"cell_type":"code","source":"def plot_learning_curve(history):\n    # Plot the training and validation accuracy\n    plt.plot(history.history['accuracy'])\n    plt.plot(history.history['val_accuracy'])\n    plt.title('Model accuracy')\n    plt.ylabel('Accuracy')\n    plt.xlabel('Epoch')\n    plt.legend(['Train', 'Validation'], loc='upper left')\n    plt.show()\n\n    # Plot the training and validation loss\n    plt.plot(history.history['loss'])\n    plt.plot(history.history['val_loss'])\n    plt.title('Model loss')\n    plt.ylabel('Loss')\n    plt.xlabel('Epoch')\n    plt.legend(['Train', 'Validation'], loc='upper left')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:24:32.855287Z","iopub.execute_input":"2023-07-08T01:24:32.855658Z","iopub.status.idle":"2023-07-08T01:24:32.863363Z","shell.execute_reply.started":"2023-07-08T01:24:32.855629Z","shell.execute_reply":"2023-07-08T01:24:32.862240Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNNModel(tf.keras.Model):\n    def __init__(self,layers,filters,kernel_size):\n        super(CNNModel,self).__init__()\n        self.conv     = [Conv2D(filters,kernel_size,padding='same') for _ in range(layers)]\n        self.max_pool = [MaxPool2D((2,2)) for _ in range(layers)]\n        self.act      = [tf.keras.layers.Activation('relu') for _ in range(layers)]\n        self.conc      = Concatenate()\n    def call(self,inputs):\n        x = inputs\n        for conv,max_,act in zip(self.conv,self.max_pool,self.act):\n            x = conv(x)\n            x = act(x)\n            x = max_(x)\n#         x = self.conc([x, inputs])\n        return x\n\nclass DNNModel(tf.keras.Model):\n    def __init__(self,layers,units,activation):\n        super(DNNModel,self).__init__()\n        \n        self.hidden = [Dense(units,activation) for _ in range(layers)]\n        self.out    = Dense(units = 2,activation ='softmax')\n        self.dropout = Dropout(rate = 0.2)\n        self.flat   = Flatten()\n    def call(self,inputs):\n        x  = self.flat(inputs)\n        for layer in self.hidden:\n            x = layer(x)\n#             x = self.dropout(x)\n        return self.out(x)    \n            \n        \nclass CustomModel(tf.keras.Model):\n    def __init__(self,\n                 cnn_layers,\n                 filters,\n                 kernel_size,\n                 dnn_layers,\n                 dnn_units,\n                dnn_activation):\n        super(CustomModel,self).__init__()\n        self.block1 = CNNModel(cnn_layers,filters,kernel_size)\n        self.block2 = DNNModel(dnn_layers,dnn_units,dnn_activation)\n    def call (self,inputs):\n        x = self.block1(inputs)\n        x = self.block2(x)\n        return x\n    ","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:24:35.306390Z","iopub.execute_input":"2023-07-08T01:24:35.306758Z","iopub.status.idle":"2023-07-08T01:24:35.319076Z","shell.execute_reply.started":"2023-07-08T01:24:35.306729Z","shell.execute_reply":"2023-07-08T01:24:35.318075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the ResNet50 model\n# base_model = tf.keras.applications.ResNet50(weights='imagenet',\n#                                             include_top=False,\n#                                             input_shape=input_shape)\n\n# # Freeze the base model layers\n# for layer in base_model.layers:\n#     layer.trainable = False\n\n# model4 = tf.keras.Sequential([\n#     base_model,\n#     GlobalAveragePooling2D(),\n#     Dense(124, activation = \"relu\"),\n#     Dense(64, activation = \"relu\"),\n#     Dropout(0.2),\n#     Dense(32, activation = \"relu\"),\n#     Dense(16, activation = \"relu\"),\n#     Dropout(0.2),\n#     Dense(2, activation = \"softmax\")\n# ])\n# model4.summary()","metadata":{"execution":{"iopub.status.busy":"2023-07-08T00:06:42.291618Z","iopub.execute_input":"2023-07-08T00:06:42.292581Z","iopub.status.idle":"2023-07-08T00:06:44.783313Z","shell.execute_reply.started":"2023-07-08T00:06:42.292542Z","shell.execute_reply":"2023-07-08T00:06:44.782397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model4.compile(optimizer='adam',\n#               loss='categorical_crossentropy',\n#               metrics=['accuracy'])\n# history = model4.fit(train_generator,\n#                     epochs=10,\n#                     validation_data=val_generator)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T00:06:44.787254Z","iopub.execute_input":"2023-07-08T00:06:44.787638Z","iopub.status.idle":"2023-07-08T00:18:31.339878Z","shell.execute_reply.started":"2023-07-08T00:06:44.787603Z","shell.execute_reply":"2023-07-08T00:18:31.338729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot_learning_curve(history)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T00:20:02.675782Z","iopub.execute_input":"2023-07-08T00:20:02.676203Z","iopub.status.idle":"2023-07-08T00:20:02.680938Z","shell.execute_reply.started":"2023-07-08T00:20:02.676171Z","shell.execute_reply":"2023-07-08T00:20:02.679760Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model5 = CustomModel(cnn_layers = 4,\n#                filters=64,\n#                kernel_size= 3,\n#                dnn_layers = 3,\n#               dnn_units = 32,\n#               dnn_activation = 'relu')\n# # model5.summary()\n# model5.compile(optimizer='adam',\n#               loss='categorical_crossentropy',\n#               metrics=['accuracy'])\n# history = model5.fit(train_generator,\n#                     epochs=10,\n#                     validation_data=val_generator)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T00:26:49.199388Z","iopub.execute_input":"2023-07-08T00:26:49.200104Z","iopub.status.idle":"2023-07-08T00:38:02.579739Z","shell.execute_reply.started":"2023-07-08T00:26:49.200070Z","shell.execute_reply":"2023-07-08T00:38:02.578598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot_learning_curve(history)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T00:38:02.581961Z","iopub.execute_input":"2023-07-08T00:38:02.582266Z","iopub.status.idle":"2023-07-08T00:38:03.155393Z","shell.execute_reply.started":"2023-07-08T00:38:02.582239Z","shell.execute_reply":"2023-07-08T00:38:03.154437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNNModel2(tf.keras.Model):\n    def __init__(self,layers,filters,kernel_size):\n        super(CNNModel2,self).__init__()\n        self.conv     = [Conv2D(filters,kernel_size,padding='same') for _ in range(layers)]\n        self.max_pool = [MaxPool2D((2,2)) for _ in range(layers)]\n        self.act      = [tf.keras.layers.Activation('relu') for _ in range(layers)]\n        self.conc      = Concatenate()\n    def call(self,inputs):\n        x = inputs\n        for conv,max_,act in zip(self.conv,self.max_pool,self.act):\n            x = conv(x)\n            x = act(x)\n            x = max_(x)\n#         x = self.conc([x, inputs])\n        return x\n\nclass DNNModel2(tf.keras.Model):\n    def __init__(self,layers,units,activation):\n        super(DNNModel2,self).__init__()\n        \n        self.hidden = [Dense(units,activation) for _ in range(layers)]\n        self.out    = Dense(units = 2,activation ='softmax')\n        self.dropout = Dropout(rate = 0.2)\n        self.flat   = Flatten()\n    def call(self,inputs):\n        x  = self.flat(inputs)\n        for index,layer in enumerate(self.hidden):\n            x = layer(x)\n            if index != 0 and index%2==0:\n                x = self.dropout(x)\n        return self.out(x)    \n            \n        \nclass CustomModel2(tf.keras.Model):\n    def __init__(self,\n                 cnn_layers,\n                 filters,\n                 kernel_size,\n                 dnn_layers,\n                 dnn_units,\n                dnn_activation):\n        super(CustomModel2,self).__init__()\n        self.block1 = CNNModel2(cnn_layers,filters,kernel_size)\n        self.block2 = DNNModel2(dnn_layers,dnn_units,dnn_activation)\n    def call (self,inputs):\n        x = self.block1(inputs)\n        x = self.block2(x)\n        return x\n    ","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:26:19.806084Z","iopub.execute_input":"2023-07-08T01:26:19.807474Z","iopub.status.idle":"2023-07-08T01:26:19.825385Z","shell.execute_reply.started":"2023-07-08T01:26:19.807429Z","shell.execute_reply":"2023-07-08T01:26:19.824176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model6 = CustomModel2(cnn_layers = 4,\n#                filters=64,\n#                kernel_size= 3,\n#                dnn_layers = 3,\n#               dnn_units = 124,\n#               dnn_activation = 'relu')\n# callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3)\n# model6.compile(optimizer='adam',\n#               loss='categorical_crossentropy',\n#               metrics=['accuracy'])\n# history = model6.fit(train_generator,\n#                     epochs=10,\n#                     validation_data=val_generator,callbacks=[callback])","metadata":{"execution":{"iopub.status.busy":"2023-07-08T00:54:05.559301Z","iopub.execute_input":"2023-07-08T00:54:05.559648Z","iopub.status.idle":"2023-07-08T01:05:01.685403Z","shell.execute_reply.started":"2023-07-08T00:54:05.559620Z","shell.execute_reply":"2023-07-08T01:05:01.684176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot_learning_curve(history)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:05:04.305185Z","iopub.execute_input":"2023-07-08T01:05:04.305569Z","iopub.status.idle":"2023-07-08T01:05:04.981391Z","shell.execute_reply.started":"2023-07-08T01:05:04.305538Z","shell.execute_reply":"2023-07-08T01:05:04.980424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model7 = CustomModel2(cnn_layers = 4,\n               filters=124,\n               kernel_size= 3,\n               dnn_layers = 1,\n              dnn_units = 512,\n              dnn_activation = 'relu')\n# callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3)\nmodel7.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\nhistory = model7.fit(train_generator,\n                    epochs=50,\n                    validation_data=val_generator)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T01:26:23.026502Z","iopub.execute_input":"2023-07-08T01:26:23.026902Z","iopub.status.idle":"2023-07-08T03:56:40.762477Z","shell.execute_reply.started":"2023-07-08T01:26:23.026870Z","shell.execute_reply":"2023-07-08T03:56:40.761403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_learning_curve(history)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T03:56:45.279884Z","iopub.execute_input":"2023-07-08T03:56:45.280289Z","iopub.status.idle":"2023-07-08T03:56:45.869771Z","shell.execute_reply.started":"2023-07-08T03:56:45.280256Z","shell.execute_reply":"2023-07-08T03:56:45.867410Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# assign location\npath='/kaggle/working/Weights'\n \n# save\nmodel7.save_weights(path)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:02:03.807469Z","iopub.execute_input":"2023-07-08T04:02:03.807848Z","iopub.status.idle":"2023-07-08T04:02:04.077495Z","shell.execute_reply.started":"2023-07-08T04:02:03.807820Z","shell.execute_reply":"2023-07-08T04:02:04.076470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Prepare Test Data","metadata":{}},{"cell_type":"code","source":"! unzip /kaggle/input/dogs-vs-cats/test1.zip","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:09:41.156611Z","iopub.execute_input":"2023-07-08T04:09:41.156995Z","iopub.status.idle":"2023-07-08T04:09:41.161781Z","shell.execute_reply.started":"2023-07-08T04:09:41.156952Z","shell.execute_reply":"2023-07-08T04:09:41.160783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_filenames = os.listdir(\"/kaggle/working/test1\")\ntest_df = pd.DataFrame({\n    'filename': test_filenames\n})\nnb_samples = test_df.shape[0]\n\ntest_gen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_gen.flow_from_dataframe(\n    test_df, \n    \"./test1/\", \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=(150,150),\n    batch_size=16,\n    shuffle=False\n)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:13:19.469253Z","iopub.execute_input":"2023-07-08T04:13:19.469657Z","iopub.status.idle":"2023-07-08T04:13:19.617987Z","shell.execute_reply.started":"2023-07-08T04:13:19.469626Z","shell.execute_reply":"2023-07-08T04:13:19.616957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict = model7.predict(test_generator)","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:13:20.739347Z","iopub.execute_input":"2023-07-08T04:13:20.739777Z","iopub.status.idle":"2023-07-08T04:13:43.464392Z","shell.execute_reply.started":"2023-07-08T04:13:20.739742Z","shell.execute_reply":"2023-07-08T04:13:43.463370Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:13:44.185872Z","iopub.execute_input":"2023-07-08T04:13:44.186821Z","iopub.status.idle":"2023-07-08T04:13:44.207866Z","shell.execute_reply.started":"2023-07-08T04:13:44.186779Z","shell.execute_reply":"2023-07-08T04:13:44.200286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['category'] = np.argmax(predict, axis=-1)\nlabel_map = dict((category,filename) for filename,category in train_generator.class_indices.items())\ntest_df['category'] = test_df['category'].replace(label_map)\ntest_df['category'] = test_df['category'].replace({ 'dog': 1, 'cat': 0 })","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:14:02.438770Z","iopub.execute_input":"2023-07-08T04:14:02.439401Z","iopub.status.idle":"2023-07-08T04:14:02.462564Z","shell.execute_reply.started":"2023-07-08T04:14:02.439364Z","shell.execute_reply":"2023-07-08T04:14:02.461251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\ncategory_counts = test_df['category'].value_counts()\ncategory_percentages = category_counts / category_counts.sum() * 100\n\nplt.figure(figsize=(6, 6))\nsns.set(style='darkgrid')\nlabels = ['Dog', 'Cat']\ncolors = ['#ff9999', '#66b3ff']\n\nexplode = (0.1, 0)\n\nplt.pie(category_counts, labels=labels, colors=colors, explode=explode, autopct='%1.1f%%', startangle=90)\nplt.title('Distribution of Dogs & Cats in the predicted dataset')\nplt.axis('equal')\nplt.show()\n\nfor label, count, percentage in zip(labels, category_counts, category_percentages):\n    print(f\"{label}: {count} samples, {percentage:.1f}%\")","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:14:25.470730Z","iopub.execute_input":"2023-07-08T04:14:25.471199Z","iopub.status.idle":"2023-07-08T04:14:25.971645Z","shell.execute_reply.started":"2023-07-08T04:14:25.471142Z","shell.execute_reply":"2023-07-08T04:14:25.970414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:14:54.092397Z","iopub.execute_input":"2023-07-08T04:14:54.092773Z","iopub.status.idle":"2023-07-08T04:14:54.105596Z","shell.execute_reply.started":"2023-07-08T04:14:54.092744Z","shell.execute_reply":"2023-07-08T04:14:54.104524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.to_csv('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2023-07-08T04:16:03.825543Z","iopub.execute_input":"2023-07-08T04:16:03.825982Z","iopub.status.idle":"2023-07-08T04:16:03.873589Z","shell.execute_reply.started":"2023-07-08T04:16:03.825949Z","shell.execute_reply":"2023-07-08T04:16:03.872519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}