{"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":"none","dataSources":[{"sourceId":17000,"databundleVersionId":895292,"sourceType":"competition"}],"dockerImageVersionId":31153,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Embedding, Flatten, Concatenate, Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.metrics import AUC\nfrom tensorflow.keras.callbacks import EarlyStopping","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:46:07.699341Z","iopub.execute_input":"2025-10-27T16:46:07.699875Z","iopub.status.idle":"2025-10-27T16:46:13.826152Z","shell.execute_reply.started":"2025-10-27T16:46:07.699814Z","shell.execute_reply":"2025-10-27T16:46:13.825078Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 2️⃣ Load Data\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\")\nsub = pd.read_csv(\"/kaggle/input/cat-in-the-dat-ii/sample_submission.csv\")\n\n# Separate target\ny = train['target']\ntrain.drop(['target'], axis=1, inplace=True)\n\n# Identify categorical columns\ncat_cols = [c for c in train.columns if c != 'id']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:46:13.832648Z","iopub.execute_input":"2025-10-27T16:46:13.832976Z","iopub.status.idle":"2025-10-27T16:46:20.188370Z","shell.execute_reply.started":"2025-10-27T16:46:13.832947Z","shell.execute_reply":"2025-10-27T16:46:20.187157Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ============================\n# 3️⃣ EDA - Exploratory Data Analysis (before Label Encoding)\n# ============================\n\n# Basic info\nprint(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)\nprint(\"\\nMissing values in train:\\n\", train.isnull().sum())\nprint(\"\\nTarget distribution:\\n\", y.value_counts(normalize=True))\n\n# Plot target distribution\nplt.figure(figsize=(5,3))\nsns.countplot(x=y)\nplt.title(\"Target Distribution\")\nplt.show()\n\n# Column value counts (for first 5 columns)\nfor c in cat_cols[:5]:\n    plt.figure(figsize=(6,3))\n    sns.countplot(x=train[c].astype(str))  \n    plt.title(f\"Distribution of {c}\")\n    plt.show()\n\n# Unique values per column\nfor c in cat_cols:\n    print(c, \"unique values:\", train[c].nunique())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:46:20.189495Z","iopub.execute_input":"2025-10-27T16:46:20.189799Z","iopub.status.idle":"2025-10-27T16:46:24.710476Z","shell.execute_reply.started":"2025-10-27T16:46:20.189776Z","shell.execute_reply":"2025-10-27T16:46:24.709113Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 4️⃣ Feature Engineering\n# ============================\n\n# Label Encoding لكل الأعمدة الفئوية\nfor c in cat_cols:\n    train[c] = train[c].astype(str)\n    test[c] = test[c].astype(str)\n    le = LabelEncoder()\n    le.fit(list(train[c]) + list(test[c]))\n    train[c] = le.transform(train[c])\n    test[c] = le.transform(test[c])\n\n# Feature Engineering - ميزات رقمية\ntrain['unique_count'] = train[cat_cols].nunique(axis=1)\ntest['unique_count'] = test[cat_cols].nunique(axis=1)\nnumeric_cols = ['unique_count']\n\n# Columns for embedding\ncat_cols_for_embedding = [c for c in cat_cols if c not in numeric_cols]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:46:24.711806Z","iopub.execute_input":"2025-10-27T16:46:24.712116Z","iopub.status.idle":"2025-10-27T16:47:24.192391Z","shell.execute_reply.started":"2025-10-27T16:46:24.712091Z","shell.execute_reply":"2025-10-27T16:47:24.190927Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 5️⃣ Split Data\n# ============================\nx_train, x_val, y_train, y_val = train_test_split(train[cat_cols + numeric_cols], y, test_size=0.2, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:47:24.193657Z","iopub.execute_input":"2025-10-27T16:47:24.194004Z","iopub.status.idle":"2025-10-27T16:47:24.815851Z","shell.execute_reply.started":"2025-10-27T16:47:24.193979Z","shell.execute_reply":"2025-10-27T16:47:24.814563Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 6️⃣ Build Model with Entity Embeddings\n# ============================\ninputs, embeddings = [], []\n\n# Embeddings for categorical columns\nfor c in cat_cols_for_embedding:\n    inp = Input(shape=(1,))\n    dim = min(100, int(np.log2(train[c].nunique()) * 4))\n    emb = Embedding(train[c].nunique()+1, dim)(inp)\n    emb = Flatten()(emb)\n    inputs.append(inp)\n    embeddings.append(emb)\n\n# Numeric inputs\nnum_input = Input(shape=(len(numeric_cols),))\ninputs.append(num_input)\nembeddings.append(num_input)\n\n# Concatenate all\nx = Concatenate()(embeddings)\nx = Dense(256, activation='relu')(x)\nx = Dropout(0.3)(x)\nx = Dense(128, activation='relu')(x)\nx = Dropout(0.2)(x)\nx = Dense(64, activation='relu')(x)\nout = Dense(1, activation='sigmoid')(x)\n\nmodel = Model(inputs, out)\nmodel.compile(loss='binary_crossentropy', optimizer=Adam(0.001), metrics=[AUC(name='auc')])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:47:24.816926Z","iopub.execute_input":"2025-10-27T16:47:24.817245Z","iopub.status.idle":"2025-10-27T16:47:25.406204Z","shell.execute_reply.started":"2025-10-27T16:47:24.817212Z","shell.execute_reply":"2025-10-27T16:47:25.404511Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 7️⃣ Train Model\n# ============================\nes = EarlyStopping(monitor='val_auc', patience=2, mode='max', restore_best_weights=True)\n\nmodel.fit([x_train[c] for c in cat_cols_for_embedding] + [x_train[numeric_cols].values],\n          y_train,\n          validation_data=([x_val[c] for c in cat_cols_for_embedding] + [x_val[numeric_cols].values], y_val),\n          epochs=20,\n          batch_size=512,\n          verbose=1,\n          callbacks=[es])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:47:25.407671Z","iopub.execute_input":"2025-10-27T16:47:25.408111Z","iopub.status.idle":"2025-10-27T16:48:27.033184Z","shell.execute_reply.started":"2025-10-27T16:47:25.408074Z","shell.execute_reply":"2025-10-27T16:48:27.032009Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 8️⃣ Predict & Save Submission\n# ============================\npreds = model.predict([test[c] for c in cat_cols_for_embedding] + [test[numeric_cols].values])\nsub['target'] = preds\nsub.to_csv(\"submission.csv\", index=False)\nprint(\"Submission file saved as submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-27T16:48:27.034430Z","iopub.execute_input":"2025-10-27T16:48:27.034753Z","iopub.status.idle":"2025-10-27T16:49:23.734357Z","shell.execute_reply.started":"2025-10-27T16:48:27.034724Z","shell.execute_reply":"2025-10-27T16:49:23.733288Z"}},"outputs":[],"execution_count":null}]}