{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":131653,"databundleVersionId":15802687}],"dockerImageVersionId":31286,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nhospital_ref = pd.read_csv(\"/kaggle/input/ai-emergency-medicine-turkiye/hospital_reference.csv\")\nicd10_ref = pd.read_csv(\"/kaggle/input/ai-emergency-medicine-turkiye/icd10_reference.csv\")\n\nsample_sub = pd.read_csv(\"/kaggle/input/ai-emergency-medicine-turkiye/sample_submission.csv\")\nsupplemental_data = pd.read_csv(\"/kaggle/input/ai-emergency-medicine-turkiye/supplemental_data.csv\")\n\ntrain = pd.read_csv(\"/kaggle/input/ai-emergency-medicine-turkiye/train.csv\")\ntest = pd.read_csv(\"/kaggle/input/ai-emergency-medicine-turkiye/test.csv\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-02-24T02:26:22.653459Z","iopub.execute_input":"2026-02-24T02:26:22.653865Z","iopub.status.idle":"2026-02-24T02:26:36.830143Z","shell.execute_reply.started":"2026-02-24T02:26:22.653836Z","shell.execute_reply":"2026-02-24T02:26:36.829187Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_sub.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-24T02:26:36.831766Z","iopub.execute_input":"2026-02-24T02:26:36.832146Z","iopub.status.idle":"2026-02-24T02:26:36.841062Z","shell.execute_reply.started":"2026-02-24T02:26:36.832110Z","shell.execute_reply":"2026-02-24T02:26:36.840183Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom catboost import CatBoostClassifier, Pool\nfrom sklearn.metrics import roc_auc_score\n\n# Load (already in your notebook)\n# train, test, sample_sub = ...\n\n# 1) Leakage-safe drop\ntrain = train.drop(columns=[\"disposition\"], errors=\"ignore\")\nsupplemental_data = supplemental_data.drop(columns=[\"disposition\"], errors=\"ignore\")  # not used in this baseline\n\n# 2) MNAR missingness indicators\nmnar_cols = [\n    \"troponin_i_ngml\",\n    \"bnp_pgl\",\n    \"d_dimer_mgfl\",\n    \"lactate_mmoll\",\n    \"lipase_ul\",\n    \"procalcitonin_ngl\",\n    \"albumin_gdl\",\n]\n\nfor df in [train, test]:\n    for c in mnar_cols:\n        if c in df.columns:\n            df[f\"{c}_missing\"] = df[c].isna().astype(int)\n\n# 3) Define features / targets\ntargets = [\"adverse_outcome\", \"readmission_30d\"]\ndrop_cols = targets + [\"encounter_id\"]\n\nfeature_cols = [c for c in train.columns if c not in drop_cols]\n# Ensure test has all features\nfeature_cols = [c for c in feature_cols if c in test.columns]\n\n# 4) Categorical handling\n# Treat object/category columns as categorical\ncat_cols = train[feature_cols].select_dtypes(include=[\"object\", \"category\"]).columns.tolist()\n\n# Fill missing categoricals with \"Unknown\"\nfor df in [train, test]:\n    for c in cat_cols:\n        df[c] = df[c].fillna(\"Unknown\")\n\n# 5) Time-based split\ntrain_mask = train[\"arrival_year\"] <= 2022\nvalid_mask = train[\"arrival_year\"] >= 2023\n\ntrain_df = train.loc[train_mask].reset_index(drop=True)\nvalid_df = train.loc[valid_mask].reset_index(drop=True)\n\n# 6) Train + validate\noof_scores = {}\nmodels = {}\n\nfor target in targets:\n    X_train = train_df[feature_cols]\n    y_train = train_df[target]\n    X_valid = valid_df[feature_cols]\n    y_valid = valid_df[target]\n\n    cat_features = [X_train.columns.get_loc(c) for c in cat_cols]\n\n    train_pool = Pool(X_train, y_train, cat_features=cat_features)\n    valid_pool = Pool(X_valid, y_valid, cat_features=cat_features)\n\n    model = CatBoostClassifier(\n        iterations=2000,\n        depth=8,\n        learning_rate=0.05,\n        loss_function=\"Logloss\",\n        eval_metric=\"AUC\",\n        random_seed=42,\n        early_stopping_rounds=200,\n        verbose=200\n    )\n\n    model.fit(train_pool, eval_set=valid_pool, use_best_model=True)\n\n    pred_valid = model.predict_proba(X_valid)[:, 1]\n    auc = roc_auc_score(y_valid, pred_valid)\n    oof_scores[target] = auc\n    models[target] = model\n\n    print(f\"{target} AUC (time split): {auc:.5f}\")\n\nmacro_auc = np.mean(list(oof_scores.values()))\nprint(f\"Macro AUC (time split): {macro_auc:.5f}\")\n\n# 7) Retrain on full train for test predictions\nsubmission = test[[\"encounter_id\"]].copy()\n\nfor target in targets:\n    best_iter = models[target].get_best_iteration()\n    final_model = CatBoostClassifier(\n        iterations=best_iter if best_iter else 1000,\n        depth=8,\n        learning_rate=0.05,\n        loss_function=\"Logloss\",\n        eval_metric=\"AUC\",\n        random_seed=42,\n        verbose=False\n    )\n    full_pool = Pool(train[feature_cols], train[target], cat_features=cat_features)\n    final_model.fit(full_pool)\n\n    submission[target] = final_model.predict_proba(test[feature_cols])[:, 1]\n\nsubmission.to_csv(\"submission.csv\", index=False)\nprint(submission.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-24T02:26:36.842178Z","iopub.execute_input":"2026-02-24T02:26:36.842597Z","iopub.status.idle":"2026-02-24T02:27:02.947810Z","shell.execute_reply.started":"2026-02-24T02:26:36.842525Z","shell.execute_reply":"2026-02-24T02:27:02.946680Z"}},"outputs":[],"execution_count":null}]}