{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30715,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Importing Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport time\nimport matplotlib.pyplot as plt\nimport plotly.express as px\nimport seaborn as sns\nimport pydicom as dicom\nimport pydicom\nimport json\nimport glob\nimport collections\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nimport cv2\nfrom skimage import measure\nfrom mpl_toolkits.mplot3d.art3d import Poly3DCollection\nimport plotly.graph_objects as go\nimport random\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-31T17:10:13.535043Z","iopub.execute_input":"2024-05-31T17:10:13.535556Z","iopub.status.idle":"2024-05-31T17:10:18.336019Z","shell.execute_reply.started":"2024-05-31T17:10:13.535513Z","shell.execute_reply":"2024-05-31T17:10:18.334703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Exploratory Data Analysis(EDA)\nLoad & | |Read Data","metadata":{}},{"cell_type":"code","source":"label_coordinates_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv')\ntrain_series = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\ndf_train = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\ndf_sub = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/sample_submission.csv')\ntest_series = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv')","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:18:17.009528Z","iopub.execute_input":"2024-05-31T17:18:17.010318Z","iopub.status.idle":"2024-05-31T17:18:17.224845Z","shell.execute_reply.started":"2024-05-31T17:18:17.010279Z","shell.execute_reply":"2024-05-31T17:18:17.223793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_coordinates_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:18:32.854134Z","iopub.execute_input":"2024-05-31T17:18:32.854620Z","iopub.status.idle":"2024-05-31T17:18:32.885906Z","shell.execute_reply.started":"2024-05-31T17:18:32.854584Z","shell.execute_reply":"2024-05-31T17:18:32.884407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_coordinates_df.shape","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:18:44.403713Z","iopub.execute_input":"2024-05-31T17:18:44.404213Z","iopub.status.idle":"2024-05-31T17:18:44.413834Z","shell.execute_reply.started":"2024-05-31T17:18:44.404156Z","shell.execute_reply":"2024-05-31T17:18:44.412252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_coordinates_df.tail","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:18:56.358739Z","iopub.execute_input":"2024-05-31T17:18:56.359928Z","iopub.status.idle":"2024-05-31T17:18:56.377734Z","shell.execute_reply.started":"2024-05-31T17:18:56.359874Z","shell.execute_reply":"2024-05-31T17:18:56.376360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loading Image","metadata":{}},{"cell_type":"code","source":"folder_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/100206310/1012284084'\ndicom_files = [f for f in os.listdir(folder_path) if f.endswith('.dcm')]","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:19:43.103591Z","iopub.execute_input":"2024-05-31T17:19:43.103974Z","iopub.status.idle":"2024-05-31T17:19:43.121769Z","shell.execute_reply.started":"2024-05-31T17:19:43.103944Z","shell.execute_reply":"2024-05-31T17:19:43.120697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"folder_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/100206310/1012284084'\ndicom_files = [f for f in os.listdir(folder_path) if f.endswith('.dcm')]\nlabel_coordinates_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv')\n\nstudy_id = folder_path.split('/')[-2]\nstudy_label_coordinates = label_coordinates_df[label_coordinates_df['study_id'] == int(study_id)]\nfiltered_dicom_files = []\nfiltered_label_coordinates = []\n\nfor dicom_file in dicom_files:\n    instance_number = int(dicom_file.split('.')[0])\n    corresponding_coordinates = study_label_coordinates[study_label_coordinates['instance_number'] == instance_number]\n    if not corresponding_coordinates.empty:\n        filtered_dicom_files.append(dicom_file)\n        filtered_label_coordinates.append(corresponding_coordinates)\nfig, axs = plt.subplots(1, 4, figsize=(20, 5))\nsecond_row_index = 1\nsecond_row_images = filtered_dicom_files[second_row_index : second_row_index + 4]\nsecond_row_coordinates = filtered_label_coordinates[second_row_index : second_row_index + 4]\n\nfor i, (dicom_file, label_coordinates) in enumerate(zip(second_row_images, second_row_coordinates)):\n    dicom_file_path = os.path.join(folder_path, dicom_file)\n    dicom_data = pydicom.dcmread(dicom_file_path)\n    image = dicom_data.pixel_array   \n    axs[i].imshow(image, cmap='gray')\n    axs[i].set_title(f'DICOM Image - {dicom_file}')\n    axs[i].axis('off')   \n    for _, row in label_coordinates.iterrows():\n        axs[i].plot(row['x'], row['y'], 'ro', markersize=5) \n        \nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:20:05.219490Z","iopub.execute_input":"2024-05-31T17:20:05.220326Z","iopub.status.idle":"2024-05-31T17:20:06.360643Z","shell.execute_reply.started":"2024-05-31T17:20:05.220257Z","shell.execute_reply":"2024-05-31T17:20:06.359033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:20:23.915756Z","iopub.execute_input":"2024-05-31T17:20:23.916591Z","iopub.status.idle":"2024-05-31T17:20:23.956650Z","shell.execute_reply.started":"2024-05-31T17:20:23.916545Z","shell.execute_reply":"2024-05-31T17:20:23.954927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.tail()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:20:37.634587Z","iopub.execute_input":"2024-05-31T17:20:37.635090Z","iopub.status.idle":"2024-05-31T17:20:37.668010Z","shell.execute_reply.started":"2024-05-31T17:20:37.635050Z","shell.execute_reply":"2024-05-31T17:20:37.666751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom(path):\n    dicom = pydicom.read_file(path)\n    data = dicom.pixel_array\n    data = data - np.min(data)\n    if np.max(data) != 0:\n        data = data / np.max(data)\n    data = (data * 255).astype(np.uint8)\n    return data","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:21:12.879127Z","iopub.execute_input":"2024-05-31T17:21:12.879571Z","iopub.status.idle":"2024-05-31T17:21:12.888251Z","shell.execute_reply.started":"2024-05-31T17:21:12.879540Z","shell.execute_reply":"2024-05-31T17:21:12.886638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib import animation, rc\nrc('animation', html='jshtml')\n\n\ndef create_animation(ims):\n    fig = plt.figure(figsize=(6, 6))\n    plt.axis('off')\n    im = plt.imshow(ims[0], cmap=\"gray\")\n\n    def animate_func(i):\n        im.set_array(ims[i])\n        return [im]\n\n    return animation.FuncAnimation(fig, animate_func, frames = len(ims), interval = 1000//24)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:21:43.778943Z","iopub.execute_input":"2024-05-31T17:21:43.779377Z","iopub.status.idle":"2024-05-31T17:21:43.791413Z","shell.execute_reply.started":"2024-05-31T17:21:43.779345Z","shell.execute_reply":"2024-05-31T17:21:43.790473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom_line(path):\n    t_paths = sorted(\n        glob.glob(os.path.join(path, \"*\")), \n        key=lambda x: int(os.path.splitext(os.path.basename(x))[0].split(\"-\")[-1]),\n    )\n    images = []\n    for filename in t_paths:\n        data = load_dicom(filename)\n        if data.max() == 0:\n            continue\n        images.append(data)\n        \n    return images","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:22:07.537932Z","iopub.execute_input":"2024-05-31T17:22:07.538329Z","iopub.status.idle":"2024-05-31T17:22:07.546588Z","shell.execute_reply.started":"2024-05-31T17:22:07.538295Z","shell.execute_reply":"2024-05-31T17:22:07.545099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images = load_dicom_line(\"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/100206310/1792451510\")\ncreate_animation(images)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:22:04.835535Z","iopub.execute_input":"2024-05-31T17:22:04.836011Z","iopub.status.idle":"2024-05-31T17:22:07.536339Z","shell.execute_reply.started":"2024-05-31T17:22:04.835969Z","shell.execute_reply":"2024-05-31T17:22:07.535122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pydicom\nfrom glob import glob\n\n\ndef read_dicom_files(path_to_folder):\n    files_glob = os.path.join(path_to_folder, \"*.dcm\")\n    sorted_files = sorted(glob(files_glob), key=lambda f: int(f.split('/')[-1].split('-')[-1].split('.')[0]))\n    return [pydicom.read_file(f) for f in sorted_files[:5]]\n\ndef calculate_level(mean, std):\n    return mean + 1.7 * std\n\ndef stats_image(image):\n    noncero_pixels = image[np.nonzero(image)]\n    if noncero_pixels.shape == (0,):\n        mean = 0\n        std = 0\n    else:\n        mean = np.mean(noncero_pixels)\n        std = np.std(noncero_pixels)\n    return (mean, std)\n\ndef image_orientation(dicom):\n    rt = 'unkown'\n    (x1, y1, _, x2, y2, _) = [round(v) for v in dicom.ImageOrientationPatient]\n    if (x1, y1, x2, y2) == (1, 0, 0, 0):\n        rt = 'coronal'\n    if (x1, y1, x2, y2) == (1, 0, 0, 1):\n        rt = 'axial'\n    if (x1, y1, x2, y2) == (0, 1, 0, 0):\n        rt = 'sagittal'\n    if rt == 'unkown':\n        raise ValueError(f'unkown ImageOrientationPatient: {dicom.ImageOrientationPatient}')\n    return rt\n\ndef plot_image_hist(image):\n    (mean, std) = stats_image(image) \n    pixels = image.ravel()\n    noncero_pixels = pixels[np.nonzero(pixels)]\n    noncero_pixels = (noncero_pixels - mean) / std\n    over_threshold = np.count_nonzero(noncero_pixels > calculate_level(mean, std))\n    \n    fig, (axi, axh) = plt.subplots(1, 2, figsize=(20, 3), gridspec_kw={'width_ratios': [1, 4]})\n    fig.suptitle(f'scan # ({over_threshold})')\n    \n    axh.hist(noncero_pixels, 200, range=(-5, 5))  \n    axh.set_xlim(-5, 5)\n\n    ax_limits = axh.get_ylim()\n    axh.vlines(mean, ymin=ax_limits[0], ymax=ax_limits[1], colors='r', label='Mean')\n    axh.vlines(mean + std, ymin=ax_limits[0], ymax=ax_limits[1], colors='g', linestyles='dotted', label='Mean + Std')\n    axh.vlines(calculate_level(mean, std), ymin=ax_limits[0], ymax=ax_limits[1], colors='b', linestyles='dashed', label='Threshold')\n\n    axi.imshow(image, cmap=plt.cm.gray)\n    axi.grid(False)\n    axi.axis('off')\n    axh.legend()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:23:30.175028Z","iopub.execute_input":"2024-05-31T17:23:30.175505Z","iopub.status.idle":"2024-05-31T17:23:30.199797Z","shell.execute_reply.started":"2024-05-31T17:23:30.175472Z","shell.execute_reply":"2024-05-31T17:23:30.198813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_to_folder = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/100206310/1012284084\"\n\ndicom_files = read_dicom_files(path_to_folder)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:24:41.119269Z","iopub.execute_input":"2024-05-31T17:24:41.119709Z","iopub.status.idle":"2024-05-31T17:24:41.160371Z","shell.execute_reply.started":"2024-05-31T17:24:41.119678Z","shell.execute_reply":"2024-05-31T17:24:41.159286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.express as px\n\ndef read_dicom_files(path_to_folder):\n    files_glob = os.path.join(path_to_folder, \"*.dcm\")\n    sorted_files = sorted(glob(files_glob), key=lambda f: int(f.split('/')[-1].split('.')[0]))\n    return [pydicom.read_file(f) for f in sorted_files]\n\ndef get_flair_images(dicom_files):\n    images = [s.pixel_array for s in dicom_files]\n    return np.array(images)\n\npath_to_folder = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/100206310/1012284084\"\ndicom_files = read_dicom_files(path_to_folder)\nflair_images = get_flair_images(dicom_files)\nfig = px.imshow(flair_images, animation_frame=0, binary_string=True, labels=dict(x=\"FLAIR Images\", animation_frame=\"Scan\"), height=800)\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:24:53.808786Z","iopub.execute_input":"2024-05-31T17:24:53.809295Z","iopub.status.idle":"2024-05-31T17:24:57.967834Z","shell.execute_reply.started":"2024-05-31T17:24:53.809253Z","shell.execute_reply":"2024-05-31T17:24:57.966313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for img in flair_images[:5]:\n    plot_image_hist(img)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:28:35.008698Z","iopub.execute_input":"2024-05-31T17:28:35.009154Z","iopub.status.idle":"2024-05-31T17:28:39.027830Z","shell.execute_reply.started":"2024-05-31T17:28:35.009121Z","shell.execute_reply":"2024-05-31T17:28:39.026948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_files[1]","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:28:54.108901Z","iopub.execute_input":"2024-05-31T17:28:54.109403Z","iopub.status.idle":"2024-05-31T17:28:54.121657Z","shell.execute_reply.started":"2024-05-31T17:28:54.109366Z","shell.execute_reply":"2024-05-31T17:28:54.119748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom_images(folder_path, num_images=5):\n    dicom_files = sorted([os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.dcm')])[:num_images]\n    images = [pydicom.dcmread(f).pixel_array for f in dicom_files]\n    return np.stack(images, axis=-1)\n\ndef plot_3d(image, threshold=-300):\n\n    verts, faces, _, _ = measure.marching_cubes(image, level=threshold)  \n    \n    fig = plt.figure(figsize=(10, 10))\n    ax = fig.add_subplot(111, projection='3d')    \n    \n    mesh = Poly3DCollection(verts[faces], alpha=0.1)\n    face_color = [0.5, 0.5, 1]  # light blue\n    mesh.set_facecolor(face_color)\n    ax.add_collection3d(mesh)\n    \n    ax.set_xlim(0, image.shape[0])\n    ax.set_ylim(0, image.shape[1])\n    ax.set_zlim(0, image.shape[2])\n    \n    plt.show()\n\n\nfolder_path = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/100206310/1012284084\"\ndicom_images = load_dicom_images(folder_path, num_images=5)\nplot_3d(dicom_images, threshold=300)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:29:14.357520Z","iopub.execute_input":"2024-05-31T17:29:14.357975Z","iopub.status.idle":"2024-05-31T17:29:33.765379Z","shell.execute_reply.started":"2024-05-31T17:29:14.357942Z","shell.execute_reply":"2024-05-31T17:29:33.764419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom_images(folder_path, num_images=5):\n    dicom_files = sorted([os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.dcm')])[:num_images]\n    images = [pydicom.dcmread(f).pixel_array for f in dicom_files]\n    return np.stack(images, axis=-1)\n\ndef plot_3d_interactive(image, threshold=-300):    \n    verts, faces, _, _ = measure.marching_cubes(image, level=threshold)   \n    \n    fig = go.Figure(data=[\n        go.Mesh3d(\n            x=verts[:, 0],\n            y=verts[:, 1],\n            z=verts[:, 2],\n            i=faces[:, 0],\n            j=faces[:, 1],\n            k=faces[:, 2],\n            color='blue',\n            opacity=0.1\n        )\n    ])\n    \n    fig.update_layout(\n        scene=dict(\n            xaxis=dict(visible=True),\n            yaxis=dict(visible=True),\n            zaxis=dict(visible=True)\n        ),\n        width=800,\n        height=800,\n        title=\"Interactive 3D DICOM Image Visualization\"\n    )\n    \n    fig.show()\n\n\nfolder_path = \"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/1002894806/866293114\"\ndicom_images = load_dicom_images(folder_path, num_images=5)\nplot_3d_interactive(dicom_images, threshold=100)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:30:30.674897Z","iopub.execute_input":"2024-05-31T17:30:30.675648Z","iopub.status.idle":"2024-05-31T17:30:31.042691Z","shell.execute_reply.started":"2024-05-31T17:30:30.675613Z","shell.execute_reply":"2024-05-31T17:30:31.041585Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mpl_toolkits.mplot3d import Axes3D\n\ndef plot_3d_image(image):   \n    fig = plt.figure(figsize=(10, 8))\n    ax = fig.add_subplot(111, projection='3d')\n    rows, cols = image.shape\n    x, y = np.meshgrid(np.arange(cols), np.arange(rows))\n    ax.plot_surface(x, y, image, cmap='viridis', edgecolor='none')\n    ax.set_xlabel('X')\n    ax.set_ylabel('Y')\n    ax.set_zlabel('Intensity')\n    ax.set_title('3D Plot of Image')\n    plt.show()\n    \nplot_3d_image(flair_images[0])","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:30:56.894359Z","iopub.execute_input":"2024-05-31T17:30:56.894747Z","iopub.status.idle":"2024-05-31T17:30:57.801811Z","shell.execute_reply.started":"2024-05-31T17:30:56.894719Z","shell.execute_reply":"2024-05-31T17:30:57.800395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:31:13.208470Z","iopub.execute_input":"2024-05-31T17:31:13.208871Z","iopub.status.idle":"2024-05-31T17:31:13.223421Z","shell.execute_reply.started":"2024-05-31T17:31:13.208841Z","shell.execute_reply":"2024-05-31T17:31:13.222169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub.shape,test_series.shape,train_series.shape,label_coordinates_df.shape,df_train.shape","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:31:24.133589Z","iopub.execute_input":"2024-05-31T17:31:24.134015Z","iopub.status.idle":"2024-05-31T17:31:24.143942Z","shell.execute_reply.started":"2024-05-31T17:31:24.133981Z","shell.execute_reply":"2024-05-31T17:31:24.142350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_series.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:32:31.475000Z","iopub.execute_input":"2024-05-31T17:32:31.475548Z","iopub.status.idle":"2024-05-31T17:32:31.492456Z","shell.execute_reply.started":"2024-05-31T17:32:31.475508Z","shell.execute_reply":"2024-05-31T17:32:31.490701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_series.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:34:34.154526Z","iopub.execute_input":"2024-05-31T17:34:34.154997Z","iopub.status.idle":"2024-05-31T17:34:34.174683Z","shell.execute_reply.started":"2024-05-31T17:34:34.154963Z","shell.execute_reply":"2024-05-31T17:34:34.172700Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"*  Reshape and Process Training Data\n*  Creating a Target for Training\n*   Creating a Test Data ","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nfrom sklearn.ensemble import RandomForestClassifier","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:35:32.500242Z","iopub.execute_input":"2024-05-31T17:35:32.500935Z","iopub.status.idle":"2024-05-31T17:35:33.016965Z","shell.execute_reply.started":"2024-05-31T17:35:32.500891Z","shell.execute_reply":"2024-05-31T17:35:33.015274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nfrom sklearn.ensemble import RandomForestClassifier\n\ndf_train_melted = df_train.melt(id_vars=['study_id'], var_name='condition_level', value_name='severity')\ndf_train_melted[['condition', 'level']] = df_train_melted['condition_level'].str.rsplit('_', n=2, expand=True).iloc[:, 1:]\n\nle_severity = LabelEncoder()\ndf_train_melted['severity_encoded'] = le_severity.fit_transform(df_train_melted['severity'])\n\nX_train = df_train_melted[['study_id', 'condition', 'level']]\ny_train = df_train_melted['severity_encoded']\n\nX_train = pd.get_dummies(X_train, columns=['condition', 'level'])\ntest_rows = []\nfor _, row in test_series.iterrows():\n    for condition in ['left_neural_foraminal_narrowing', 'right_neural_foraminal_narrowing', 'left_subarticular_stenosis', 'right_subarticular_stenosis', 'spinal_canal_stenosis']:\n        for level in ['l1_l2', 'l2_l3', 'l3_l4', 'l4_l5', 'l5_s1']:\n            test_rows.append({\n                'study_id': row['study_id'],\n                'condition': condition,\n                'level': level\n            })\n\nX_test = pd.DataFrame(test_rows)\nX_test = pd.get_dummies(X_test, columns=['condition', 'level'])\nX_test = X_test.reindex(columns=X_train.columns, fill_value=0)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:35:54.840230Z","iopub.execute_input":"2024-05-31T17:35:54.840683Z","iopub.status.idle":"2024-05-31T17:35:55.051803Z","shell.execute_reply.started":"2024-05-31T17:35:54.840650Z","shell.execute_reply":"2024-05-31T17:35:55.050165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:36:04.300912Z","iopub.execute_input":"2024-05-31T17:36:04.301572Z","iopub.status.idle":"2024-05-31T17:36:04.332022Z","shell.execute_reply.started":"2024-05-31T17:36:04.301520Z","shell.execute_reply":"2024-05-31T17:36:04.330557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = RandomForestClassifier(random_state=42)\nmodel.fit(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:36:14.315506Z","iopub.execute_input":"2024-05-31T17:36:14.317273Z","iopub.status.idle":"2024-05-31T17:36:24.070460Z","shell.execute_reply.started":"2024-05-31T17:36:14.317204Z","shell.execute_reply":"2024-05-31T17:36:24.068995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions_proba = model.predict_proba(X_test)\npredictions_df = pd.DataFrame(predictions_proba, columns=le_severity.classes_)\npredictions_df['study_id'] = X_test['study_id'].values\npredictions_df['condition_level'] = X_test.index.map(lambda idx: f\"{test_rows[idx]['condition']}_{test_rows[idx]['level']}\")\npredictions_df['row_id'] = predictions_df['study_id'].astype(str) + '_' + predictions_df['condition_level']","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:36:51.095556Z","iopub.execute_input":"2024-05-31T17:36:51.095976Z","iopub.status.idle":"2024-05-31T17:36:51.118816Z","shell.execute_reply.started":"2024-05-31T17:36:51.095945Z","shell.execute_reply":"2024-05-31T17:36:51.117676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub1 = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:37:01.020409Z","iopub.execute_input":"2024-05-31T17:37:01.020894Z","iopub.status.idle":"2024-05-31T17:37:01.039756Z","shell.execute_reply.started":"2024-05-31T17:37:01.020858Z","shell.execute_reply":"2024-05-31T17:37:01.038432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"normal_mild_value = predictions_df['Normal/Mild'].iloc[0]\nmoderate_value = predictions_df['Moderate'].iloc[0]\nsevere_value = predictions_df['Severe'].iloc[0]\n\ndf_sub['normal_mild'] = (normal_mild_value+df_sub1['normal_mild'])/2\ndf_sub['moderate'] =(moderate_value+df_sub1['moderate'])/2\ndf_sub['severe'] = severe_value+df_sub1['severe']/2","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:37:12.220098Z","iopub.execute_input":"2024-05-31T17:37:12.220582Z","iopub.status.idle":"2024-05-31T17:37:12.231536Z","shell.execute_reply.started":"2024-05-31T17:37:12.220548Z","shell.execute_reply":"2024-05-31T17:37:12.229952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub.sample(4)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:37:22.559670Z","iopub.execute_input":"2024-05-31T17:37:22.560229Z","iopub.status.idle":"2024-05-31T17:37:22.580409Z","shell.execute_reply.started":"2024-05-31T17:37:22.560166Z","shell.execute_reply":"2024-05-31T17:37:22.578595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(14, 8))\nplt.plot(df_sub['row_id'], df_sub['normal_mild'], label='Normal/Mild', marker='o')\nplt.plot(df_sub['row_id'], df_sub['moderate'], label='Moderate', marker='o')\nplt.plot(df_sub['row_id'], df_sub['severe'], label='Severe', marker='o')\n\nplt.xlabel('Conditions')\nplt.ylabel('Values')\nplt.title('Normal/Mild, Moderate, and Severe Values for Different Conditions')\nplt.xticks(rotation=90)\nplt.legend()\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:37:35.529370Z","iopub.execute_input":"2024-05-31T17:37:35.529780Z","iopub.status.idle":"2024-05-31T17:37:36.132988Z","shell.execute_reply.started":"2024-05-31T17:37:35.529752Z","shell.execute_reply":"2024-05-31T17:37:36.131485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-05-31T17:37:51.259327Z","iopub.execute_input":"2024-05-31T17:37:51.259921Z","iopub.status.idle":"2024-05-31T17:37:51.270277Z","shell.execute_reply.started":"2024-05-31T17:37:51.259884Z","shell.execute_reply":"2024-05-31T17:37:51.268920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Thank You ","metadata":{}}]}