{"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":"gpu","dataSources":[{"sourceType":"competition","sourceId":131653,"databundleVersionId":15802687}],"dockerImageVersionId":31287,"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":"try:\n    import catboost\nexcept:\n    !pip install catboost -q\n\nimport numpy as np\nimport pandas as pd\nimport gc, os, warnings\nwarnings.filterwarnings(\"ignore\")\n\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.preprocessing import LabelEncoder\n\nimport lightgbm as lgb\nimport xgboost as xgb\nfrom catboost import CatBoostClassifier","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-24T12:24:36.460144Z","iopub.execute_input":"2026-02-24T12:24:36.460476Z","iopub.status.idle":"2026-02-24T12:24:42.978416Z","shell.execute_reply.started":"2026-02-24T12:24:36.460449Z","shell.execute_reply":"2026-02-24T12:24:42.977649Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"PATH = \"/kaggle/input/ai-emergency-medicine-turkiye/\"\n\ntrain = pd.read_csv(PATH+\"train.csv\")\ntest  = pd.read_csv(PATH+\"test.csv\")\nsupp  = pd.read_csv(PATH+\"supplemental_data.csv\")\n\nhosp = pd.read_csv(PATH+\"hospital_reference.csv\")\nicd  = pd.read_csv(PATH+\"icd10_reference.csv\")\n\nprint(train.shape, test.shape, supp.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-24T12:24:42.980122Z","iopub.execute_input":"2026-02-24T12:24:42.980636Z","iopub.status.idle":"2026-02-24T12:25:00.693710Z","shell.execute_reply.started":"2026-02-24T12:24:42.980607Z","shell.execute_reply":"2026-02-24T12:25:00.692542Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.concat([train, supp], ignore_index=True)\ndel supp\ngc.collect()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-24T12:25:00.695090Z","iopub.execute_input":"2026-02-24T12:25:00.696144Z","iopub.status.idle":"2026-02-24T12:25:00.701129Z","shell.execute_reply.started":"2026-02-24T12:25:00.696115Z","shell.execute_reply":"2026-02-24T12:25:00.700329Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train.merge(hosp, on=\"city\", how=\"left\")\ntest  = test.merge(hosp, on=\"city\", how=\"left\")\n\ntrain = train.merge(icd, left_on=\"primary_icd10_code\", right_on=\"icd10_code\", how=\"left\")\ntest  = test.merge(icd, left_on=\"primary_icd10_code\", right_on=\"icd10_code\", how=\"left\")\nmnar_cols = [\n\"troponin_i_ngml\",\"bnp_pgl\",\"d_dimer_mgfl\",\n\"lactate_mmoll\",\"lipase_ul\",\"procalcitonin_ngl\",\"albumin_gdl\"\n]\n\nfor col in mnar_cols:\n    train[col+\"_missing\"] = train[col].isna().astype(int)\n    test[col+\"_missing\"]  = test[col].isna().astype(int)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_features(df):\n\n    df[\"shock_index\"] = df[\"heart_rate_bpm\"] / (df[\"sbp_mmhg\"] + 1)\n    df[\"pulse_pressure_ratio\"] = df[\"pulse_pressure_mmhg\"]/(df[\"sbp_mmhg\"]+1)\n\n    df[\"age_x_charlson\"] = df[\"age\"] * df[\"charlson_comorbidity_index\"]\n\n    df[\"night_weekend\"] = df[\"is_night_shift\"] * df[\"is_weekend\"]\n    df[\"sofa_triage\"]   = df[\"sofa_score_approx\"] * df[\"triage_level\"]\n\n    df[\"highrisk_vitals\"] = (\n        (df[\"sbp_mmhg\"]<90).astype(int) +\n        (df[\"spo2_pct\"]<92).astype(int) +\n        (df[\"gcs_total\"]<9).astype(int) +\n        (df[\"respiratory_rate_rpm\"]>24).astype(int)\n    )\n\n    labs = [\n        \"troponin_i_ngml\",\"bnp_pgl\",\"d_dimer_mgfl\",\n        \"lactate_mmoll\",\"lipase_ul\",\"procalcitonin_ngl\",\"albumin_gdl\"\n    ]\n    df[\"lab_count\"] = df[labs].notnull().sum(axis=1)\n\n    df[\"phys_severity\"] = (\n        df[\"news2_score\"] +\n        df[\"sofa_score_approx\"] +\n        df[\"mews_score\"]\n    )\n\n    df[\"utilization_score\"] = (\n        df[\"prior_ed_visits_12mo\"] +\n        df[\"prior_hospitalization_12mo\"]\n    )\n\n    df[\"risk_score\"] = (\n        df[\"triage_level\"]*2 +\n        df[\"sofa_score_approx\"] +\n        df[\"news2_score\"] +\n        df[\"mews_score\"]\n    )\n\n    return df\n\ntrain = create_features(train)\ntest  = create_features(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def clinical_boost(df):\n\n    df[\"shock_flag\"] = (df[\"sbp_mmhg\"]<90).astype(int)\n    df[\"hypoxia_flag\"] = (df[\"spo2_pct\"]<92).astype(int)\n    df[\"coma_flag\"] = (df[\"gcs_total\"]<9).astype(int)\n    df[\"high_lactate\"] = (df[\"lactate_mmoll\"]>4).astype(int)\n    df[\"critical_triage\"] = (df[\"triage_level\"]<=2).astype(int)\n\n    df[\"critical_score\"] = (\n        df[\"shock_flag\"] +\n        df[\"hypoxia_flag\"] +\n        df[\"coma_flag\"] +\n        df[\"high_lactate\"] +\n        df[\"critical_triage\"]\n    )\n\n    df[\"age_risk\"] = np.clip((df[\"age\"]-40)/10,0,10)\n\n    # ✅ FIXED COLUMN NAME HERE\n    df[\"organ_failure_risk\"] = (\n        df[\"sofa_score_approx\"] +\n        df[\"creatinine_mgdl\"] +\n        df[\"total_bilirubin_mgdl\"]\n    )\n\n    return df\n\ntrain = clinical_boost(train)\ntest  = clinical_boost(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.drop(columns=[\"disposition\"], inplace=True)\ncat_cols = train.select_dtypes(\"object\").columns.tolist()\n\nfor col in cat_cols:\n    le = LabelEncoder()\n    full = pd.concat([train[col], test[col]], axis=0).astype(str)\n    le.fit(full)\n    train[col] = le.transform(train[col].astype(str))\n    test[col]  = le.transform(test[col].astype(str))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"targets = [\"adverse_outcome\",\"readmission_30d\"]\n\ntrain = train.sort_values(\"arrival_year\").reset_index(drop=True)\n\nX = train.drop(columns=targets+[\"encounter_id\"])\ny1 = train[targets[0]]\ny2 = train[targets[1]]\n\nX_test = test.drop(columns=[\"encounter_id\"])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"years = train[\"arrival_year\"].unique()\n\nsplits = []\nfor i in range(len(years)-1):\n    tr = train[train[\"arrival_year\"]<=years[i]].index\n    va = train[train[\"arrival_year\"]==years[i+1]].index\n    splits.append((tr,va))\n\nprint(\"Number of folds:\",len(splits))\ndef train_model(X,y):\n\n    oof = np.zeros(len(X))\n    preds = np.zeros(len(X_test))\n\n    for fold,(tr,va) in enumerate(splits):\n        print(\"Fold\",fold)\n\n        Xtr,Xva = X.iloc[tr],X.iloc[va]\n        ytr,yva = y.iloc[tr],y.iloc[va]\n        lgbm = lgb.LGBMClassifier(\n            n_estimators=4000,\n            learning_rate=0.008,\n            num_leaves=48,\n            min_child_samples=80,\n            subsample=.75,\n            colsample_bytree=.75,\n            reg_alpha=2,\n            reg_lambda=5,\n            device=\"gpu\"\n        )\n\n        xgbm = xgb.XGBClassifier(\n            n_estimators=1200,\n            learning_rate=0.015,\n            max_depth=8,\n            subsample=.85,\n            colsample_bytree=.85,\n            tree_method=\"hist\",\n            eval_metric=\"auc\",\n            n_jobs=-1\n        )\n        cat = CatBoostClassifier(\n            iterations=4000,\n            learning_rate=.008,\n            depth=6,\n            loss_function=\"Logloss\",\n            eval_metric=\"AUC\",\n            verbose=0,\n            task_type=\"GPU\"\n        )\n        models=[lgbm,xgbm,cat]\n        val_preds=[]\n        test_preds=[]\n\n        for m in models:\n            m.fit(Xtr,ytr)\n            val_preds.append(m.predict_proba(Xva)[:,1])\n            test_preds.append(m.predict_proba(X_test)[:,1])\n\n        val_preds=np.mean(val_preds,0)\n        test_preds=np.mean(test_preds,0)\n\n        oof[va]=val_preds\n        preds+=test_preds/len(splits)\n\n        print(\"AUC:\",roc_auc_score(yva,val_preds))\n\n    print(\"OOF:\",roc_auc_score(y,oof))\n    return preds","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred1 = train_model(X,y1)\npred2 = train_model(X,y2)\nsub = pd.read_csv(PATH+\"sample_submission.csv\")\n\nsub[\"adverse_outcome\"] = pred1\nsub[\"readmission_30d\"] = pred2\n\nsub.to_csv(\"submission.csv\", index=False)\n\nprint(\"Submission saved\")","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}