{"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":50160,"databundleVersionId":7921029}],"dockerImageVersionId":31328,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\n\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        if 'train' in filename:\n            print(os.path.join(dirname, filename))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-20T19:41:10.739011Z","iopub.execute_input":"2026-04-20T19:41:10.739371Z","iopub.status.idle":"2026-04-20T19:41:12.839231Z","shell.execute_reply.started":"2026-04-20T19:41:10.739339Z","shell.execute_reply":"2026-04-20T19:41:12.838101Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import polars as pl\nimport os\n\n\nbase_path = \"/kaggle/input/competitions/home-credit-credit-risk-model-stability/csv_files/train\"\n\n\ntrain_base = pl.read_csv(os.path.join(base_path, \"train_base.csv\"))\ntrain_static = pl.read_csv(os.path.join(base_path, \"train_static_0_0.csv\"))\n\n\ndf = train_base.join(train_static, on=\"case_id\", how=\"left\")\n\nprint(\"\\n--- Data Exploration (Task 3.1) ---\")\nprint(f\"Dataset Shape: {df.shape}\")\n\n\ntarget_counts = df['target'].value_counts()\nprint(\"\\nTarget Distribution:\")\nprint(target_counts)\n\n\ndefault_rate = (df['target'].sum() / len(df)) * 100\nprint(f\"\\nDefault Rate: {default_rate:.2f}%\")\n\n\nnull_counts = df.null_count()\nprint(\"\\nMissing values in the first few columns:\")\nprint(null_counts[:, :5])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-20T19:41:15.856885Z","iopub.execute_input":"2026-04-20T19:41:15.857382Z","iopub.status.idle":"2026-04-20T19:41:28.313726Z","shell.execute_reply.started":"2026-04-20T19:41:15.857329Z","shell.execute_reply":"2026-04-20T19:41:28.312133Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import polars as pl\nimport pandas as pd\nimport numpy as np\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import train_test_split\n\n# --- الخطوة 1: Feature Engineering ---\n# صنعنا ميزة \"نسبة القرض للدخل\" بناءً على طلب الأسايمنت\ndf_full = train_base.join(train_static, on=\"case_id\", how=\"left\")\ndf_full = df_full.with_columns([\n    (pl.col(\"credamount_770A\") / (pl.col(\"maininc_215A\") + 1)).alias(\"loan_to_income_ratio\")\n])\n\n# --- الخطوة 2: Feature Selection (Numerical Only) ---\n# اختيار الأعمدة الرقمية واستبعاد الـ IDs لمنع الـ Overfitting\nnum_features = [c for c in df_full.columns if df_full[c].dtype in [pl.Float64, pl.Int64] and c not in ['case_id', 'target', 'WEEK_NUM']]\npd_df = df_full.select(['target'] + num_features).to_pandas()\n\n# --- الخطوة 3: Data Cleaning (Imputation) ---\n# معالجة القيم المفقودة باستخدام الـ Median (أكثر استقراراً مع الداتا المالية)\npd_df = pd_df.fillna(pd_df.median())\n\nX = pd_df.drop(columns=['target'])\ny = pd_df['target']\n\n# --- الخطوة 4: Scaling ---\n# توحيد مقاسات البيانات (ضروري جداً لعمل الـ Neural Network)\nscaler = StandardScaler()\nX_scaled = scaler.fit_transform(X)\n\n# --- الخطوة 5: Splitting ---\n# تقسيم الداتا مع الحفاظ على نسبة الـ Target (Stratify) بسبب الـ Imbalance\nX_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42, stratify=y)\n\nprint(\"✅ Preprocessing & Feature Engineering Completed!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-20T19:41:35.948126Z","iopub.execute_input":"2026-04-20T19:41:35.948551Z","iopub.status.idle":"2026-04-20T19:41:44.022328Z","shell.execute_reply.started":"2026-04-20T19:41:35.948486Z","shell.execute_reply":"2026-04-20T19:41:44.020701Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout\n\n# Task 3.2: Architecture\nmodel = Sequential([\n    Dense(64, activation='relu', input_shape=(X_train.shape[1],)),\n    Dropout(0.2), # Regularization (Task 3.4)\n    Dense(32, activation='relu'),\n    Dropout(0.2),\n    Dense(1, activation='sigmoid') # Sigmoid for Probability Output\n])\n\n# Task 3.3: Optimization\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['AUC'])\n\nprint(\"Training with Adam Optimizer...\")\nhistory = model.fit(X_train, y_train, validation_split=0.2, epochs=5, batch_size=4096, verbose=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-20T19:41:51.593141Z","iopub.execute_input":"2026-04-20T19:41:51.593392Z","iopub.status.idle":"2026-04-20T19:42:41.592112Z","shell.execute_reply.started":"2026-04-20T19:41:51.593373Z","shell.execute_reply":"2026-04-20T19:42:41.590385Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# تجربة الـ SGD للمقارنة كما طلب الأسايمنت\nmodel_sgd = Sequential([\n    Dense(64, activation='relu', input_shape=(X_train.shape[1],)),\n    Dropout(0.2),\n    Dense(32, activation='relu'),\n    Dropout(0.2),\n    Dense(1, activation='sigmoid')\n])\nmodel_sgd.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['AUC'])\nprint(\"--- Training with SGD Optimizer ---\")\nhistory_sgd = model_sgd.fit(X_train, y_train, validation_split=0.2, epochs=5, batch_size=4096, verbose=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-20T19:42:41.594463Z","iopub.execute_input":"2026-04-20T19:42:41.595055Z","iopub.status.idle":"2026-04-20T19:42:59.567655Z","shell.execute_reply.started":"2026-04-20T19:42:41.595032Z","shell.execute_reply":"2026-04-20T19:42:59.564354Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, roc_auc_score\n\n# 1. رسم توزيع البيانات (Data Imbalance)\nprint(\"\\n--- Plotting Data Imbalance ---\")\nplt.figure(figsize=(6, 4))\nsns.countplot(x='target', hue='target', data=pd_df, palette='viridis', legend=False)\nplt.title('Target Distribution (Data Imbalance)')\nplt.xticks([0, 1], ['Repaid (0)', 'Default (1)'])\nplt.ylabel('Count')\nplt.show()\n\n# 2. رسم تاريخ التدريب (Training History)\n# هنا غيرنا المفاتيح لـ 'AUC' و 'val_AUC' عشان نحل الـ KeyError\nprint(\"\\n--- Plotting Training History (Adam) ---\")\nplt.figure(figsize=(12, 4))\n\nplt.subplot(1, 2, 1)\n# ركز هنا: استخدمنا AUC حروف كبيرة\nplt.plot(history.history['AUC'], label='Train AUC')\nplt.plot(history.history['val_AUC'], label='Val AUC')\nplt.title('Adam Optimizer - AUC History')\nplt.xlabel('Epochs')\nplt.ylabel('AUC Score')\nplt.legend()\n\nplt.subplot(1, 2, 2)\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Val Loss')\nplt.title('Adam Optimizer - Loss History')\nplt.xlabel('Epochs')\nplt.ylabel('Binary Crossentropy')\nplt.legend()\nplt.tight_layout()\nplt.show()\n\n# 3. حساب النتائج ورسم الـ Confusion Matrix\nprint(\"\\n--- Final Model Evaluation ---\")\ny_pred_probs = model.predict(X_test)\nfinal_auc = roc_auc_score(y_test, y_pred_probs)\ngini_score = 2 * final_auc - 1\n\ny_pred_binary = (y_pred_probs > 0.5).astype(int)\n\nprint(f\"Final Test AUC: {final_auc:.4f}\")\nprint(f\"Final Validation Gini Score: {gini_score:.4f}\")\n\ncm = confusion_matrix(y_test, y_pred_binary)\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Repaid (0)', 'Default (1)'])\nfig, ax = plt.subplots(figsize=(6, 5))\ndisp.plot(cmap='Blues', values_format='d', ax=ax)\nplt.title('Confusion Matrix - Final Model (Adam)')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-20T19:42:59.568889Z","iopub.execute_input":"2026-04-20T19:42:59.569236Z","iopub.status.idle":"2026-04-20T19:43:23.912894Z","shell.execute_reply.started":"2026-04-20T19:42:59.569208Z","shell.execute_reply":"2026-04-20T19:43:23.911804Z"}},"outputs":[],"execution_count":null}]}