{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":13836,"databundleVersionId":1718836,"sourceType":"competition"}],"dockerImageVersionId":31153,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nfrom sklearn.model_selection import train_test_split\nimport pickle\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.utils import class_weight\nimport seaborn as sns","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:20:19.388212Z","iopub.execute_input":"2025-11-23T21:20:19.388456Z","iopub.status.idle":"2025-11-23T21:20:37.649420Z","shell.execute_reply.started":"2025-11-23T21:20:19.388434Z","shell.execute_reply":"2025-11-23T21:20:37.648452Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cassava_leaf_train = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/train.csv')\ncassava_leaf_train.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:04:15.436056Z","iopub.execute_input":"2025-11-23T22:04:15.436400Z","iopub.status.idle":"2025-11-23T22:04:15.455201Z","shell.execute_reply.started":"2025-11-23T22:04:15.436367Z","shell.execute_reply":"2025-11-23T22:04:15.454399Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cassava_leaf_train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:20:45.536696Z","iopub.execute_input":"2025-11-23T21:20:45.537282Z","iopub.status.idle":"2025-11-23T21:20:45.560735Z","shell.execute_reply.started":"2025-11-23T21:20:45.537256Z","shell.execute_reply":"2025-11-23T21:20:45.559778Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cassava_leaf_proportion = (cassava_leaf_train.label.value_counts() / len(cassava_leaf_train)).to_frame()\ncassava_leaf_proportion","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:20:47.561085Z","iopub.execute_input":"2025-11-23T21:20:47.561868Z","iopub.status.idle":"2025-11-23T21:20:47.576087Z","shell.execute_reply.started":"2025-11-23T21:20:47.561842Z","shell.execute_reply":"2025-11-23T21:20:47.575470Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cassava_leaf_train['label'].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:20:49.801186Z","iopub.execute_input":"2025-11-23T21:20:49.801908Z","iopub.status.idle":"2025-11-23T21:20:49.808608Z","shell.execute_reply.started":"2025-11-23T21:20:49.801882Z","shell.execute_reply":"2025-11-23T21:20:49.807850Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"im_16 = cassava_leaf_train.sample(n=16).reset_index()\n\nplt.figure(figsize=(6,6))\nfor m, row in im_16.iterrows():\n    img = mpimg.imread(f'/kaggle/input/cassava-leaf-disease-classification/train_images/{row.image_id}')\n    label = row.label\n\n    plt.subplot(4,4,m+1)\n    plt.imshow(img)\n    plt.text(0, -5, f'Class {label}', color='k')\n\n    plt.axis('off')\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:20:51.564778Z","iopub.execute_input":"2025-11-23T21:20:51.565435Z","iopub.status.idle":"2025-11-23T21:20:53.330021Z","shell.execute_reply.started":"2025-11-23T21:20:51.565403Z","shell.execute_reply":"2025-11-23T21:20:53.329028Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cassava_leaf_train.isna().sum(axis=0).to_frame","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:20:56.224784Z","iopub.execute_input":"2025-11-23T21:20:56.225555Z","iopub.status.idle":"2025-11-23T21:20:56.235775Z","shell.execute_reply.started":"2025-11-23T21:20:56.225517Z","shell.execute_reply":"2025-11-23T21:20:56.234700Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cassava_classes = cassava_leaf_train['label'].value_counts()\nprint(cassava_classes)\ncassava_classes.plot(kind=\"bar\")\nplt.xlabel('label')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:20:58.480741Z","iopub.execute_input":"2025-11-23T21:20:58.481018Z","iopub.status.idle":"2025-11-23T21:20:58.672674Z","shell.execute_reply.started":"2025-11-23T21:20:58.480996Z","shell.execute_reply":"2025-11-23T21:20:58.671568Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Undersampling**","metadata":{}},{"cell_type":"code","source":"cassava_leaf_train_3 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 3]\nprint(\"Class 3 Before: \", cassava_leaf_train_3.shape)\ncassava_leaf_train_3 = cassava_leaf_train_3.drop(cassava_leaf_train_3.sample(frac=0.91).index)\nprint(\"Class 3 After: \", cassava_leaf_train_3.shape)\n\ncassava_leaf_train_4 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 4]\nprint(\"Class 4 Before: \", cassava_leaf_train_4.shape)\ncassava_leaf_train_4 = cassava_leaf_train_4.drop(cassava_leaf_train_4.sample(frac=0.53).index)\nprint(\"Class 4 After: \", cassava_leaf_train_4.shape)\n\ncassava_leaf_train_1 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 1]\nprint(\"Class 1 Before: \", cassava_leaf_train_1.shape)\ncassava_leaf_train_1 = cassava_leaf_train_1.drop(cassava_leaf_train_1.sample(frac=0.53).index)\nprint(\"Class 1 After: \", cassava_leaf_train_1.shape)\n\ncassava_leaf_train_2 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 2]\nprint(\"Class 2 Before: \", cassava_leaf_train_2.shape)\ncassava_leaf_train_2 = cassava_leaf_train_2.drop(cassava_leaf_train_2.sample(frac=0.53).index)\nprint(\"Class 2 After: \", cassava_leaf_train_2.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:04:30.624561Z","iopub.execute_input":"2025-11-22T02:04:30.625264Z","iopub.status.idle":"2025-11-22T02:04:30.638944Z","shell.execute_reply.started":"2025-11-22T02:04:30.625239Z","shell.execute_reply":"2025-11-22T02:04:30.638368Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"usamp_cassava_leaf_train = pd.concat([cassava_leaf_train_3, cassava_leaf_train_4, cassava_leaf_train_2, cassava_leaf_train_1, cassava_leaf_train.loc[cassava_leaf_train['label'] == 0]], axis=0)\nprint(usamp_cassava_leaf_train.shape)\nusamp_cassava_leaf_proportion = (usamp_cassava_leaf_train.label.value_counts() / len(usamp_cassava_leaf_train)).to_frame()\nusamp_cassava_leaf_proportion","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:04:32.784412Z","iopub.execute_input":"2025-11-22T02:04:32.785037Z","iopub.status.idle":"2025-11-22T02:04:32.796022Z","shell.execute_reply.started":"2025-11-22T02:04:32.785011Z","shell.execute_reply":"2025-11-22T02:04:32.795388Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"usamp_cassava_leaf_train['label'] = usamp_cassava_leaf_train['label'].astype(str)\nusamp_train_cassava_df, usamp_valid_cassava_df = train_test_split(usamp_cassava_leaf_train, test_size=0.2, random_state=1, stratify=usamp_cassava_leaf_train.label)\nprint(usamp_train_cassava_df.shape)\nprint(usamp_valid_cassava_df.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:04:34.729161Z","iopub.execute_input":"2025-11-22T02:04:34.729642Z","iopub.status.idle":"2025-11-22T02:04:34.743638Z","shell.execute_reply.started":"2025-11-22T02:04:34.729619Z","shell.execute_reply":"2025-11-22T02:04:34.742950Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"usamp_train_dg = ImageDataGenerator(rescale=1/255)\nusamp_valid_dg = ImageDataGenerator(rescale=1/255)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:04:36.692506Z","iopub.execute_input":"2025-11-22T02:04:36.693287Z","iopub.status.idle":"2025-11-22T02:04:36.697065Z","shell.execute_reply.started":"2025-11-22T02:04:36.693258Z","shell.execute_reply":"2025-11-22T02:04:36.696314Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"usamp_train_loader = usamp_train_dg.flow_from_dataframe(\n    dataframe = usamp_train_cassava_df,\n    directory = '/kaggle/input/cassava-leaf-disease-classification/train_images',\n    x_col = 'image_id',\n    y_col = 'label',\n    batch_size = 64,\n    seed = 1,\n    shuffle = True,\n    class_mode = 'categorical',\n    target_size = (32,32)\n)\n\nusamp_valid_loader = usamp_valid_dg.flow_from_dataframe(\n    dataframe = usamp_valid_cassava_df,\n    directory = '/kaggle/input/cassava-leaf-disease-classification/train_images',\n    x_col = 'image_id',\n    y_col = 'label',\n    batch_size = 64,\n    seed = 1,\n    shuffle = True,\n    class_mode = 'categorical',\n    target_size = (32,32)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:04:38.931116Z","iopub.execute_input":"2025-11-22T02:04:38.931350Z","iopub.status.idle":"2025-11-22T02:04:41.530991Z","shell.execute_reply.started":"2025-11-22T02:04:38.931335Z","shell.execute_reply":"2025-11-22T02:04:41.530191Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"usamp_train_steps = len(usamp_train_loader)\nusamp_valid_steps = len(usamp_valid_loader)\n\nprint(usamp_train_steps)\nprint(usamp_valid_steps)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:04:54.665112Z","iopub.execute_input":"2025-11-22T02:04:54.665708Z","iopub.status.idle":"2025-11-22T02:04:54.669797Z","shell.execute_reply.started":"2025-11-22T02:04:54.665684Z","shell.execute_reply":"2025-11-22T02:04:54.669092Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.random.seed(1)\ntf.random.set_seed(1)\n\nusamp_cassava_model = Sequential([\n    Conv2D(80, (3,3), activation='relu', padding='same', input_shape=(32,32,3)),\n    Conv2D(80, (3,3), activation='relu', padding='same'),\n    MaxPooling2D(2,2),\n    Dropout(0.5),\n    BatchNormalization(),\n\n    Conv2D(160, (3,3), activation='relu', padding='same', input_shape=(32,32,3)),\n    Conv2D(160, (3,3), activation='relu', padding='same'),\n    MaxPooling2D(2,2),\n    Dropout(0.5),\n    BatchNormalization(),\n\n    Flatten(),\n\n    Dense(40, activation='relu'),\n    Dropout(0.5),\n    Dense(20, activation='relu'),\n    Dropout(0.5),\n    BatchNormalization(),\n    Dense(5, activation='softmax')\n])\n\nusamp_cassava_model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:04:57.128888Z","iopub.execute_input":"2025-11-22T02:04:57.129589Z","iopub.status.idle":"2025-11-22T02:04:57.260260Z","shell.execute_reply.started":"2025-11-22T02:04:57.129565Z","shell.execute_reply":"2025-11-22T02:04:57.259568Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"usamp_cassava_optimizer = tf.keras.optimizers.Adam(0.001)\nusamp_cassava_model.compile(loss='categorical_crossentropy', optimizer=usamp_cassava_optimizer, metrics=['accuracy', tf.keras.metrics.AUC()])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:05:00.816819Z","iopub.execute_input":"2025-11-22T02:05:00.817488Z","iopub.status.idle":"2025-11-22T02:05:00.837069Z","shell.execute_reply.started":"2025-11-22T02:05:00.817463Z","shell.execute_reply":"2025-11-22T02:05:00.836362Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nusamp_h1 = usamp_cassava_model.fit(\n    x = usamp_train_loader,\n    steps_per_epoch = usamp_train_steps,\n    epochs = 20,\n    validation_data = usamp_valid_loader,\n    validation_steps = usamp_valid_steps,\n    verbose = 1\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:05:07.552737Z","iopub.execute_input":"2025-11-22T02:05:07.553101Z","iopub.status.idle":"2025-11-22T02:12:18.254600Z","shell.execute_reply.started":"2025-11-22T02:05:07.553070Z","shell.execute_reply":"2025-11-22T02:12:18.254035Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"training_hist = pd.DataFrame(usamp_h1.history)\ntraining_hist['epoch'] = usamp_h1.epoch\nsns.lineplot(x='epoch', y='loss', data=training_hist)\nsns.lineplot(x='epoch', y='val_loss', data=training_hist)\nplt.legend(labels=['train_loss', 'val_loss'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:13:02.740895Z","iopub.execute_input":"2025-11-22T02:13:02.741499Z","iopub.status.idle":"2025-11-22T02:13:02.959686Z","shell.execute_reply.started":"2025-11-22T02:13:02.741477Z","shell.execute_reply":"2025-11-22T02:13:02.958956Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.lineplot(x='epoch', y='accuracy', data=training_hist)\nsns.lineplot(x='epoch', y='val_accuracy', data=training_hist)\nplt.legend(labels=['train_accuracy', 'val_accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-22T02:13:24.745669Z","iopub.execute_input":"2025-11-22T02:13:24.745958Z","iopub.status.idle":"2025-11-22T02:13:24.965564Z","shell.execute_reply.started":"2025-11-22T02:13:24.745935Z","shell.execute_reply":"2025-11-22T02:13:24.964816Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Oversampling**","metadata":{}},{"cell_type":"code","source":"cassava_leaf_train_3 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 3]\nprint(\"Class 3: \", cassava_leaf_train_3.shape)\n\ncassava_leaf_train_4 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 4]\nprint(\"Class 4 Before: \", cassava_leaf_train_4.shape)\ncassava_leaf_train_4 = cassava_leaf_train_4.loc[cassava_leaf_train_4.index.repeat(5)].reset_index(drop=True)\nprint(\"Class 4 After: \", cassava_leaf_train_4.shape)\n\ncassava_leaf_train_2 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 2]\nprint(\"Class 2 Before: \", cassava_leaf_train_2.shape)\ncassava_leaf_train_2 = cassava_leaf_train_2.loc[cassava_leaf_train_2.index.repeat(5)].reset_index(drop=True)\nprint(\"Class 2 After: \", cassava_leaf_train_2.shape)\n\ncassava_leaf_train_1 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 1]\nprint(\"Class 1 Before: \", cassava_leaf_train_1.shape)\ncassava_leaf_train_1 = cassava_leaf_train_1.loc[cassava_leaf_train_1.index.repeat(6)].reset_index(drop=True)\nprint(\"Class 1 After: \", cassava_leaf_train_1.shape)\n\ncassava_leaf_train_0 = cassava_leaf_train.loc[cassava_leaf_train['label'] == 0]\nprint(\"Class 0 Before: \", cassava_leaf_train_0.shape)\ncassava_leaf_train_0 = cassava_leaf_train_0.loc[cassava_leaf_train_0.index.repeat(11)].reset_index(drop=True)\nprint(\"Class 0 After: \", cassava_leaf_train_0.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:04:25.113081Z","iopub.execute_input":"2025-11-23T22:04:25.113779Z","iopub.status.idle":"2025-11-23T22:04:25.133138Z","shell.execute_reply.started":"2025-11-23T22:04:25.113753Z","shell.execute_reply":"2025-11-23T22:04:25.132361Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"osamp_cassava_leaf_train = pd.concat([cassava_leaf_train_3, cassava_leaf_train_4, cassava_leaf_train_2, cassava_leaf_train_1, cassava_leaf_train_0], axis=0)\nprint(osamp_cassava_leaf_train.shape)\nosamp_cassava_leaf_proportion = (osamp_cassava_leaf_train.label.value_counts() / len(osamp_cassava_leaf_train)).to_frame()\nosamp_cassava_leaf_proportion","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:04:27.419790Z","iopub.execute_input":"2025-11-23T22:04:27.420607Z","iopub.status.idle":"2025-11-23T22:04:27.432818Z","shell.execute_reply.started":"2025-11-23T22:04:27.420574Z","shell.execute_reply":"2025-11-23T22:04:27.432014Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"osamp_cassava_leaf_train['label'] = osamp_cassava_leaf_train['label'].astype(str)\nosamp_train_cassava_df, osamp_valid_cassava_df = train_test_split(osamp_cassava_leaf_train, test_size=0.2, random_state=1, stratify=osamp_cassava_leaf_train.label)\nprint(osamp_train_cassava_df.shape)\nprint(osamp_valid_cassava_df.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:04:29.480165Z","iopub.execute_input":"2025-11-23T22:04:29.480715Z","iopub.status.idle":"2025-11-23T22:04:29.567722Z","shell.execute_reply.started":"2025-11-23T22:04:29.480690Z","shell.execute_reply":"2025-11-23T22:04:29.567057Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"osamp_train_dg = ImageDataGenerator(rescale=1/255)\nosamp_valid_dg = ImageDataGenerator(rescale=1/255)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:04:31.080315Z","iopub.execute_input":"2025-11-23T22:04:31.080923Z","iopub.status.idle":"2025-11-23T22:04:31.084957Z","shell.execute_reply.started":"2025-11-23T22:04:31.080902Z","shell.execute_reply":"2025-11-23T22:04:31.084033Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"osamp_train_loader = osamp_train_dg.flow_from_dataframe(\n    dataframe = osamp_train_cassava_df,\n    directory = '/kaggle/input/cassava-leaf-disease-classification/train_images',\n    x_col = 'image_id',\n    y_col = 'label',\n    batch_size = 64,\n    seed = 1,\n    shuffle = True,\n    class_mode = 'categorical',\n    target_size = (75,100)\n)\n\nosamp_valid_loader = osamp_valid_dg.flow_from_dataframe(\n    dataframe = osamp_valid_cassava_df,\n    directory = '/kaggle/input/cassava-leaf-disease-classification/train_images',\n    x_col = 'image_id',\n    y_col = 'label',\n    batch_size = 64,\n    seed = 1,\n    shuffle = True,\n    class_mode = 'categorical',\n    target_size = (75,100)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:04:36.179265Z","iopub.execute_input":"2025-11-23T22:04:36.179978Z","iopub.status.idle":"2025-11-23T22:04:47.494931Z","shell.execute_reply.started":"2025-11-23T22:04:36.179956Z","shell.execute_reply":"2025-11-23T22:04:47.494272Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"osamp_train_steps = len(osamp_train_loader)\nosamp_valid_steps = len(osamp_valid_loader)\n\nprint(osamp_train_steps)\nprint(osamp_valid_steps)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:04:53.311935Z","iopub.execute_input":"2025-11-23T22:04:53.312516Z","iopub.status.idle":"2025-11-23T22:04:53.316954Z","shell.execute_reply.started":"2025-11-23T22:04:53.312493Z","shell.execute_reply":"2025-11-23T22:04:53.316169Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.random.seed(1)\ntf.random.set_seed(1)\n\nosamp_cassava_model = Sequential([\n    Conv2D(40, (3,3), activation='relu', padding='same', input_shape=(75,100,3)),\n    Conv2D(40, (3,3), activation='relu', padding='same'),\n    MaxPooling2D(2,2),\n    Dropout(0.5),\n    BatchNormalization(),\n\n    Conv2D(80, (3,3), activation='relu', padding='same', input_shape=(75,100,3)),\n    Conv2D(80, (3,3), activation='relu', padding='same'),\n    MaxPooling2D(2,2),\n    Dropout(0.5),\n    BatchNormalization(),\n\n    Flatten(),\n\n    Dense(40, activation='relu'),\n    Dropout(0.5),\n    Dense(20, activation='relu'),\n    Dropout(0.5),\n    BatchNormalization(),\n    Dense(5, activation='softmax')\n])\n\nosamp_cassava_model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T22:05:43.377586Z","iopub.execute_input":"2025-11-23T22:05:43.378080Z","iopub.status.idle":"2025-11-23T22:05:43.529727Z","shell.execute_reply.started":"2025-11-23T22:05:43.378057Z","shell.execute_reply":"2025-11-23T22:05:43.529167Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"osamp_cassava_optimizer = tf.keras.optimizers.Adam(0.0001)\nosamp_cassava_model.compile(loss='categorical_crossentropy', optimizer=osamp_cassava_optimizer, metrics=['accuracy', tf.keras.metrics.AUC()])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T23:49:31.508553Z","iopub.execute_input":"2025-11-23T23:49:31.508836Z","iopub.status.idle":"2025-11-23T23:49:31.528014Z","shell.execute_reply.started":"2025-11-23T23:49:31.508814Z","shell.execute_reply":"2025-11-23T23:49:31.527468Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nosamp_h1 = osamp_cassava_model.fit(\n    x = osamp_train_loader,\n    steps_per_epoch = osamp_train_steps,\n    epochs = 20,\n    validation_data = osamp_valid_loader,\n    validation_steps = osamp_valid_steps,\n    verbose = 1\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T23:49:33.448753Z","iopub.execute_input":"2025-11-23T23:49:33.449339Z","iopub.status.idle":"2025-11-23T23:52:27.235985Z","shell.execute_reply.started":"2025-11-23T23:49:33.449314Z","shell.execute_reply":"2025-11-23T23:52:27.235277Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"training_hist = pd.DataFrame(osamp_h1.history)\ntraining_hist['epoch'] = osamp_h1.epoch\nsns.lineplot(x='epoch', y='loss', data=training_hist)\nsns.lineplot(x='epoch', y='val_loss', data=training_hist)\nplt.legend(labels=['train_loss', 'val_loss'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T23:34:42.408679Z","iopub.execute_input":"2025-11-23T23:34:42.409481Z","iopub.status.idle":"2025-11-23T23:34:42.649672Z","shell.execute_reply.started":"2025-11-23T23:34:42.409453Z","shell.execute_reply":"2025-11-23T23:34:42.648738Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.lineplot(x='epoch', y='accuracy', data=training_hist)\nsns.lineplot(x='epoch', y='val_accuracy', data=training_hist)\nplt.legend(labels=['train_accuracy', 'val_accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T23:34:48.848557Z","iopub.execute_input":"2025-11-23T23:34:48.848834Z","iopub.status.idle":"2025-11-23T23:34:49.075315Z","shell.execute_reply.started":"2025-11-23T23:34:48.848814Z","shell.execute_reply":"2025-11-23T23:34:49.074504Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Cost-Sensitive Learning**","metadata":{},"attachments":{"cd19b2d7-12a4-49b3-aedd-ea6a855b6bc2.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAMQAAAATCAYAAADPnaL8AAADxUlEQVRoQ+1aO5bqMAwVG5mGdNRU0MAC2MJQzHSvgAVQsYB5xeugYLbAAqBhKmo6aNgIzz/Fkp04yRxCTnJMBRNsS9e60pWY3kO8IL4iAhEBhUAvEiJGQkTAIhAJEaMhIkAQiIRoMhyOS+itBnA9fUC/STvi2SkCDRLiBttxApf1A74mzd/IbTuG5HMIh8cXSHPU58saHmjcbQvj5BOGhyfa2xghjrDsTeG8ucLpI1KRRl8kRA4XPULUwdnGCFGHM93YsyIhdGb5a3xfkGx5XPZgig9gBJvrCTD56Oz7g6tEFp7BnuwDzvcptP5ancFFClcZG3cdkWwnbdnPrjBYJaCP5fYwW0cbLVlIcN6ZL2K12vsufF/BQPg1OQp/dnMmddSecNAVJWAbCxuXEMF1HHvf3wPAVN6N9rX/L4QBr84S43f4hvUlSe+Q3i1IO+3lahcWxtdu8OA3kkmDuJtjmRUXNL7BHxFMKoDOJrBQbqD8UJd8gbWRIha/EpIpd60ODsEsLbfU93YwNyTUAW9JoD6jfXlZ2fm7XyHkmZoQH8DPA6D2hG3LJ0RoncTqHeDbJJkCf+UZQQzAJ4RMWEgCLh+J30JdvaRyNkiy8hUiGJwmUFI5Si73LU97lyVEhm7PCGoZAKuBJit9r7BVGU7yR1QX9f7MKlj6HdLgBgnRd5KDu7/TKHv24IVTPwp84jHCyZO1fxCDLEJ4/ZJJMIr8JKF1XOaVJwS9dK5pWHbWj5xgJ1LAlnqXEPqzVVa+/MC1XEZZY/C5FwwumYkESKVBlQqBmdLIJlkhkYxFtuVVCOE8kZW+T64M06pFV8hShGAYZFQISghV8bKrIZOGDWbyuo4uT4jfVgg6QWKTmhIVwiOeqRYQHlcWEoJmaKwWd75nuEKosmOCZg2XhFTIKhm0oEJY9x05xSTaKwhhezVBw3QSV1dQNrlveUKYS7CjOuwhJnCUmX1omyx3hMkvFoPH7UmKYHCzVv4ItDQhKMmzKgRrnLmWRp2+Oo9EY08a7CrjWXpmaJ3TM2CT+5IKIRPFfmbHz0XX1PLnFQghlRCf7NhJhCN3aBZxJhR0OmLlBZ8CpZgG1laSECTw3xxpkieZ6P7ulCkd3Rv7qE9aMXKcqLzJk0yq/QqsY1JstBAIi5Ge+Q2nVskkDOMTRGEnTuZaHvxZ5lcjRAcBiC6FEVBEzBgxY8/UNfwiIbp2o0/2x2+iq0rdJxtU83aREDUD3P7tXTmMP1R2818+IiHaH7HRgyciEAnxRDDjVu1HIBKi/XcYPXgiAv8BI+QRBPaJIk8AAAAASUVORK5CYII="},"42187c14-97cb-4010-b58e-1e2cb82d1b0c.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAMQAAAATCAYAAADPnaL8AAADxUlEQVRoQ+1aO5bqMAwVG5mGdNRU0MAC2MJQzHSvgAVQsYB5xeugYLbAAqBhKmo6aNgIzz/Fkp04yRxCTnJMBRNsS9e60pWY3kO8IL4iAhEBhUAvEiJGQkTAIhAJEaMhIkAQiIRoMhyOS+itBnA9fUC/STvi2SkCDRLiBttxApf1A74mzd/IbTuG5HMIh8cXSHPU58saHmjcbQvj5BOGhyfa2xghjrDsTeG8ucLpI1KRRl8kRA4XPULUwdnGCFGHM93YsyIhdGb5a3xfkGx5XPZgig9gBJvrCTD56Oz7g6tEFp7BnuwDzvcptP5ancFFClcZG3cdkWwnbdnPrjBYJaCP5fYwW0cbLVlIcN6ZL2K12vsufF/BQPg1OQp/dnMmddSecNAVJWAbCxuXEMF1HHvf3wPAVN6N9rX/L4QBr84S43f4hvUlSe+Q3i1IO+3lahcWxtdu8OA3kkmDuJtjmRUXNL7BHxFMKoDOJrBQbqD8UJd8gbWRIha/EpIpd60ODsEsLbfU93YwNyTUAW9JoD6jfXlZ2fm7XyHkmZoQH8DPA6D2hG3LJ0RoncTqHeDbJJkCf+UZQQzAJ4RMWEgCLh+J30JdvaRyNkiy8hUiGJwmUFI5Si73LU97lyVEhm7PCGoZAKuBJit9r7BVGU7yR1QX9f7MKlj6HdLgBgnRd5KDu7/TKHv24IVTPwp84jHCyZO1fxCDLEJ4/ZJJMIr8JKF1XOaVJwS9dK5pWHbWj5xgJ1LAlnqXEPqzVVa+/MC1XEZZY/C5FwwumYkESKVBlQqBmdLIJlkhkYxFtuVVCOE8kZW+T64M06pFV8hShGAYZFQISghV8bKrIZOGDWbyuo4uT4jfVgg6QWKTmhIVwiOeqRYQHlcWEoJmaKwWd75nuEKosmOCZg2XhFTIKhm0oEJY9x05xSTaKwhhezVBw3QSV1dQNrlveUKYS7CjOuwhJnCUmX1omyx3hMkvFoPH7UmKYHCzVv4ItDQhKMmzKgRrnLmWRp2+Oo9EY08a7CrjWXpmaJ3TM2CT+5IKIRPFfmbHz0XX1PLnFQghlRCf7NhJhCN3aBZxJhR0OmLlBZ8CpZgG1laSECTw3xxpkieZ6P7ulCkd3Rv7qE9aMXKcqLzJk0yq/QqsY1JstBAIi5Ge+Q2nVskkDOMTRGEnTuZaHvxZ5lcjRAcBiC6FEVBEzBgxY8/UNfwiIbp2o0/2x2+iq0rdJxtU83aREDUD3P7tXTmMP1R2818+IiHaH7HRgyciEAnxRDDjVu1HIBKi/XcYPXgiAv8BI+QRBPaJIk8AAAAASUVORK5CYII="}}},{"cell_type":"code","source":"csl_cassava_leaf_train = cassava_leaf_train\ncsl_cassava_leaf_train['label'] = csl_cassava_leaf_train['label'].astype(str)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:21:09.415742Z","iopub.execute_input":"2025-11-23T21:21:09.416596Z","iopub.status.idle":"2025-11-23T21:21:09.425998Z","shell.execute_reply.started":"2025-11-23T21:21:09.416568Z","shell.execute_reply":"2025-11-23T21:21:09.425136Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csl_weights = class_weight.compute_class_weight(\n    class_weight='balanced',\n    classes=np.unique(csl_cassava_leaf_train.iloc[:,1].values.flatten()),\n    y=csl_cassava_leaf_train.iloc[:,1].values.flatten()\n)\n\ncsl_weights_dict = dict(enumerate(csl_weights))\nprint(\"Weights:\", csl_weights_dict)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:21:14.680944Z","iopub.execute_input":"2025-11-23T21:21:14.681535Z","iopub.status.idle":"2025-11-23T21:21:14.705559Z","shell.execute_reply.started":"2025-11-23T21:21:14.681510Z","shell.execute_reply":"2025-11-23T21:21:14.704830Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csl_train_cassava_df, csl_valid_cassava_df = train_test_split(csl_cassava_leaf_train, test_size=0.3, random_state=1, stratify=csl_cassava_leaf_train.label)\nprint(csl_train_cassava_df.shape)\nprint(csl_valid_cassava_df.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:21:23.700218Z","iopub.execute_input":"2025-11-23T21:21:23.700812Z","iopub.status.idle":"2025-11-23T21:21:23.732089Z","shell.execute_reply.started":"2025-11-23T21:21:23.700793Z","shell.execute_reply":"2025-11-23T21:21:23.731287Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csl_train_dg = ImageDataGenerator(rescale=1/255)\ncsl_valid_dg = ImageDataGenerator(rescale=1/255)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:21:26.984809Z","iopub.execute_input":"2025-11-23T21:21:26.985434Z","iopub.status.idle":"2025-11-23T21:21:26.989184Z","shell.execute_reply.started":"2025-11-23T21:21:26.985407Z","shell.execute_reply":"2025-11-23T21:21:26.988393Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csl_train_loader = csl_train_dg.flow_from_dataframe(\n    dataframe = csl_train_cassava_df,\n    directory = '/kaggle/input/cassava-leaf-disease-classification/train_images',\n    x_col = 'image_id',\n    y_col = 'label',\n    batch_size = 64,\n    seed = 1,\n    shuffle = True,\n    class_mode = 'categorical',\n    target_size = (75,100)\n)\n\ncsl_valid_loader = csl_valid_dg.flow_from_dataframe(\n    dataframe = csl_valid_cassava_df,\n    directory = '/kaggle/input/cassava-leaf-disease-classification/train_images',\n    x_col = 'image_id',\n    y_col = 'label',\n    batch_size = 64,\n    seed = 1,\n    shuffle = True,\n    class_mode = 'categorical',\n    target_size = (75,100)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:21:56.402987Z","iopub.execute_input":"2025-11-23T21:21:56.403657Z","iopub.status.idle":"2025-11-23T21:22:42.046736Z","shell.execute_reply.started":"2025-11-23T21:21:56.403633Z","shell.execute_reply":"2025-11-23T21:22:42.045803Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csl_train_steps = len(csl_train_loader)\ncsl_valid_steps = len(csl_valid_loader)\n\nprint(csl_train_steps)\nprint(csl_valid_steps)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:22:45.388626Z","iopub.execute_input":"2025-11-23T21:22:45.389209Z","iopub.status.idle":"2025-11-23T21:22:45.393087Z","shell.execute_reply.started":"2025-11-23T21:22:45.389186Z","shell.execute_reply":"2025-11-23T21:22:45.392182Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.random.seed(1)\ntf.random.set_seed(1)\n\ncsl_cassava_model = Sequential([\n    #Conv2D(20, (3,3), activation='relu', padding='same', input_shape=(32,32,3)),\n    #Conv2D(20, (3,3), activation='relu', padding='same'),\n    #MaxPooling2D(2,2),\n    #Dropout(0.5),\n    #BatchNormalization(),\n    \n    Conv2D(40, (3,3), activation='relu', padding='same', input_shape=(75,100,3)),\n    Conv2D(40, (3,3), activation='relu', padding='same'),\n    MaxPooling2D(2,2),\n    Dropout(0.5),\n    BatchNormalization(),\n\n    Conv2D(80, (3,3), activation='relu', padding='same', input_shape=(75,100,3)),\n    Conv2D(80, (3,3), activation='relu', padding='same'),\n    MaxPooling2D(2,2),\n    Dropout(0.5),\n    BatchNormalization(),\n\n    Flatten(),\n\n    Dense(40, activation='relu'),\n    Dropout(0.5),\n    Dense(20, activation='relu'),\n    Dropout(0.5),\n    BatchNormalization(),\n    Dense(5, activation='softmax')\n])\n\ncsl_cassava_model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:22:48.117008Z","iopub.execute_input":"2025-11-23T21:22:48.117589Z","iopub.status.idle":"2025-11-23T21:22:50.605377Z","shell.execute_reply.started":"2025-11-23T21:22:48.117560Z","shell.execute_reply":"2025-11-23T21:22:50.604752Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csl_cassava_optimizer = tf.keras.optimizers.Adam(0.0001)\ncsl_cassava_model.compile(loss='categorical_crossentropy', optimizer=csl_cassava_optimizer, metrics=['accuracy', tf.keras.metrics.AUC()])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:22:56.448854Z","iopub.execute_input":"2025-11-23T21:22:56.449496Z","iopub.status.idle":"2025-11-23T21:22:56.470733Z","shell.execute_reply.started":"2025-11-23T21:22:56.449474Z","shell.execute_reply":"2025-11-23T21:22:56.470150Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\ncsl_h1 = csl_cassava_model.fit(\n    x = csl_train_loader,\n    steps_per_epoch = csl_train_steps,\n    epochs = 20,\n    validation_data = csl_valid_loader,\n    validation_steps = csl_valid_steps,\n    verbose = 1,\n    class_weight = csl_weights_dict\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:23:19.184508Z","iopub.execute_input":"2025-11-23T21:23:19.185164Z","iopub.status.idle":"2025-11-23T21:55:19.315434Z","shell.execute_reply.started":"2025-11-23T21:23:19.185142Z","shell.execute_reply":"2025-11-23T21:55:19.314633Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"training_hist = pd.DataFrame(csl_h1.history)\ntraining_hist['epoch'] = csl_h1.epoch\nsns.lineplot(x='epoch', y='loss', data=training_hist)\nsns.lineplot(x='epoch', y='val_loss', data=training_hist)\nplt.legend(labels=['train_loss', 'val_loss'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:55:31.933079Z","iopub.execute_input":"2025-11-23T21:55:31.933848Z","iopub.status.idle":"2025-11-23T21:55:32.148613Z","shell.execute_reply.started":"2025-11-23T21:55:31.933824Z","shell.execute_reply":"2025-11-23T21:55:32.147818Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.lineplot(x='epoch', y='accuracy', data=training_hist)\nsns.lineplot(x='epoch', y='val_accuracy', data=training_hist)\nplt.legend(labels=['train_accuracy', 'val_accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-23T21:55:43.048361Z","iopub.execute_input":"2025-11-23T21:55:43.048625Z","iopub.status.idle":"2025-11-23T21:55:43.288817Z","shell.execute_reply.started":"2025-11-23T21:55:43.048607Z","shell.execute_reply":"2025-11-23T21:55:43.287970Z"}},"outputs":[],"execution_count":null}]}