{"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\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    print(dirname)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:19:39.107481Z","iopub.execute_input":"2026-04-18T20:19:39.108788Z","iopub.status.idle":"2026-04-18T20:19:39.120357Z","shell.execute_reply.started":"2026-04-18T20:19:39.108749Z","shell.execute_reply":"2026-04-18T20:19:39.119075Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\npath = '/kaggle/input/competitions/home-credit-credit-risk-model-stability/parquet_files/train'\n\nos.listdir(path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:19:39.121975Z","iopub.execute_input":"2026-04-18T20:19:39.122456Z","iopub.status.idle":"2026-04-18T20:19:39.135964Z","shell.execute_reply.started":"2026-04-18T20:19:39.122411Z","shell.execute_reply":"2026-04-18T20:19:39.134919Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\npath = '/kaggle/input/competitions/home-credit-credit-risk-model-stability/parquet_files/train/'\n\nbase = pd.read_parquet(path + 'train_base.parquet')\nstatic1 = pd.read_parquet(path + 'train_static_0_0.parquet')\nstatic2 = pd.read_parquet(path + 'train_static_0_1.parquet')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:19:39.137090Z","iopub.execute_input":"2026-04-18T20:19:39.137379Z","iopub.status.idle":"2026-04-18T20:19:43.980411Z","shell.execute_reply.started":"2026-04-18T20:19:39.137353Z","shell.execute_reply":"2026-04-18T20:19:43.979647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = base.merge(static1, on='case_id', how='left')\ndf = df.merge(static2, on='case_id', how='left')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:19:43.982226Z","iopub.execute_input":"2026-04-18T20:19:43.983206Z","iopub.status.idle":"2026-04-18T20:20:02.722879Z","shell.execute_reply.started":"2026-04-18T20:19:43.983171Z","shell.execute_reply":"2026-04-18T20:20:02.722018Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"appl = pd.read_parquet(path + 'train_applprev_1_0.parquet')\n\nnum_cols = appl.select_dtypes(include=['number']).columns\n\nnum_cols = num_cols.drop('case_id')\n\nagg_appl = appl.groupby('case_id')[num_cols].mean().reset_index()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:20:02.724263Z","iopub.execute_input":"2026-04-18T20:20:02.724672Z","iopub.status.idle":"2026-04-18T20:20:07.748505Z","shell.execute_reply.started":"2026-04-18T20:20:02.724597Z","shell.execute_reply":"2026-04-18T20:20:07.747387Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ==============================\n# 1) Libraries\n# ==============================\nimport pandas as pd\nimport numpy as np\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder\nfrom sklearn.utils import class_weight\nfrom sklearn.feature_selection import VarianceThreshold\n\nimport tensorflow as tf\nfrom tensorflow.keras import layers\n\n\nimport tensorflow as tf\n\n\n# ==============================\n# 2) Sampling\n# ==============================\ndf_sample = df.sample(200000, random_state=42)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T18:56:17.367068Z","iopub.status.idle":"2026-04-19T18:56:17.367525Z","shell.execute_reply.started":"2026-04-19T18:56:17.367288Z","shell.execute_reply":"2026-04-19T18:56:17.367316Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_sample.head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:20:21.293164Z","iopub.execute_input":"2026-04-18T20:20:21.294437Z","iopub.status.idle":"2026-04-18T20:20:21.328957Z","shell.execute_reply.started":"2026-04-18T20:20:21.294400Z","shell.execute_reply":"2026-04-18T20:20:21.327856Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_sample.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:20:21.330259Z","iopub.execute_input":"2026-04-18T20:20:21.331166Z","iopub.status.idle":"2026-04-18T20:20:21.342768Z","shell.execute_reply.started":"2026-04-18T20:20:21.331120Z","shell.execute_reply":"2026-04-18T20:20:21.341718Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ==============================\n# 1) Libraries\n# ==============================\nimport pandas as pd\nimport numpy as np\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder, StandardScaler\nfrom sklearn.utils import class_weight\nfrom sklearn.feature_selection import VarianceThreshold\n\nimport tensorflow as tf\nfrom tensorflow.keras import layers\n\n# ==============================\n# 2) Load & Merge Data\n# ==============================\npath = '/kaggle/input/competitions/home-credit-credit-risk-model-stability/parquet_files/train/'\n\nbase = pd.read_parquet(path + 'train_base.parquet')\nstatic1 = pd.read_parquet(path + 'train_static_0_0.parquet')\nstatic2 = pd.read_parquet(path + 'train_static_0_1.parquet')\n\ndf = base.merge(static1, on='case_id', how='left')\ndf = df.merge(static2, on='case_id', how='left')\n\n# ==============================\n# 3) Sampling\n# ==============================\ndf = df.sample(200000, random_state=42)\n\n# ==============================\n# 4) Split X, y\n# ==============================\nX = df.drop(['target', 'case_id'], axis=1)\ny = df['target']\n\n# ==============================\n# 5) Label Encoding\n# ==============================\nfor col in X.select_dtypes(include='object').columns:\n    le = LabelEncoder()\n    X[col] = le.fit_transform(X[col].astype(str))\n\n# ==============================\n# 6) Clean Data\n# ==============================\nX = X.apply(pd.to_numeric, errors='coerce')\nX = X.fillna(0)\n\n# ==============================\n# 7) Remove low variance\n# ==============================\nselector = VarianceThreshold(threshold=0.01)\nX = selector.fit_transform(X)\n\n# ==============================\n# 8) Scaling\n# ==============================\nscaler = StandardScaler()\nX = scaler.fit_transform(X)\n\n# ==============================\n# 9) Train / Validation Split\n# ==============================\nX_train, X_val, y_train, y_val = train_test_split(\n    X, y, test_size=0.2, random_state=42, stratify=y\n)\n\n# ==============================\n# 10) Convert to float32\n# ==============================\nX_train = np.array(X_train, dtype=np.float32)\nX_val   = np.array(X_val, dtype=np.float32)\ny_train = np.array(y_train, dtype=np.float32)\ny_val   = np.array(y_val, dtype=np.float32)\n\n# ==============================\n# 11) Class Weights\n# ==============================\nweights = class_weight.compute_class_weight(\n    'balanced',\n    classes=np.unique(y_train),\n    y=y_train\n)\nclass_weights = dict(enumerate(weights))\n\n# ==============================\n# 12) Model Builder\n# ==============================\ndef build_model(input_dim):\n    model = tf.keras.Sequential([\n        layers.Dense(256, activation='relu', input_shape=(input_dim,)),\n        layers.BatchNormalization(),\n        layers.Dropout(0.4),\n\n        layers.Dense(128, activation='relu'),\n        layers.BatchNormalization(),\n        layers.Dropout(0.3),\n\n        layers.Dense(64, activation='relu'),\n        layers.Dense(1, activation='sigmoid')\n    ])\n    return model\n\n# ==============================\n# 13) Callbacks\n# ==============================\ncallbacks = [\n    tf.keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)\n]\n\n# ==============================\n# 14) Optimizers\n# ==============================\noptimizers = {\n    'Adam': tf.keras.optimizers.Adam(),\n    'SGD': tf.keras.optimizers.SGD(),\n    'RMSprop': tf.keras.optimizers.RMSprop()\n}\n\nresults = []\n\n# ==============================\n# 15) Training Loop\n# ==============================\nfor name, opt in optimizers.items():\n    print(f\"Training with {name}...\")\n\n    model = build_model(X_train.shape[1])\n\n    model.compile(\n        optimizer=opt,\n        loss='binary_crossentropy',\n        metrics=['AUC', 'accuracy']\n    )\n\n    model.fit(\n        X_train, y_train,\n        validation_data=(X_val, y_val),\n        epochs=10,\n        batch_size=256,\n        class_weight=class_weights,\n        callbacks=callbacks,\n        verbose=1\n    )\n\n    val_loss, val_auc, val_acc = model.evaluate(X_val, y_val, verbose=0)\n\n    results.append({\n        'Optimizer': name,\n        'Validation AUC': val_auc,\n        'Validation Accuracy': val_acc\n    })\n\n# ==============================\n# 16) Results Table\n# ==============================\nresults_df = pd.DataFrame(results)\n\nresults_df['Gini'] = 2 * results_df['Validation AUC'] - 1\n\nresults_df = results_df.sort_values(by='Validation AUC', ascending=False)\n\nprint(results_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-18T20:25:22.114824Z","iopub.execute_input":"2026-04-18T20:25:22.115225Z","iopub.status.idle":"2026-04-18T20:42:38.197291Z","shell.execute_reply.started":"2026-04-18T20:25:22.115195Z","shell.execute_reply":"2026-04-18T20:42:38.196028Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# البيانات\ndata = {\n    \"Optimizer\": [\"Adam\", \"SGD\", \"RMSprop\"],\n    \"AUC\": [0.747396, 0.730991, 0.722513],\n    \"Accuracy\": [0.80710, 0.72085, 0.82460],\n    \"Gini\": [0.494792, 0.461983, 0.445026]\n}\n\ndf = pd.DataFrame(data)\n\n# إعداد الشكل\nsns.set(style=\"whitegrid\")\n\n# ---------------------------\n# 1. Bar Plot للمقارنة\n# ---------------------------\ndf_melted = df.melt(id_vars=\"Optimizer\", var_name=\"Metric\", value_name=\"Value\")\n\nplt.figure()\nsns.barplot(data=df_melted, x=\"Optimizer\", y=\"Value\", hue=\"Metric\")\nplt.title(\"Comparison of Optimizers\")\nplt.ylabel(\"Score\")\nplt.show()\n\n# ---------------------------\n# 2. Line Plot\n# ---------------------------\nplt.figure()\nfor metric in [\"AUC\", \"Accuracy\", \"Gini\"]:\n    plt.plot(df[\"Optimizer\"], df[metric], marker='o', label=metric)\n\nplt.title(\"Optimizer Performance Trends\")\nplt.xlabel(\"Optimizer\")\nplt.ylabel(\"Score\")\nplt.legend()\nplt.show()\n\n# ---------------------------\n# 3. Heatmap\n# ---------------------------\nplt.figure()\nsns.heatmap(df.set_index(\"Optimizer\"), annot=True, fmt=\".3f\")\nplt.title(\"Optimizer Performance Heatmap\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T20:44:40.399799Z","iopub.execute_input":"2026-04-19T20:44:40.400131Z","iopub.status.idle":"2026-04-19T20:44:41.016319Z","shell.execute_reply.started":"2026-04-19T20:44:40.400102Z","shell.execute_reply":"2026-04-19T20:44:41.015445Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}