{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":17000,"databundleVersionId":895292,"sourceType":"competition"}],"dockerImageVersionId":31153,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.filterwarnings('ignore')\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.metrics import roc_auc_score\nfrom catboost import CatBoostClassifier\nfrom itertools import combinations\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:22:27.048301Z","iopub.execute_input":"2025-10-26T13:22:27.048457Z","iopub.status.idle":"2025-10-26T13:22:30.133166Z","shell.execute_reply.started":"2025-10-26T13:22:27.048442Z","shell.execute_reply":"2025-10-26T13:22:30.132429Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#data load and shows data size and the fisrt colums\nsample_sub = pd.read_csv('/kaggle/input/cat-in-the-dat-ii/sample_submission.csv')\ntrain = pd.read_csv('/kaggle/input/cat-in-the-dat-ii/train.csv')\ntest = pd.read_csv('/kaggle/input/cat-in-the-dat-ii/test.csv')\n\nprint(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)\ntrain.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:22:30.134533Z","iopub.execute_input":"2025-10-26T13:22:30.134944Z","iopub.status.idle":"2025-10-26T13:22:34.565424Z","shell.execute_reply.started":"2025-10-26T13:22:30.134918Z","shell.execute_reply":"2025-10-26T13:22:34.564799Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# show the unique\nfor col in train.columns:\n    unique_vals = train[col].unique()\n    print(f\"Unique values in '{col}':\")\n    print(unique_vals)\n    print(f\"Count: {len(unique_vals)}\")\n    print(\"-\" * 40)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:22:39.065397Z","iopub.execute_input":"2025-10-26T13:22:39.066060Z","iopub.status.idle":"2025-10-26T13:22:39.454105Z","shell.execute_reply.started":"2025-10-26T13:22:39.066016Z","shell.execute_reply":"2025-10-26T13:22:39.453219Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#data Re-Processing\n# 1-column selection\ntarget = train[\"target\"]\ntrain_id = train[\"id\"]\ntest_id = test[\"id\"]\n\nx = train.drop([\"id\", \"target\"], axis=1)\nx_test = test.drop(\"id\", axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:22:44.089141Z","iopub.execute_input":"2025-10-26T13:22:44.089890Z","iopub.status.idle":"2025-10-26T13:22:44.220824Z","shell.execute_reply.started":"2025-10-26T13:22:44.089855Z","shell.execute_reply":"2025-10-26T13:22:44.220048Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#  Missing count\nx[\"missing_count\"] = x.isnull().sum(axis=1)\nx_test[\"missing_count\"] = x_test.isnull().sum(axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:22:48.336612Z","iopub.execute_input":"2025-10-26T13:22:48.337180Z","iopub.status.idle":"2025-10-26T13:22:49.154693Z","shell.execute_reply.started":"2025-10-26T13:22:48.337132Z","shell.execute_reply":"2025-10-26T13:22:49.154096Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 2- Fill missing value\nx = x.fillna(\"Missing\")\nx_test = x_test.fillna(\"Missing\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:22:50.926235Z","iopub.execute_input":"2025-10-26T13:22:50.926813Z","iopub.status.idle":"2025-10-26T13:22:52.533374Z","shell.execute_reply.started":"2025-10-26T13:22:50.926791Z","shell.execute_reply":"2025-10-26T13:22:52.532595Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Columns in x:\", x.columns.tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:22:53.657917Z","iopub.execute_input":"2025-10-26T13:22:53.658204Z","iopub.status.idle":"2025-10-26T13:22:53.662576Z","shell.execute_reply.started":"2025-10-26T13:22:53.658183Z","shell.execute_reply":"2025-10-26T13:22:53.661842Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# حذف العمود bin_3 من البيانات\nx = x.drop(columns=['bin_3', 'bin_3_inv', 'bin3_bin_0_interaction', 'bin3_bin_1_interaction', 'bin3_bin_2_interaction', 'bin_3_ratio'], errors='ignore')\nx_test = x_test.drop(columns=['bin_3', 'bin_3_inv', 'bin3_bin_0_interaction', 'bin3_bin_1_interaction', 'bin3_bin_2_interaction', 'bin_3_ratio'], errors='ignore')\n\nprint(\"Columns in x after removing bin_3:\", x.columns.tolist())\nprint(\"Columns in x_test after removing bin_3:\", x_test.columns.tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:02:01.978254Z","iopub.execute_input":"2025-10-26T15:02:01.978588Z","iopub.status.idle":"2025-10-26T15:02:02.410469Z","shell.execute_reply.started":"2025-10-26T15:02:01.978567Z","shell.execute_reply":"2025-10-26T15:02:02.409671Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\nfor col in [\"day\", \"month\"]:\n    if col in x.columns:\n        x[col] = pd.to_numeric(x[col], errors=\"coerce\").fillna(0)\n        x_test[col] = pd.to_numeric(x_test[col], errors=\"coerce\").fillna(0)\n\nif \"day\" in x.columns and \"month\" in x.columns:\n    x[\"day_sin\"] = np.sin(2 * np.pi * x[\"day\"] / 7)\n    x[\"day_cos\"] = np.cos(2 * np.pi * x[\"day\"] / 7)\n    x[\"month_sin\"] = np.sin(2 * np.pi * x[\"month\"] / 12)\n    x[\"month_cos\"] = np.cos(2 * np.pi * x[\"month\"] / 12)\n\n    x_test[\"day_sin\"] = np.sin(2 * np.pi * x_test[\"day\"] / 7)\n    x_test[\"day_cos\"] = np.cos(2 * np.pi * x_test[\"day\"] / 7)\n    x_test[\"month_sin\"] = np.sin(2 * np.pi * x_test[\"month\"] / 12)\n    x_test[\"month_cos\"] = np.cos(2 * np.pi * x_test[\"month\"] / 12)\n\n    x = x.drop([\"day\", \"month\"], axis=1)\n    x_test = x_test.drop([\"day\", \"month\"], axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:02:08.587504Z","iopub.execute_input":"2025-10-26T15:02:08.588034Z","iopub.status.idle":"2025-10-26T15:02:08.594375Z","shell.execute_reply.started":"2025-10-26T15:02:08.588010Z","shell.execute_reply":"2025-10-26T15:02:08.593524Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#binary","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from itertools import combinations\nimport pandas as pd\n\nbin_cols = ['bin_0', 'bin_1', 'bin_2']\n\nfor col in bin_cols:\n    x[col] = pd.to_numeric(x[col], errors='coerce').fillna(0).astype(int)\n    x_test[col] = pd.to_numeric(x_test[col], errors='coerce').fillna(0).astype(int)\n\nx['bin_sum'] = x[bin_cols].sum(axis=1)\nx['bin_mean'] = x[bin_cols].mean(axis=1)\n\nx_test['bin_sum'] = x_test[bin_cols].sum(axis=1)\nx_test['bin_mean'] = x_test[bin_cols].mean(axis=1)\n\nfor col1, col2 in combinations(bin_cols, 2):\n    new_col = f\"{col1}_{col2}_interaction\"\n    x[new_col] = x[col1] * x[col2]\n    x_test[new_col] = x_test[col1] * x_test[col2]\n\nx['bin0_bin1'] = x['bin_0'].astype(str) + \"_\" + x['bin_1'].astype(str)\nx_test['bin0_bin1'] = x_test['bin_0'].astype(str) + \"_\" + x_test['bin_1'].astype(str)\n\nx['bin0_bin1_num'] = x['bin_0']*2 + x['bin_1']*1\nx_test['bin0_bin1_num'] = x_test['bin_0']*2 + x_test['bin_1']*1\n\nprint(\"Columns in x after binary features engineering:\", x.columns.tolist())\nprint(\"Columns in x_test after binary features engineering:\", x_test.columns.tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:02:11.898825Z","iopub.execute_input":"2025-10-26T15:02:11.899076Z","iopub.status.idle":"2025-10-26T15:02:12.769868Z","shell.execute_reply.started":"2025-10-26T15:02:11.899056Z","shell.execute_reply":"2025-10-26T15:02:12.769212Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# طباعة القيم الفريدة ونسبة كل قيمة\nprint(x['bin_4'].value_counts(normalize=True, dropna=False))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:02:27.465608Z","iopub.execute_input":"2025-10-26T15:02:27.465873Z","iopub.status.idle":"2025-10-26T15:02:27.478465Z","shell.execute_reply.started":"2025-10-26T15:02:27.465854Z","shell.execute_reply":"2025-10-26T15:02:27.477725Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"nan_ratio = x['bin_4'].isna().mean()\nprint(f\"النسبة المئوية للقيم المفقودة في bin_4: {nan_ratio:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:02:25.631042Z","iopub.execute_input":"2025-10-26T15:02:25.631724Z","iopub.status.idle":"2025-10-26T15:02:25.638230Z","shell.execute_reply.started":"2025-10-26T15:02:25.631699Z","shell.execute_reply":"2025-10-26T15:02:25.637612Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# تحويل Y/N إلى 1/0\nx['bin_4'] = x['bin_4'].map({'Y': 1, 'N': 0})\nx_test['bin_4'] = x_test['bin_4'].map({'Y': 1, 'N': 0})\n\n# عمود عكسي\nx['bin_4_inv'] = 1 - x['bin_4']\nx_test['bin_4_inv'] = 1 - x_test['bin_4']\n\n# التفاعلات مع الأعمدة الثنائية الأخرى (bin_0, bin_1, bin_2)\nfor col in ['bin_0', 'bin_1', 'bin_2']:\n    new_col = f'bin4_{col}_interaction'\n    x[new_col] = x['bin_4'] * x[col]\n    x_test[new_col] = x_test['bin_4'] * x_test[col]\n\n# نسبة bin_4 مقارنة بمجموع الأعمدة الثنائية (bin_0, bin_1, bin_2, bin_4)\nbin_cols = ['bin_0', 'bin_1', 'bin_2', 'bin_4']\nx['bin_4_ratio'] = x['bin_4'] / (x[bin_cols].sum(axis=1) + 1e-5)\nx_test['bin_4_ratio'] = x_test['bin_4'] / (x_test[bin_cols].sum(axis=1) + 1e-5)\n\n# التحقق من الأعمدة الجديدة\nprint(\"Columns in x after bin_4 feature engineering:\", x.columns.tolist())\nprint(\"Columns in x_test after bin_4 feature engineering:\", x_test.columns.tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:02:34.350667Z","iopub.execute_input":"2025-10-26T15:02:34.351169Z","iopub.status.idle":"2025-10-26T15:02:34.627883Z","shell.execute_reply.started":"2025-10-26T15:02:34.351127Z","shell.execute_reply":"2025-10-26T15:02:34.627064Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#nominal","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Frequency encoding للـ nom_0\nfreq_nom0 = x['nom_0'].value_counts() / len(x)\n\nx['nom_0_freq'] = x['nom_0'].map(freq_nom0)\nx_test['nom_0_freq'] = x_test['nom_0'].map(freq_nom0)\n\n# التأكد من القيم الجديدة\nprint(x[['nom_0', 'nom_0_freq']].head())\nprint(x_test[['nom_0', 'nom_0_freq']].head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:11:22.256911Z","iopub.execute_input":"2025-10-26T15:11:22.257426Z","iopub.status.idle":"2025-10-26T15:11:22.364584Z","shell.execute_reply.started":"2025-10-26T15:11:22.257403Z","shell.execute_reply":"2025-10-26T15:11:22.364027Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# حساب التكرارات\nfreq_nom1 = x['nom_1'].value_counts(normalize=True)\n\n# استبدال القيم بالنسبة المئوية\nx['nom_1_freq'] = x['nom_1'].map(freq_nom1)\nx_test['nom_1_freq'] = x_test['nom_1'].map(freq_nom1)  # استخدام نفس تكرارات train\nprint(x[['nom_1', 'nom_1_freq']].head())\nprint(x_test[['nom_1', 'nom_1_freq']].head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T15:20:04.628736Z","iopub.execute_input":"2025-10-26T15:20:04.629012Z","iopub.status.idle":"2025-10-26T15:20:04.733769Z","shell.execute_reply.started":"2025-10-26T15:20:04.628993Z","shell.execute_reply":"2025-10-26T15:20:04.733200Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# selection ordinal columns(featurs)\ncat_features = x.columns.tolist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:23:19.223393Z","iopub.execute_input":"2025-10-26T13:23:19.223669Z","iopub.status.idle":"2025-10-26T13:23:19.227277Z","shell.execute_reply.started":"2025-10-26T13:23:19.223648Z","shell.execute_reply":"2025-10-26T13:23:19.226541Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Data partitioning\nx_train, x_valid, y_train, y_valid = train_test_split(\n    x, target, test_size=0.2, random_state=42, stratify=target\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:23:21.660899Z","iopub.execute_input":"2025-10-26T13:23:21.661489Z","iopub.status.idle":"2025-10-26T13:23:22.316724Z","shell.execute_reply.started":"2025-10-26T13:23:21.661462Z","shell.execute_reply":"2025-10-26T13:23:22.315939Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# build model (catBoostClassifer)\nx = x.astype(str)\nx_test = x_test.astype(str)\n\nx_train = x_train.astype(str)\nx_valid = x_valid.astype(str)\n\nmodel = CatBoostClassifier(\n    task_type=\"GPU\",\n    devices='0',\n    iterations=1000,\n    learning_rate=0.05,\n    depth=8,\n    cat_features=cat_features,\n    loss_function='Logloss',\n    eval_metric='AUC',\n    early_stopping_rounds=100,\n    verbose=200,\n    random_seed=42\n)\n\nmodel.fit(x_train, y_train, eval_set=(x_valid, y_valid), early_stopping_rounds=100)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:23:25.073209Z","iopub.execute_input":"2025-10-26T13:23:25.073488Z","iopub.status.idle":"2025-10-26T13:25:28.314885Z","shell.execute_reply.started":"2025-10-26T13:23:25.073464Z","shell.execute_reply":"2025-10-26T13:25:28.314084Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"valid_pred = model.predict_proba(x_valid)[:, 1]\nauc = roc_auc_score(y_valid, valid_pred)\nprint(f\"Validation AUC: {auc:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:25:42.767211Z","iopub.execute_input":"2025-10-26T13:25:42.767448Z","iopub.status.idle":"2025-10-26T13:25:45.896472Z","shell.execute_reply.started":"2025-10-26T13:25:42.767431Z","shell.execute_reply":"2025-10-26T13:25:45.895674Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_pred = model.predict_proba(x_test)[:, 1]\n\nsubmission = pd.DataFrame({\n    \"id\": test_id,\n    \"target\": test_pred\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)\nprint(\"✅ submission.csv file saved!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-26T13:25:48.841744Z","iopub.execute_input":"2025-10-26T13:25:48.841994Z","iopub.status.idle":"2025-10-26T13:25:57.888485Z","shell.execute_reply.started":"2025-10-26T13:25:48.841976Z","shell.execute_reply":"2025-10-26T13:25:57.887877Z"}},"outputs":[],"execution_count":null}]}