{"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":30761,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport glob\nimport pydicom\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split, GridSearchCV\nfrom sklearn.metrics import accuracy_score\n\n# Load datasets\ndf_train = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\ntest_series = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv')\ndf_sub = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/sample_submission.csv')\n\n# Prepare features and labels\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=1, expand=True)\nle_severity = LabelEncoder()\ndf_train_melted['severity_encoded'] = le_severity.fit_transform(df_train_melted['severity'])\nX_train = df_train_melted[['study_id', 'condition', 'level']]\ny_train = df_train_melted['severity_encoded']\nX_train = pd.get_dummies(X_train, columns=['condition', 'level'])\n\n# Split data for validation\nX_train_split, X_valid, y_train_split, y_valid = train_test_split(X_train, y_train, test_size=0.2, random_state=42)\n\n# Define model and parameters for Grid Search\nrf_model = RandomForestClassifier()\nparam_grid = {\n    'n_estimators': [50, 100, 200],\n    'max_depth': [10, 20, 30],\n    'min_samples_split': [2, 5, 10]\n}\ngrid_search = GridSearchCV(rf_model, param_grid, cv=5, n_jobs=-1, scoring='accuracy')\n\n# Fit model\ngrid_search.fit(X_train_split, y_train_split)\n\n# Best model and parameters\nbest_model = grid_search.best_estimator_\nprint(f\"Best Parameters: {grid_search.best_params_}\")\n\n# Predict and evaluate\ny_valid_pred = best_model.predict(X_valid)\naccuracy = accuracy_score(y_valid, y_valid_pred)\nprint(f\"Validation Accuracy Score: {accuracy:.4f}\")\n\n# Prepare test data\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)\n\n# Make predictions\npredictions_proba = best_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']\n\n# Post-process predictions for submission\nnormal_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 / 2.3\ndf_sub['moderate'] = moderate_value * 1.47\ndf_sub['severe'] = 1 - (normal_mild_value / 2.3 + moderate_value * 1.47) + severe_value - severe_value\n\n# Save to CSV\ndf_sub.to_csv('submission.csv', index=False)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}