{"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":"none","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30775,"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 \n\n\"\"\"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\"\"\"\n\ndf_train = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\ndf_train_serie_descriptions = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\ndf_submission = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/sample_submission.csv')\n\n# Drop na\ndf_train = df_train.dropna()\n\n# Update words with numbers (0,1,2 for the 3 different entities)\ndef replace_words_with_numbers(df_train):\n    for column in df_train.columns:\n        if column != 'study_id':\n            unique_words = df_train[column].unique()\n            if len(unique_words) != 3:\n                raise ValueError(f\"{column} has more than 3 unique words.\\n{unique_words}\")\n            word_to_number = {word: i for i, word in enumerate(unique_words)}\n            df_train[column] = df_train[column].map(word_to_number)\n    return df_train\n\n# Use function\ndf_replaced = replace_words_with_numbers(df_train)\n\nprint(df_replaced.info())\nprint(df_replaced.describe())\nprint(df_submission.info())","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-09-30T13:31:43.180790Z","iopub.execute_input":"2024-09-30T13:31:43.181186Z","iopub.status.idle":"2024-09-30T13:31:43.336245Z","shell.execute_reply.started":"2024-09-30T13:31:43.181147Z","shell.execute_reply":"2024-09-30T13:31:43.335200Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plots\nimport matplotlib.pyplot as plt\n# Training datasets\n# train_test_split and preprocessing data\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\n# Keras -- Neural Network\nfrom tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.layers import LSTM, Dense, Dropout, SimpleRNN, Flatten, Conv2D, MaxPooling2D\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing import image\n\n# Set X and y\nSEED = 42\nX = df_replaced[['spinal_canal_stenosis_l1_l2', 'spinal_canal_stenosis_l2_l3']]\ny = df_replaced['spinal_canal_stenosis_l3_l4']\n# Set train and test\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=SEED)\n\n# Define Sequential model\nmodel = Sequential()\n\n# Add the first layer with 10 neurons and activation ReLU\nmodel.add(Dense(10, input_dim=X_train.shape[1], activation='relu'))\n# Add a second layer with 8 neurons and activation ReLU\nmodel.add(Dense(8, activation='relu'))\n# Add a third layer as output and softmax with 3 neurons. 3 is the number of possible classifications in the dataset\nmodel.add(Dense(3, activation='softmax'))\n\n# Compile the model and use accuracy as metrics\nmodel.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n\n# Define EarlyStopping to prevent to continue after it's not improving anymore (so less chance of OverFitting)\nearly_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)\n\n# Train the model with 100 epochs\nhistory = model.fit(X_train, y_train, epochs=3, validation_data=(X_test, y_test), callbacks=[early_stopping])\n\n\n# Plot trend of loss and accuracy for both train and test\nplt.figure(figsize=(12, 6))\n\n# Loss\nplt.subplot(1, 2, 1)\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.title('Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend()\n\n# Accuracy\nplt.subplot(1, 2, 2)\nplt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.title('Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend()\n\nplt.show()\n\n# Create previsions on test data\ny_pred = model.predict(X_test)\ny_pred_classes = np.argmax(y_pred, axis=1)\n\n# Check previsions with original data\naccuracy = np.mean(y_pred_classes == y_test)\nprint(f'Accuracy on test set: {accuracy:.4f}')","metadata":{"execution":{"iopub.status.busy":"2024-09-30T13:50:11.218533Z","iopub.execute_input":"2024-09-30T13:50:11.218989Z","iopub.status.idle":"2024-09-30T13:50:13.770876Z","shell.execute_reply.started":"2024-09-30T13:50:11.218945Z","shell.execute_reply":"2024-09-30T13:50:13.769693Z"},"trusted":true},"execution_count":null,"outputs":[]}]}