{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model, Sequential\nfrom tensorflow.keras.layers import Input, Dense, Flatten, GlobalAveragePooling2D, Conv2D, MaxPooling2D, Dropout\nfrom tensorflow.keras.applications import EfficientNetB0\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.ensemble import AdaBoostClassifier\nfrom sklearn.metrics import confusion_matrix, classification_report\nfrom sklearn.base import BaseEstimator, ClassifierMixin\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T15:42:24.252911Z","iopub.execute_input":"2024-12-23T15:42:24.253197Z","iopub.status.idle":"2024-12-23T15:42:34.131361Z","shell.execute_reply.started":"2024-12-23T15:42:24.253174Z","shell.execute_reply":"2024-12-23T15:42:34.130419Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"main_folder = \"/kaggle/input/aptos2019-blindness-detection\"\ntrain_csv = os.path.join(main_folder, \"train.csv\")\ntest_csv = os.path.join(main_folder, \"test.csv\")\ntrain_folder = os.path.join(main_folder, \"train_images\")\ntest_folder = os.path.join(main_folder, \"test_images\")\n\n\n\n\ntrain_df = pd.read_csv(train_csv)\ntest_df = pd.read_csv(test_csv)\n\n# Preprocess data\ntrain_df['id_code'] += '.png'\ntest_df['id_code'] += '.png'\n\n# Preprocess data\nimg_size = (224, 224)\nbatch_size = 32\n\ntrain_datagen = ImageDataGenerator(rescale=1./255)\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df,\n    directory=train_folder,\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    target_size=img_size,\n    class_mode=\"raw\",\n    batch_size=batch_size,\n    validate_filenames=False\n)\n\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_dataframe(\n    test_df,\n    directory=test_folder,\n    x_col=\"id_code\",\n    y_col=None,\n    target_size=img_size,\n    class_mode=None,\n    batch_size=batch_size,\n    shuffle=False,\n    validate_filenames=False\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T15:42:57.404564Z","iopub.execute_input":"2024-12-23T15:42:57.405182Z","iopub.status.idle":"2024-12-23T15:42:57.448731Z","shell.execute_reply.started":"2024-12-23T15:42:57.405149Z","shell.execute_reply":"2024-12-23T15:42:57.447847Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_limited_data(generator, limit):\n    X = []\n    y = [] if generator.class_mode is not None else None\n    total_loaded = 0\n    for data in generator:\n        if generator.class_mode is not None:\n            images, labels = data\n        else:\n            images = data\n            labels = None\n        \n        for i in range(len(images)):\n            if total_loaded >= limit:\n                break\n            X.append(images[i])\n            if labels is not None:\n                y.append(labels[i])\n            total_loaded += 1\n        if total_loaded >= limit:\n            break\n    return np.array(X), np.array(y) if y is not None else None\ntrain_images, train_labels = load_limited_data(train_generator, limit=1000)\ntest_images, _ = load_limited_data(test_generator, limit=1000)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T15:43:01.058539Z","iopub.execute_input":"2024-12-23T15:43:01.059023Z","iopub.status.idle":"2024-12-23T15:45:53.253062Z","shell.execute_reply.started":"2024-12-23T15:43:01.058986Z","shell.execute_reply":"2024-12-23T15:45:53.252114Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_cnn_model(input_shape):\n    model = Sequential([\n        Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),\n        MaxPooling2D((2, 2)),\n        Conv2D(64, (3, 3), activation='relu'),\n        MaxPooling2D((2, 2)),\n        Flatten(),\n        Dense(128, activation='relu'),\n        Dropout(0.5),\n        Dense(5, activation='softmax')\n    ])\n    return model\n\n# EfficientNet Model\ndef create_efficientnet_model(input_shape):\n    base_model = EfficientNetB0(include_top=False, input_shape=input_shape, weights=\"imagenet\")\n    x = GlobalAveragePooling2D()(base_model.output)\n    x = Dense(128, activation='relu')(x)\n    x = Dropout(0.5)(x)\n    output = Dense(5, activation='softmax')(x)\n    model = Model(inputs=base_model.input, outputs=output)\n    return model\n\ninput_shape = img_size + (3,)\ncnn_model = create_cnn_model(input_shape)\nefficientnet_model = create_efficientnet_model(input_shape)\n\n# Custom Wrapper for AdaBoost Compatibility\nclass KerasClassifierWrapper:\n    def __init__(self, model):\n        self.model = model\n\n    def fit(self, X, y):\n        y_cat = to_categorical(y, num_classes=5)\n        self.model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n        self.model.fit(X, y_cat, batch_size=32, epochs=50, verbose=1)\n        return self\n\n    def predict(self, X):\n        return np.argmax(self.model.predict(X), axis=-1)\n\n# Prepare and Train Models\ncnn_wrapper = KerasClassifierWrapper(cnn_model)\nefficientnet_wrapper = KerasClassifierWrapper(efficientnet_model)\n\ncnn_wrapper.fit(train_images, train_labels)\nefficientnet_wrapper.fit(train_images, train_labels)\n\ncnn_predictions = cnn_wrapper.predict(train_images).reshape(-1, 1)\nefficientnet_predictions = efficientnet_wrapper.predict(train_images).reshape(-1, 1)\n\n# Stack Predictions for AdaBoost\nstacked_predictions = np.hstack([cnn_predictions, efficientnet_predictions])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T15:45:53.254250Z","iopub.execute_input":"2024-12-23T15:45:53.254560Z","iopub.status.idle":"2024-12-23T15:52:46.611934Z","shell.execute_reply.started":"2024-12-23T15:45:53.254530Z","shell.execute_reply":"2024-12-23T15:52:46.611214Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"adaboost = AdaBoostClassifier(n_estimators=5)\nadaboost.fit(stacked_predictions, train_labels)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T15:52:46.613199Z","iopub.execute_input":"2024-12-23T15:52:46.613442Z","iopub.status.idle":"2024-12-23T15:52:46.641567Z","shell.execute_reply.started":"2024-12-23T15:52:46.613411Z","shell.execute_reply":"2024-12-23T15:52:46.640948Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cnn_test_predictions = cnn_wrapper.predict(test_images).reshape(-1, 1)\nefficientnet_test_predictions = efficientnet_wrapper.predict(test_images).reshape(-1, 1)\n\ntest_stacked_predictions = np.hstack([cnn_test_predictions, efficientnet_test_predictions])\nboost_predictions = adaboost.predict(test_stacked_predictions)\n\n# Metrics\nprint(\"Confusion Matrix:\")\nprint(confusion_matrix(test_generator.classes[:1000], boost_predictions))\n\nprint(\"\\nClassification Report:\")\nprint(classification_report(test_generator.classes[:1000], boost_predictions))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-22T10:23:18.570944Z","iopub.execute_input":"2024-12-22T10:23:18.571239Z","iopub.status.idle":"2024-12-22T10:23:18.830746Z","shell.execute_reply.started":"2024-12-22T10:23:18.571214Z","shell.execute_reply":"2024-12-22T10:23:18.829676Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score, confusion_matrix\n\n# Get predictions from AdaBoost\nadaboost_predictions = adaboost.predict(stacked_predictions)\n\n# Calculate accuracy\naccuracy = accuracy_score(train_labels, adaboost_predictions)\n\n# Calculate F1 score, precision, and recall\nf1 = f1_score(train_labels, adaboost_predictions, average='weighted')\nrecall = recall_score(train_labels, adaboost_predictions, average='weighted')\nprecision = precision_score(train_labels, adaboost_predictions, average='weighted')\n\n# Confusion Matrix\nconf_matrix = confusion_matrix(train_labels, adaboost_predictions)\n\n# Display results\nprint(f'Accuracy: {accuracy:.4f}')\nprint(f'F1 Score (Weighted): {f1:.4f}')\nprint(f'Recall (Weighted): {recall:.4f}')\nprint(f'Precision (Weighted): {precision:.4f}')\nprint(f'Confusion Matrix:\\n{conf_matrix}')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T15:54:48.226734Z","iopub.execute_input":"2024-12-23T15:54:48.227049Z","iopub.status.idle":"2024-12-23T15:54:48.249959Z","shell.execute_reply.started":"2024-12-23T15:54:48.227026Z","shell.execute_reply":"2024-12-23T15:54:48.249208Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix\n\n# Get class labels from the dataframe\nclass_labels = train_df['diagnosis'].unique()\n\n# # Calculate confusion matrix\nconf_matrix = confusion_matrix(train_labels, adaboost_predictions)\n\n# # Plotting the confusion matrix using seaborn heatmap\n# plt.figure(figsize=(8, 6))\n# sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=class_labels, yticklabels=class_labels)\n# plt.title(\"Confusion Matrix\")\n# plt.xlabel('Predicted Labels')\n# plt.ylabel('True Labels')\n# plt.show()\n\n\nplt.figure(figsize=(8, 6))  # Adjusted size\nsns.heatmap(conf_matrix, annot=True, fmt='d', cmap='viridis', \n            xticklabels=train_df['diagnosis'].unique(), \n            yticklabels=train_df['diagnosis'].unique(),\n            linewidths=0.5, linecolor='black', cbar_kws={'orientation': 'vertical'})\nplt.title(\"Confusion Matrix\", fontsize=14)\nplt.xlabel('Predicted Labels', fontsize=12)\nplt.ylabel('True Labels', fontsize=12)\nplt.xticks(fontsize=10, rotation=45)  # Adjust rotation for better visibility\nplt.yticks(fontsize=10, rotation=0)\nplt.tight_layout()  # Ensures proper spacing for screenshot\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T16:00:24.305546Z","iopub.execute_input":"2024-12-23T16:00:24.305896Z","iopub.status.idle":"2024-12-23T16:00:24.677353Z","shell.execute_reply.started":"2024-12-23T16:00:24.305867Z","shell.execute_reply":"2024-12-23T16:00:24.676676Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**VITXCNN**","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.layers import Input, Dense, Flatten, GlobalAveragePooling1D\ndef create_vit_model(input_shape):\n    inputs = Input(shape=input_shape)\n    patches = tf.keras.layers.Conv2D(64, (16, 16), strides=(16, 16), padding='valid')(inputs)\n    flattened_patches = tf.keras.layers.Reshape((-1, 64))(patches)\n    x = tf.keras.layers.Dense(128, activation='relu')(flattened_patches)\n    for _ in range(4):\n        x1 = tf.keras.layers.LayerNormalization()(x)\n        attention_output = tf.keras.layers.MultiHeadAttention(num_heads=4, key_dim=64)(x1, x1)\n        x2 = x1 + attention_output\n        feedforward = tf.keras.Sequential([tf.keras.layers.Dense(256, activation='relu'),\n                                           tf.keras.layers.Dense(128)])(x2)\n        x = x2 + feedforward\n    x = GlobalAveragePooling1D()(x)\n    x = Dropout(0.5)(x)\n    outputs = Dense(5, activation=\"softmax\")(x)\n    model = Model(inputs, outputs)\n    return model\n\n# CNN Model\ndef create_cnn_model(input_shape):\n    model = Sequential([\n        Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),\n        MaxPooling2D((2, 2)),\n        Conv2D(64, (3, 3), activation='relu'),\n        MaxPooling2D((2, 2)),\n        Flatten(),\n        Dense(128, activation='relu'),\n        Dropout(0.5),\n        Dense(5, activation='softmax')\n    ])\n    return model\n\ninput_shape = img_size + (3,)\ncnn_model = create_cnn_model(input_shape)\nvit_model = create_vit_model(input_shape)\n\n# Custom Wrapper for AdaBoost Compatibility\nclass KerasClassifierWrapper:\n    def __init__(self, model):\n        self.model = model\n\n    def fit(self, X, y):\n        y_cat = to_categorical(y, num_classes=5)\n        self.model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n        self.model.fit(X, y_cat, batch_size=32, epochs=50, verbose=1)\n        return self\n\n    def predict(self, X):\n        return np.argmax(self.model.predict(X), axis=-1)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T16:12:59.026425Z","iopub.execute_input":"2024-12-23T16:12:59.026759Z","iopub.status.idle":"2024-12-23T16:12:59.241621Z","shell.execute_reply.started":"2024-12-23T16:12:59.026728Z","shell.execute_reply":"2024-12-23T16:12:59.240975Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cnn_wrapper = KerasClassifierWrapper(cnn_model)\nvit_wrapper = KerasClassifierWrapper(vit_model)\n\ncnn_wrapper.fit(train_images, train_labels)\nvit_wrapper.fit(train_images, train_labels)\n\n# Get predictions\ncnn_predictions = cnn_wrapper.predict(train_images).reshape(-1, 1)\nvit_predictions = vit_wrapper.predict(train_images).reshape(-1, 1)\n\n# Stack predictions for AdaBoost\nstacked_predictions = np.hstack([cnn_predictions, vit_predictions])\nadaboost = AdaBoostClassifier(n_estimators=5)\nadaboost.fit(stacked_predictions, train_labels)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T16:13:03.808139Z","iopub.execute_input":"2024-12-23T16:13:03.808523Z","iopub.status.idle":"2024-12-23T16:15:38.234013Z","shell.execute_reply.started":"2024-12-23T16:13:03.808487Z","shell.execute_reply":"2024-12-23T16:15:38.233276Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score, confusion_matrix\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nadaboost_predictions = adaboost.predict(stacked_predictions)\n\n# Evaluate AdaBoost model\naccuracy = accuracy_score(train_labels, adaboost_predictions)\nf1 = f1_score(train_labels, adaboost_predictions, average='weighted')\nrecall = recall_score(train_labels, adaboost_predictions, average='weighted')\nprecision = precision_score(train_labels, adaboost_predictions, average='weighted')\n\n# Confusion Matrix\nconf_matrix = confusion_matrix(train_labels, adaboost_predictions)\n\n# Display results\nprint(f'Accuracy: {accuracy:.4f}')\nprint(f'F1 Score (Weighted): {f1:.4f}')\nprint(f'Recall (Weighted): {recall:.4f}')\nprint(f'Precision (Weighted): {precision:.4f}')\nprint(f'Confusion Matrix:\\n{conf_matrix}')\n\n# Visualizing Confusion Matrix\nplt.figure(figsize=(8, 6))  # Adjusted size\nsns.heatmap(conf_matrix, annot=True, fmt='d', cmap='viridis', \n            xticklabels=train_df['diagnosis'].unique(), \n            yticklabels=train_df['diagnosis'].unique(),\n            linewidths=0.5, linecolor='black', cbar_kws={'orientation': 'vertical'})\nplt.title(\"Confusion Matrix\", fontsize=14)\nplt.xlabel('Predicted Labels', fontsize=12)\nplt.ylabel('True Labels', fontsize=12)\nplt.xticks(fontsize=10, rotation=45)  # Adjust rotation for better visibility\nplt.yticks(fontsize=10, rotation=0)\nplt.tight_layout()  # Ensures proper spacing for screenshot\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-23T16:15:42.562032Z","iopub.execute_input":"2024-12-23T16:15:42.562300Z","iopub.status.idle":"2024-12-23T16:15:42.833504Z","shell.execute_reply.started":"2024-12-23T16:15:42.562278Z","shell.execute_reply":"2024-12-23T16:15:42.832690Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}