{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":37333,"databundleVersionId":3949526,"sourceType":"competition"},{"sourceId":4213549,"sourceType":"datasetVersion","datasetId":2483973}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport keras.backend as K #to define custom loss function\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline\nimport warnings\nwarnings.filterwarnings('ignore')\n\nfrom pprint import pprint\nfrom collections import defaultdict\nimport openslide\nfrom openslide import OpenSlide\n\nfrom glob import glob\n\nfrom sklearn.model_selection import train_test_split\nfrom tqdm import tqdm\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense\nfrom tensorflow.keras.layers import GlobalMaxPooling2D\nfrom keras.models import load_model\n\nprint(keras.__version__)","metadata":{"papermill":{"duration":6.579445,"end_time":"2022-12-13T12:03:24.381666","exception":false,"start_time":"2022-12-13T12:03:17.802221","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-27T13:00:22.253058Z","iopub.execute_input":"2024-11-27T13:00:22.25404Z","iopub.status.idle":"2024-11-27T13:00:22.261747Z","shell.execute_reply.started":"2024-11-27T13:00:22.254004Z","shell.execute_reply":"2024-11-27T13:00:22.260973Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\ntrain_df = pd.read_csv('../input/mayo-clinic-strip-ai/train.csv')\ntest_df  = pd.read_csv('../input/mayo-clinic-strip-ai/test.csv')\n\n# Specify patient_ids to remove\npatient_ids_to_remove = ['006388', '008e5c', '00c058', '01adc5']\n\n# Filter out the rows with specified patient_ids\ntrain_df = train_df[~train_df['patient_id'].isin(patient_ids_to_remove)].reset_index(drop=True)\ntrain_df = train_df.drop_duplicates(subset=['patient_id'])\n\ndf1 = train_df[train_df['label'] == 'CE']\ndf2 = train_df[train_df['label'] == 'LAA']\n#adjust n to change number of CE data\nsampled= df1.sample(n=200, random_state=42)\ntrain_df = pd.concat([sampled, df2],ignore_index=True)\n# Print the cleaned DataFrame\nprint(\"Cleaned DataFrame:\")\nprint(train_df.head())\ntrain_df['label'].value_counts()","metadata":{"papermill":{"duration":0.031325,"end_time":"2022-12-13T12:03:24.419596","exception":false,"start_time":"2022-12-13T12:03:24.388271","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-27T13:00:24.588595Z","iopub.execute_input":"2024-11-27T13:00:24.58943Z","iopub.status.idle":"2024-11-27T13:00:24.646438Z","shell.execute_reply.started":"2024-11-27T13:00:24.589396Z","shell.execute_reply":"2024-11-27T13:00:24.645541Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['patient_id'].nunique","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-27T13:04:13.201921Z","iopub.execute_input":"2024-11-27T13:04:13.202757Z","iopub.status.idle":"2024-11-27T13:04:13.210557Z","shell.execute_reply.started":"2024-11-27T13:04:13.202724Z","shell.execute_reply":"2024-11-27T13:04:13.209585Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Data viusalization","metadata":{}},{"cell_type":"code","source":"##### CLASS DISTRIBUTION\n\nplt.style.use('Solarize_Light2')\nlabels = train_df.groupby('label')['label'].count().div(len(train_df)).mul(100)\ncenters = train_df.groupby(\"center_id\")['center_id'].count().div(len(train_df)).mul(100)\n\nfig, ax = plt.subplots(1,2, figsize=(16,5))\nsns.barplot(x=labels.index, y=labels.values, ax=ax[0])\nax[0].set_title(\"Distribution of a target variable\"), ax[0].set_ylabel(\"%\")\nsns.barplot(x=centers.index, y=centers.values, ax=ax[1])\nax[1].set_title(\"Images per clinic center\"), ax[1].set_ylabel(\"%\")\nplt.show()\n\nprint('Train Size = {}'.format(len(train_df)))\nprint('Test Size = {}'.format(len(test_df)))\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-25T16:01:53.607146Z","iopub.execute_input":"2024-11-25T16:01:53.607773Z","iopub.status.idle":"2024-11-25T16:01:53.965796Z","shell.execute_reply.started":"2024-11-25T16:01:53.607739Z","shell.execute_reply":"2024-11-25T16:01:53.96494Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## From this plot we notice that there is a class imbalance which we will deal with later in this notebook","metadata":{}},{"cell_type":"code","source":"train_images = glob(\"/kaggle/input/mayo-clinic-strip-ai/train/*\")\ntest_images = glob(\"/kaggle/input/mayo-clinic-strip-ai/test/*\")\nother_images = glob(\"/kaggle/input/mayo-clinic-strip-ai/other/*\")\nprint(f\"Number of images in a training set: {len(train_images)}\")\nprint(f\"Number of images in a training set: {len(test_images)}\")\nprint(f\"Number of other: {len(other_images)}\")\n\n# Filtering out images based on the cleaned patient_ids in train_df\nimages_to_remove = [\n    '/kaggle/input/mayo-clinic-strip-ai/train/006388_0.tif',\n    '/kaggle/input/mayo-clinic-strip-ai/train/008e5c_0.tif',\n    '/kaggle/input/mayo-clinic-strip-ai/train/00c058_0.tif',\n    '/kaggle/input/mayo-clinic-strip-ai/train/01adc5_0.tif',\n]\n\n# Remove images associated with the patient_ids\ntrain_images = [img for img in train_images if img not in images_to_remove]\n\n# Check the total number of images after deletion\ntotal_images_after_deletion = len(train_images)\nprint(\"Total number of images after deletion:\", total_images_after_deletion)\n\n# Print the paths of the cleaned list of images\nprint(\"First 5 image paths after deletion:\")\nprint(train_images[:5])","metadata":{"execution":{"iopub.status.busy":"2024-11-18T13:23:22.998952Z","iopub.execute_input":"2024-11-18T13:23:22.999272Z","iopub.status.idle":"2024-11-18T13:23:23.339854Z","shell.execute_reply.started":"2024-11-18T13:23:22.999244Z","shell.execute_reply":"2024-11-18T13:23:23.338846Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"img_prop = defaultdict(list)\n\nfor i, path in enumerate(train_images):\n    img_path = train_images[i]\n    slide = OpenSlide(img_path)    \n    img_prop['image_id'].append(img_path[-12:-4])\n    img_prop['width'].append(slide.dimensions[0])\n    img_prop['height'].append(slide.dimensions[1])\n    img_prop['size'].append(round(os.path.getsize(img_path) / 1e6, 2))\n    img_prop['path'].append(img_path)\n\nimage_data = pd.DataFrame(img_prop)\nimage_data['img_aspect_ratio'] = image_data['width']/image_data['height']\nimage_data.sort_values(by='image_id', inplace=True)\nimage_data.reset_index(inplace=True, drop=True)\n\nimage_data = image_data.merge(train_df, on='image_id')\nimage_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-18T13:23:23.342488Z","iopub.execute_input":"2024-11-18T13:23:23.342792Z","iopub.status.idle":"2024-11-18T13:23:41.057517Z","shell.execute_reply.started":"2024-11-18T13:23:23.342764Z","shell.execute_reply":"2024-11-18T13:23:41.056498Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nImage.MAX_IMAGE_PIXELS = None \n\nCE_imgs = image_data.loc[image_data['label']=='CE','path']\nLAA_imgs = image_data.loc[image_data['label']=='LAA','path']\n\n\nplt.style.use('default')\nfig, axes = plt.subplots(1,5, figsize=(16,16))\ntrain_images\nfor ax in axes.reshape(-1):\n    img_path = np.random.choice(CE_imgs)\n    img = Image.open(img_path)   \n    img.thumbnail((300,300), Image.Resampling.LANCZOS)\n    ax.imshow(img), ax.set_title(\"target: CE\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-11-18T13:23:41.815628Z","iopub.execute_input":"2024-11-18T13:23:41.815916Z","iopub.status.idle":"2024-11-18T13:24:38.065931Z","shell.execute_reply.started":"2024-11-18T13:23:41.815889Z","shell.execute_reply":"2024-11-18T13:24:38.064983Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, axes = plt.subplots(1,5, figsize=(16,16))\ntrain_images\nfor ax in axes.reshape(-1):\n    img_path = np.random.choice(LAA_imgs)\n    img = Image.open(img_path)   \n    img.thumbnail((300,300), Image.Resampling.LANCZOS)\n    ax.imshow(img), ax.set_title(\"target: LAA\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-11-18T13:24:38.067127Z","iopub.execute_input":"2024-11-18T13:24:38.067447Z","iopub.status.idle":"2024-11-18T13:25:59.850117Z","shell.execute_reply.started":"2024-11-18T13:24:38.067417Z","shell.execute_reply":"2024-11-18T13:25:59.849196Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Approach 1","metadata":{}},{"cell_type":"markdown","source":"## Loading Data","metadata":{}},{"cell_type":"code","source":"train_df[\"file_path\"] = train_df[\"image_id\"].apply(lambda x: \"../input/mayo-clinic-strip-ai/train/\" + x + \".tif\")\ntest_df[\"file_path\"]  = test_df[\"image_id\"].apply(lambda x: \"../input/mayo-clinic-strip-ai/test/\" + x + \".tif\")","metadata":{"papermill":{"duration":0.028968,"end_time":"2022-12-13T12:03:24.495672","exception":false,"start_time":"2022-12-13T12:03:24.466704","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T13:26:03.12135Z","iopub.execute_input":"2024-11-18T13:26:03.121796Z","iopub.status.idle":"2024-11-18T13:26:03.13125Z","shell.execute_reply.started":"2024-11-18T13:26:03.121759Z","shell.execute_reply":"2024-11-18T13:26:03.130295Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# labelling CE class as 1 and LAA as 0\ntrain_df[\"target\"] = train_df[\"label\"].apply(lambda x : 1 if x==\"CE\" else 0)\ntrain_df.head()","metadata":{"papermill":{"duration":0.017639,"end_time":"2022-12-13T12:03:24.519397","exception":false,"start_time":"2022-12-13T12:03:24.501758","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T13:26:03.132613Z","iopub.execute_input":"2024-11-18T13:26:03.133183Z","iopub.status.idle":"2024-11-18T13:26:03.154255Z","shell.execute_reply.started":"2024-11-18T13:26:03.133125Z","shell.execute_reply":"2024-11-18T13:26:03.153339Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Preprocessing","metadata":{}},{"cell_type":"code","source":"%%time\ntrain_df[\"file_path\"] = train_df[\"image_id\"].apply(lambda x: \"../input/mayo-clinic-strip-ai/train/\" + x + \".tif\")\n\ndef preprocess(image_path):\n    slide=OpenSlide(image_path)\n    region= (2500,2500)    \n    size  = (5000, 5000)\n    image = slide.read_region(region, 0, size)\n    image = image.resize((128, 128))\n    image = np.array(image)    \n    return image\n\nX_train=[]\nfor i in tqdm(train_df['file_path']):\n    x1=preprocess(i)\n    X_train.append(x1)\n\nY_train=[]    \nY_train=train_df['target']","metadata":{"papermill":{"duration":2496.090688,"end_time":"2022-12-13T12:45:00.650948","exception":false,"start_time":"2022-12-13T12:03:24.56026","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T13:26:03.15548Z","iopub.execute_input":"2024-11-18T13:26:03.15578Z","iopub.status.idle":"2024-11-18T14:16:23.663675Z","shell.execute_reply.started":"2024-11-18T13:26:03.155754Z","shell.execute_reply":"2024-11-18T14:16:23.662673Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train=np.array(X_train)\nX_train=X_train/255.0\nY_train = np.array(Y_train)","metadata":{"papermill":{"duration":0.296197,"end_time":"2022-12-13T12:45:01.078179","exception":false,"start_time":"2022-12-13T12:45:00.781982","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:23.66505Z","iopub.execute_input":"2024-11-18T14:16:23.665388Z","iopub.status.idle":"2024-11-18T14:16:23.805937Z","shell.execute_reply.started":"2024-11-18T14:16:23.665358Z","shell.execute_reply":"2024-11-18T14:16:23.805033Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## Splitting data\nx_train,x_test,y_train,y_test=train_test_split(X_train,Y_train, test_size=0.3, random_state=42)\n","metadata":{"papermill":{"duration":0.049801,"end_time":"2022-12-13T12:45:01.170206","exception":false,"start_time":"2022-12-13T12:45:01.120405","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:23.811096Z","iopub.execute_input":"2024-11-18T14:16:23.81141Z","iopub.status.idle":"2024-11-18T14:16:24.047135Z","shell.execute_reply.started":"2024-11-18T14:16:23.811382Z","shell.execute_reply":"2024-11-18T14:16:24.046327Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(x_train.shape)","metadata":{"papermill":{"duration":0.050654,"end_time":"2022-12-13T12:45:01.261913","exception":false,"start_time":"2022-12-13T12:45:01.211259","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:24.048381Z","iopub.execute_input":"2024-11-18T14:16:24.048754Z","iopub.status.idle":"2024-11-18T14:16:24.054188Z","shell.execute_reply.started":"2024-11-18T14:16:24.048718Z","shell.execute_reply":"2024-11-18T14:16:24.053198Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Our CNN approach","metadata":{"papermill":{"duration":0.040808,"end_time":"2022-12-13T12:45:01.435232","exception":false,"start_time":"2022-12-13T12:45:01.394424","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def f1_score(y_true, y_pred): \n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n    precision = true_positives / (predicted_positives + K.epsilon())\n    recall = true_positives / (possible_positives + K.epsilon())\n    f1_val = 2*(precision*recall)/(precision+recall+K.epsilon())\n    return f1_val","metadata":{"execution":{"iopub.status.busy":"2024-11-18T14:16:24.267599Z","iopub.execute_input":"2024-11-18T14:16:24.267978Z","iopub.status.idle":"2024-11-18T14:16:24.277184Z","shell.execute_reply.started":"2024-11-18T14:16:24.267941Z","shell.execute_reply":"2024-11-18T14:16:24.27619Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Revised Version\nfrom keras import metrics\nfrom keras.layers import Dense\n\nmodel = Sequential()\ninput_shape = (128, 128, 4)\n\nmodel.add(Conv2D(filters=64, kernel_size = (3,3), padding = 'valid', activation = 'relu', input_shape = input_shape))\nmodel.add(MaxPooling2D())\nmodel.add(Conv2D(filters=64, kernel_size = (3,3), strides =1, padding = 'valid', activation = 'relu'))\nmodel.add(Conv2D(filters=64, kernel_size = (3,3), strides =1, padding = 'valid', activation = 'relu'))\nmodel.add(Conv2D(filters=64, kernel_size = (3,3), strides =1, padding = 'valid', activation = 'relu'))\nmodel.add(Conv2D(filters=128, kernel_size = (3,3), strides =1, padding = 'valid', activation = 'relu'))\nmodel.add(Conv2D(filters=128, kernel_size = (3,3), strides =1, padding = 'valid', activation = 'relu'))\n\nmodel.add(Dropout(0.13))\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = 'relu'))\nmodel.add(Dropout(0.13))\nmodel.add(Dense(100, activation = 'relu'))\nmodel.add(Dense(50, activation = 'relu'))\nmodel.add(Dense(1 , activation=\"sigmoid\"))\n\nmodel.compile(\n   loss = tf.keras.losses.BinaryCrossentropy(),\n    metrics=[metrics.binary_accuracy,f1_score],\n    optimizer = tf.keras.optimizers.Adam(1e-3))\n\nmodel.summary()\n\n#from keras import metrics\n\n#model = Sequential()\n#input_shape = (128, 128, 4)\n\n#model.add(Conv2D(filters=64, kernel_size = (3,3), padding = 'valid', activation = 'relu', input_shape = input_shape))\n#model.add(MaxPooling2D())\n#model.add(Conv2D(filters=64, kernel_size = (3,3), strides =2, padding = 'valid', activation = 'relu'))\n#model.add(Conv2D(filters=64, kernel_size = (3,3), strides =2, padding = 'valid', activation = 'relu'))\n#model.add(Conv2D(filters=64, kernel_size = (3,3), strides =2, padding = 'valid', activation = 'relu'))\n#model.add(Conv2D(filters=128, kernel_size = (3,3), strides =2, padding = 'valid', activation = 'relu'))\n#model.add(Conv2D(filters=128, kernel_size = (3,3), strides =2, padding = 'valid', activation = 'relu'))\n\n#model.add(Dropout(0.13))\n#model.add(Flatten())\n#model.add(Dense(256, activation = 'relu'))\n#model.add(Dropout(0.13))\n#model.add(Dense(100, activation = 'relu'))\n#model.add(Dense(50, activation = 'relu'))\n#model.add(Dense(1 , activation=\"sigmoid\"))\n\n#model.compile(\n    #loss = tf.keras.losses.BinaryCrossentropy(),\n    #metrics=[metrics.binary_accuracy,f1_score],\n    #optimizer = tf.keras.optimizers.Adam(1e-3))","metadata":{"papermill":{"duration":0.213269,"end_time":"2022-12-13T12:45:01.68956","exception":false,"start_time":"2022-12-13T12:45:01.476291","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:24.278526Z","iopub.execute_input":"2024-11-18T14:16:24.278819Z","iopub.status.idle":"2024-11-18T14:16:26.954483Z","shell.execute_reply.started":"2024-11-18T14:16:24.278792Z","shell.execute_reply":"2024-11-18T14:16:26.953495Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dot_img_file = 'model.png'\ntf.keras.utils.plot_model(model, to_file=dot_img_file, show_shapes=True)","metadata":{"execution":{"iopub.status.busy":"2024-11-18T14:16:26.955783Z","iopub.execute_input":"2024-11-18T14:16:26.956191Z","iopub.status.idle":"2024-11-18T14:16:28.174482Z","shell.execute_reply.started":"2024-11-18T14:16:26.956126Z","shell.execute_reply":"2024-11-18T14:16:28.173355Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## This is where we balance class weights","metadata":{}},{"cell_type":"code","source":"from sklearn.utils import compute_class_weight\ntrain_classes = Y_train\nclass_weights = compute_class_weight(\n                                        class_weight = \"balanced\",\n                                        classes = np.unique(train_classes),\n                                        y = train_classes                                                    \n                                    )\nclass_weights = dict(zip(np.unique(train_classes), class_weights))\nclass_weights","metadata":{"papermill":{"duration":0.054636,"end_time":"2022-12-13T12:45:01.787016","exception":false,"start_time":"2022-12-13T12:45:01.73238","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Training the model","metadata":{}},{"cell_type":"code","source":"callback = tf.keras.callbacks.ModelCheckpoint(\n    filepath='our_cnn_best.h5',\n    monitor='val_binary_accuracy',\n    mode='max',\n    save_best_only=True, verbose=1)","metadata":{"execution":{"iopub.status.busy":"2024-11-18T14:16:48.4881Z","iopub.status.idle":"2024-11-18T14:16:48.488501Z","shell.execute_reply.started":"2024-11-18T14:16:48.488321Z","shell.execute_reply":"2024-11-18T14:16:48.488338Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.fit(\n    x_train,\n    y_train,\n    epochs = 10,\n    batch_size=20,\n    validation_data = (x_test,y_test),\n    class_weight= class_weights,\n    callbacks = callback\n)","metadata":{"papermill":{"duration":13.303133,"end_time":"2022-12-13T12:45:15.131496","exception":false,"start_time":"2022-12-13T12:45:01.828363","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:48.490312Z","iopub.status.idle":"2024-11-18T14:16:48.490678Z","shell.execute_reply.started":"2024-11-18T14:16:48.4905Z","shell.execute_reply":"2024-11-18T14:16:48.490518Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"best_cnn = load_model('/kaggle/working/our_cnn_best.h5', custom_objects={\"f1_score\": f1_score })\nbest_cnn.evaluate(x_test,y_test)","metadata":{"execution":{"iopub.status.busy":"2024-11-18T14:16:48.491816Z","iopub.status.idle":"2024-11-18T14:16:48.492188Z","shell.execute_reply.started":"2024-11-18T14:16:48.49199Z","shell.execute_reply":"2024-11-18T14:16:48.492007Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Plot confusion matrices for benchmark and transfer learning models\nfrom sklearn.metrics import confusion_matrix\nimport seaborn as sns\n\nplt.figure(figsize=(15, 5))\n\npreds = best_cnn.predict(x_test)\npreds = (preds >= 0.5).astype(np.int32)\n\ncm = confusion_matrix(y_test, preds)\ndf_cm = pd.DataFrame(cm, index=['LAA', 'CE'], columns=['LAA', 'CE'])\nplt.subplot(121)\nplt.title(\"Confusion matrix for our model\\n\")\nsns.heatmap(df_cm, annot=True, fmt=\"d\", cmap=\"YlGnBu\")\nplt.ylabel(\"Predicted\")\nplt.xlabel(\"Actual\")","metadata":{"execution":{"iopub.status.busy":"2024-11-18T14:16:48.493534Z","iopub.status.idle":"2024-11-18T14:16:48.493898Z","shell.execute_reply.started":"2024-11-18T14:16:48.49372Z","shell.execute_reply":"2024-11-18T14:16:48.493736Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Submission for kaggle competition","metadata":{}},{"cell_type":"code","source":"test1=[]\nfor i in test_df['file_path']:\n    x1=preprocess(i)\n    test1.append(x1)\n    print(i)\n    \ntest1=np.array(test1)\n","metadata":{"papermill":{"duration":18.955522,"end_time":"2022-12-13T12:45:34.133527","exception":false,"start_time":"2022-12-13T12:45:15.178005","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:48.494999Z","iopub.status.idle":"2024-11-18T14:16:48.495362Z","shell.execute_reply.started":"2024-11-18T14:16:48.495179Z","shell.execute_reply":"2024-11-18T14:16:48.495199Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cnn_pred=model.predict(test1)\ncnn_pred","metadata":{"papermill":{"duration":0.212752,"end_time":"2022-12-13T12:45:34.392434","exception":false,"start_time":"2022-12-13T12:45:34.179682","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:48.497386Z","iopub.status.idle":"2024-11-18T14:16:48.497749Z","shell.execute_reply.started":"2024-11-18T14:16:48.497573Z","shell.execute_reply":"2024-11-18T14:16:48.49759Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub = pd.DataFrame(test_df[\"patient_id\"].copy())\nsub[\"CE\"] = cnn_pred\nsub[\"LAA\"] = 1- sub[\"CE\"]\n\nsub = sub.groupby(\"patient_id\").mean()\nsub = sub[[\"CE\", \"LAA\"]].round(6).reset_index()\nsub","metadata":{"papermill":{"duration":0.083787,"end_time":"2022-12-13T12:45:34.524093","exception":false,"start_time":"2022-12-13T12:45:34.440306","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:48.498672Z","iopub.status.idle":"2024-11-18T14:16:48.499015Z","shell.execute_reply.started":"2024-11-18T14:16:48.49884Z","shell.execute_reply":"2024-11-18T14:16:48.498857Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"label_counts = train_df[\"label\"].value_counts()\nprint(label_counts)","metadata":{"execution":{"iopub.status.busy":"2024-11-18T14:16:48.500239Z","iopub.status.idle":"2024-11-18T14:16:48.500593Z","shell.execute_reply.started":"2024-11-18T14:16:48.500411Z","shell.execute_reply":"2024-11-18T14:16:48.500433Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub[\"prediction\"] = sub[\"CE\"].apply(lambda x : \"CE\" if x>=0.5 else \"LAA\")\nsub[\"actual\"] = [\"CE\", \"CE\", \"LAA\",\"LAA\"]\nprint(sub)\n\ndef weighted_log_loss(y_true, y_pred, weights, N):\n    y_true = np.array(y_true)\n    y_pred = np.array(y_pred)\n    weights = np.array(weights)\n    N = np.array(N) \n\n    # Compute log loss for each class\n    log_loss_per_class = -np.sum(y_true / N[:, np.newaxis] * np.log(y_pred), axis=0)\n\n    # Weighted log loss\n    weighted_log_loss_value = np.sum(weights * log_loss_per_class) / np.sum(weights)\n \n    return weighted_log_loss_value\n\ny_true = np.array([[1, 0],\n                [1, 0],\n                [0, 1],\n                [0, 1]])\n    \nN = [545,545,205,205]\n\ny_pred = np.clip(sub.iloc[:, [1, 2]].values, 1e-15, 1 - 1e-15)\n\nweights = np.array([1,1]) \n\nlog_loss = weighted_log_loss(y_true, y_pred, weights, N)\nprint(\"log_loss:\",log_loss)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-11-18T14:16:48.501575Z","iopub.status.idle":"2024-11-18T14:16:48.501921Z","shell.execute_reply.started":"2024-11-18T14:16:48.501748Z","shell.execute_reply":"2024-11-18T14:16:48.501764Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#sub.to_csv(\"submission.csv\", index = False)\n#!head submission.csv","metadata":{"papermill":{"duration":1.063784,"end_time":"2022-12-13T12:45:35.635044","exception":false,"start_time":"2022-12-13T12:45:34.57126","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-11-18T14:16:48.503656Z","iopub.status.idle":"2024-11-18T14:16:48.504009Z","shell.execute_reply.started":"2024-11-18T14:16:48.503834Z","shell.execute_reply":"2024-11-18T14:16:48.50385Z"},"trusted":true},"outputs":[],"execution_count":null}]}