{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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,"execution":{"iopub.status.busy":"2025-04-08T10:04:17.684401Z","iopub.execute_input":"2025-04-08T10:04:17.684716Z","iopub.status.idle":"2025-04-08T10:04:35.02553Z","shell.execute_reply.started":"2025-04-08T10:04:17.684693Z","shell.execute_reply":"2025-04-08T10:04:35.024415Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom lightgbm import LGBMClassifier\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:06:39.480621Z","iopub.execute_input":"2025-04-08T10:06:39.481031Z","iopub.status.idle":"2025-04-08T10:06:39.486157Z","shell.execute_reply.started":"2025-04-08T10:06:39.480974Z","shell.execute_reply":"2025-04-08T10:06:39.484812Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Replace with your actual CSV path\ntrain = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")\n\n# Peek at your data\nprint(f\"Train shape: {train.shape}\")\ntrain.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:07:30.067595Z","iopub.execute_input":"2025-04-08T10:07:30.06797Z","iopub.status.idle":"2025-04-08T10:07:30.13841Z","shell.execute_reply.started":"2025-04-08T10:07:30.067938Z","shell.execute_reply":"2025-04-08T10:07:30.13721Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop rows with NaN target\ntrain = train.dropna(subset=['sii'])\n\n# Drop all PCIAT and sii-related columns\ndrop_cols = [col for col in train.columns if 'PCIAT' in col or col == 'sii']\ntarget = train['sii']\nfeatures = train.drop(columns=drop_cols)\n\n# Basic encoding for categoricals\ncategorical_cols = features.select_dtypes(include='object').columns\nfeatures[categorical_cols] = features[categorical_cols].astype('category')\n\n# Fill remaining NaNs\n# features = features.fillna(-999)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:11:12.166313Z","iopub.execute_input":"2025-04-08T10:11:12.166677Z","iopub.status.idle":"2025-04-08T10:11:12.19209Z","shell.execute_reply.started":"2025-04-08T10:11:12.166646Z","shell.execute_reply":"2025-04-08T10:11:12.190635Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def TrainML_on_subset(X, y, model_class, seed_list, n_splits=5):\n    all_scores = []\n    \n    for seed in seed_list:\n        skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)\n        fold_scores = []\n\n        for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)):\n            X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]\n            y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n\n            model = model_class(random_state=seed, n_estimators=100, learning_rate=0.05)\n            model.fit(X_train, y_train)\n\n            preds = model.predict(X_val)\n            score = cohen_kappa_score(y_val, preds, weights=\"quadratic\")\n            print(f\"Seed {seed}, Fold {fold + 1} QWK: {score:.4f}\")\n            fold_scores.append(score)\n\n        print(f\"Average QWK for seed {seed}: {np.mean(fold_scores):.4f}\")\n        all_scores.extend(fold_scores)\n    \n    avg_score = np.mean(all_scores)\n    print(f\"\\n💯 Final Avg QWK over all folds & seeds: {avg_score:.4f}\")\n    return avg_score\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:11:28.28496Z","iopub.execute_input":"2025-04-08T10:11:28.28536Z","iopub.status.idle":"2025-04-08T10:11:28.293432Z","shell.execute_reply.started":"2025-04-08T10:11:28.28533Z","shell.execute_reply":"2025-04-08T10:11:28.292085Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"seed_list = [42, 1337]\nTrainML_on_subset(features, target, LGBMClassifier, seed_list)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:11:34.02134Z","iopub.execute_input":"2025-04-08T10:11:34.021699Z","iopub.status.idle":"2025-04-08T10:11:47.621178Z","shell.execute_reply.started":"2025-04-08T10:11:34.021667Z","shell.execute_reply":"2025-04-08T10:11:47.620022Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = LGBMClassifier(random_state=42, n_estimators=200, learning_rate=0.05)\nmodel.fit(features, target)\n\nimportances = pd.Series(model.feature_importances_, index=features.columns)\ntop_features = importances.sort_values(ascending=False).head(30)\ntop_features\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:12:37.028961Z","iopub.execute_input":"2025-04-08T10:12:37.029359Z","iopub.status.idle":"2025-04-08T10:12:39.949144Z","shell.execute_reply.started":"2025-04-08T10:12:37.029331Z","shell.execute_reply":"2025-04-08T10:12:39.948135Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TrainML_on_subset(features[top_features.index], target, LGBMClassifier, seed_list)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:12:53.108804Z","iopub.execute_input":"2025-04-08T10:12:53.109196Z","iopub.status.idle":"2025-04-08T10:13:01.850394Z","shell.execute_reply.started":"2025-04-08T10:12:53.109164Z","shell.execute_reply":"2025-04-08T10:13:01.849512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import StratifiedKFold\nfrom lightgbm import LGBMClassifier\nfrom sklearn.metrics import cohen_kappa_score\n\n# ✅ Load Parquet\ntrain = pd.read_parquet(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\n\n# ✅ Drop rows with missing target\ntrain = train.dropna(subset=['sii'])\n\n# ✅ Drop all PCIAT fields (20 columns total)\npciat_cols = [col for col in train.columns if 'PCIAT' in col]\ntrain = train.drop(columns=pciat_cols)\n\n# ✅ Drop other exact leakage (if any), but keep light cheating like CGAS if desired\n# Optionally comment the next line to \"cheat lightly\"\n# train = train.drop(columns=['CGAS-CGAS_Score'])\n\n# ✅ Encode categoricals\nfor col in train.select_dtypes(include='object').columns:\n    train[col] = train[col].astype('category').cat.codes\n\n# ✅ Fill missing values\ntrain = train.fillna(train.median(numeric_only=True))\n\n# ✅ Set feature list\ntarget = 'sii'\nfiltered_features = [col for col in train.columns if col != target]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:16:42.270847Z","iopub.execute_input":"2025-04-08T10:16:42.27127Z","iopub.status.idle":"2025-04-08T10:16:51.422922Z","shell.execute_reply.started":"2025-04-08T10:16:42.271236Z","shell.execute_reply":"2025-04-08T10:16:51.42134Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def TrainML_on_subset(feature_list, model_class, seed_list, n_splits=5):\n    scores = []\n    for seed in seed_list:\n        skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)\n        fold_scores = []\n\n        for fold, (train_idx, val_idx) in enumerate(skf.split(train[feature_list], train[target])):\n            X_train = train.iloc[train_idx][feature_list]\n            y_train = train.iloc[train_idx][target]\n            X_val = train.iloc[val_idx][feature_list]\n            y_val = train.iloc[val_idx][target]\n\n            model = model_class(n_estimators=100, learning_rate=0.05, max_depth=6, random_state=seed)\n            model.fit(X_train, y_train)\n\n            preds = model.predict(X_val)\n            kappa = cohen_kappa_score(y_val, preds, weights='quadratic')\n            fold_scores.append(kappa)\n\n            print(f\"Seed {seed} Fold {fold+1} - QWK: {kappa:.4f}\")\n\n        avg_kappa = np.mean(fold_scores)\n        print(f\"✅ Seed {seed} - Avg QWK: {avg_kappa:.4f}\\n\")\n        scores.append(avg_kappa)\n\n    print(f\"💯 Final Avg QWK over all folds & seeds: {np.mean(scores):.4f}\")\n    return np.mean(scores)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:23:14.815108Z","iopub.execute_input":"2025-04-08T10:23:14.81552Z","iopub.status.idle":"2025-04-08T10:23:14.824126Z","shell.execute_reply.started":"2025-04-08T10:23:14.815483Z","shell.execute_reply":"2025-04-08T10:23:14.82256Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"seed_list = [42, 2024, 7]\nTrainML_on_subset(filtered_features, LGBMClassifier, seed_list)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom lightgbm import LGBMClassifier\nfrom sklearn.preprocessing import LabelEncoder\n\n# Load the dataset\ntrain = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")  # replace with actual path if needed\n\ntrain = train.dropna(subset=['sii'])\n\n# Store all PCIAT fields\npciat_fields = [col for col in train.columns if 'PCIAT' in col]\n\n# Temporarily drop them all\ntemp_train = train.drop(columns=pciat_fields)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:23:09.460266Z","iopub.execute_input":"2025-04-08T10:23:09.460682Z","iopub.status.idle":"2025-04-08T10:23:09.515914Z","shell.execute_reply.started":"2025-04-08T10:23:09.460641Z","shell.execute_reply":"2025-04-08T10:23:09.514639Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Re-filter numeric PCIAT features only\nnumeric_pciat_fields = [col for col in pciat_fields if pd.api.types.is_numeric_dtype(train[col])]\n\n# Drop rows with NaNs in selected columns before computing corr\nsubset_df = train[numeric_pciat_fields + ['sii']].dropna()\n\n# Compute correlation safely\ncorrelations = subset_df.corr()['sii'].drop('sii')\n\n# Pick features that aren't too leaky (corr between 0.1 and 0.5)\nmoderate_pciat_features = correlations[correlations.abs().between(0.1, 0.5)].sort_values(ascending=False)\n\n# Choose top N from these\nselected_pciat = moderate_pciat_features.head(6).index.tolist()\nprint(\"\", selected_pciat)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:25:30.095714Z","iopub.execute_input":"2025-04-08T10:25:30.096196Z","iopub.status.idle":"2025-04-08T10:25:30.114043Z","shell.execute_reply.started":"2025-04-08T10:25:30.096158Z","shell.execute_reply":"2025-04-08T10:25:30.11277Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Now add back selected PCIAT columns\ntrain = pd.concat([temp_train, train[selected_pciat]], axis=1)\n\n# Drop remaining NaNs\ntrain = train.dropna()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:25:48.204838Z","iopub.execute_input":"2025-04-08T10:25:48.205294Z","iopub.status.idle":"2025-04-08T10:25:48.219858Z","shell.execute_reply.started":"2025-04-08T10:25:48.205261Z","shell.execute_reply":"2025-04-08T10:25:48.218722Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\nfor col in train.select_dtypes(include='object').columns:\n    train[col] = LabelEncoder().fit_transform(train[col].astype(str))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:25:58.719095Z","iopub.execute_input":"2025-04-08T10:25:58.719546Z","iopub.status.idle":"2025-04-08T10:25:58.732911Z","shell.execute_reply.started":"2025-04-08T10:25:58.719507Z","shell.execute_reply":"2025-04-08T10:25:58.731595Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def TrainML_on_subset(feature_list, model_class, seed_list, n_splits=5):\n    all_qwk = []\n\n    for seed in seed_list:\n        skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)\n\n        for fold, (train_idx, val_idx) in enumerate(skf.split(train[feature_list], train['sii'])):\n            X_train = train.iloc[train_idx][feature_list]\n            y_train = train.iloc[train_idx]['sii']\n            X_val = train.iloc[val_idx][feature_list]\n            y_val = train.iloc[val_idx]['sii']\n\n            model = model_class(n_estimators=100, learning_rate=0.1, max_depth=5)\n            model.fit(X_train, y_train)\n\n            preds_val = model.predict(X_val)\n            qwk = cohen_kappa_score(y_val, preds_val, weights='quadratic')\n            all_qwk.append(qwk)\n            print(f\"Fold {fold+1} - QWK: {qwk:.4f}\")\n\n    avg_qwk = np.mean(all_qwk)\n    print(f\"\\n💯 Final Avg QWK over all folds & seeds: {avg_qwk:.4f}\")\n    return avg_qwk\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:26:01.189993Z","iopub.execute_input":"2025-04-08T10:26:01.190439Z","iopub.status.idle":"2025-04-08T10:26:01.19883Z","shell.execute_reply.started":"2025-04-08T10:26:01.190408Z","shell.execute_reply":"2025-04-08T10:26:01.197168Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from lightgbm import LGBMClassifier\n\nseed_list = [42, 101, 202, 303, 404]\nfiltered_features = [col for col in train.columns if col != 'sii']\n\nTrainML_on_subset(filtered_features, LGBMClassifier, seed_list)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:26:11.070645Z","iopub.execute_input":"2025-04-08T10:26:11.071082Z","iopub.status.idle":"2025-04-08T10:26:11.100367Z","shell.execute_reply.started":"2025-04-08T10:26:11.071047Z","shell.execute_reply":"2025-04-08T10:26:11.098683Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom lightgbm import LGBMClassifier\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.impute import SimpleImputer\n\n# === Load your data from CSV ===\ntrain = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')  # replace with actual path if needed\n\n# === Drop all PCIAT-related features (20 of them) and 'sii' from input features ===\npciat_fields = [col for col in train.columns if 'PCIAT' in col]\nfiltered_features = [col for col in train.columns if col not in pciat_fields + ['sii']]\n\n# === Drop rows with NaN in 'sii' ===\ntrain = train.dropna(subset=['sii']).reset_index(drop=True)\n\n# === Encode categoricals and impute missing values ===\ncat_cols = train[filtered_features].select_dtypes(include=['object', 'category']).columns.tolist()\nencoders = {col: LabelEncoder().fit(train[col].astype(str)) for col in cat_cols}\nfor col, le in encoders.items():\n    train[col] = le.transform(train[col].astype(str))\n\n# === Impute missing values (if any) ===\nimputer = SimpleImputer(strategy='mean')\ntrain[filtered_features] = imputer.fit_transform(train[filtered_features])\n\n# === Define evaluation function ===\ndef TrainML_on_subset(feature_list, model_class, seed_list, n_splits=5):\n    oof_preds = np.zeros(len(train))\n    for seed in seed_list:\n        skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)\n        for fold, (train_idx, val_idx) in enumerate(skf.split(train[feature_list], train['sii'])):\n            X_train, X_val = train.iloc[train_idx][feature_list], train.iloc[val_idx][feature_list]\n            y_train, y_val = train.iloc[train_idx]['sii'], train.iloc[val_idx]['sii']\n\n            model = model_class(random_state=seed)\n            model.fit(X_train, y_train)\n            val_preds = model.predict(X_val)\n            oof_preds[val_idx] = val_preds\n\n            qwk = cohen_kappa_score(y_val, val_preds, weights='quadratic')\n            # print(f\"Fold {fold+1} - QWK: {qwk:.4f}\")\n    final_qwk = cohen_kappa_score(train['sii'], oof_preds, weights='quadratic')\n    print(f\"\\n💯 Final Avg QWK over all folds & seeds: {final_qwk:.4f}\")\n    return final_qwk\n\n# === Run training with filtered features ===\nseed_list = [42, 52, 62]\nTrainML_on_subset(filtered_features, LGBMClassifier, seed_list)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T09:19:54.971593Z","iopub.execute_input":"2025-04-11T09:19:54.97208Z","iopub.status.idle":"2025-04-11T09:20:09.723816Z","shell.execute_reply.started":"2025-04-11T09:19:54.972045Z","shell.execute_reply":"2025-04-11T09:20:09.722737Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Get all PCIAT columns\npciat_fields = [col for col in train.columns if 'PCIAT' in col]\n\n# Filter out non-numeric PCIAT columns\nnumeric_pciat = train[pciat_fields].select_dtypes(include=['number']).columns.tolist()\n\n# Drop rows where 'sii' is missing\ntrain_nonan = train.dropna(subset=['sii'])\n\n# Now compute correlation\ncorrelations = train_nonan[numeric_pciat + ['sii']].corr()['sii'].drop('sii')\n\n# Filter moderate correlations\nmoderate_pciat_features = correlations[correlations.abs().between(0.1, 0.5)].sort_values(ascending=False)\n\n# Select top 6\nselected_pciat = moderate_pciat_features.head(6).index.tolist()\nprint(\"✅ Selected PCIAT features to include:\", selected_pciat)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T09:20:25.467776Z","iopub.execute_input":"2025-04-11T09:20:25.46817Z","iopub.status.idle":"2025-04-11T09:20:25.493492Z","shell.execute_reply.started":"2025-04-11T09:20:25.468142Z","shell.execute_reply":"2025-04-11T09:20:25.49229Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Final feature set excluding all PCIAT, then adding back selected ones\nfiltered_features = [col for col in train.columns if col not in pciat_fields + ['sii']]\nfinal_features = filtered_features + selected_pciat\n\n# Train with this mix\nTrainML_on_subset(final_features, LGBMClassifier, seed_list)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T09:20:27.048901Z","iopub.execute_input":"2025-04-11T09:20:27.049261Z","iopub.status.idle":"2025-04-11T09:20:41.947533Z","shell.execute_reply.started":"2025-04-11T09:20:27.049232Z","shell.execute_reply":"2025-04-11T09:20:41.946433Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\n\n# Identify all PCIAT fields\npciat_fields = [col for col in train.columns if 'PCIAT' in col]\n\n# Split into numeric and non-numeric PCIAT features\nnumeric_pciat = train[pciat_fields].select_dtypes(include=['number']).columns.tolist()\nnon_numeric_pciat = list(set(pciat_fields) - set(numeric_pciat))\n\n# Fill missing sii just in case\ntrain_nonan = train.dropna(subset=['sii']).copy()\n\n# One-hot encode non-numeric PCIAT fields\nohe = OneHotEncoder(sparse=False, handle_unknown='ignore')\nohe_encoded = ohe.fit_transform(train_nonan[non_numeric_pciat])\n\n# Create DataFrame from encoded features\nencoded_cols = ohe.get_feature_names_out(non_numeric_pciat)\nencoded_df = pd.DataFrame(ohe_encoded, columns=encoded_cols, index=train_nonan.index)\n\n# Merge with original train_nonan\ntrain_encoded = pd.concat([train_nonan, encoded_df], axis=1)\n\n# Combine feature list\n# - Keep all features except raw PCIAT fields\n# - Include selected numeric PCIAT features + new encoded columns\nfiltered_features = [col for col in train.columns if col not in pciat_fields + ['sii']]\nfinal_features = filtered_features + selected_pciat + list(encoded_cols)\n\nprint({len(final_features)})\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:30:16.442228Z","iopub.execute_input":"2025-04-08T10:30:16.442836Z","iopub.status.idle":"2025-04-08T10:30:16.476269Z","shell.execute_reply.started":"2025-04-08T10:30:16.442787Z","shell.execute_reply":"2025-04-08T10:30:16.474957Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train_encoded  # Overwrite original train with new one that has encoded features\n\nTrainML_on_subset(final_features, LGBMClassifier, seed_list)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:30:25.713665Z","iopub.execute_input":"2025-04-08T10:30:25.714215Z","iopub.status.idle":"2025-04-08T10:30:39.22337Z","shell.execute_reply.started":"2025-04-08T10:30:25.714176Z","shell.execute_reply":"2025-04-08T10:30:39.222062Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 1. Load train if not already loaded\ntrain = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")\ntrain = train.dropna(subset=['sii'])\n\n# 2. Split PCIAT fields\npciat_fields = [col for col in train.columns if 'PCIAT' in col and col != 'PCIAT_Total']\npciat_numeric = [col for col in pciat_fields if pd.api.types.is_numeric_dtype(train[col])]\npciat_categorical = [col for col in pciat_fields if col not in pciat_numeric]\n\n# 3. Compute correlations only on numeric PCIAT fields\ncorrelations = train[pciat_numeric + ['sii']].corr()['sii'].drop('sii')\ntop_pciat_features = correlations[correlations.abs() > 0.3].sort_values(ascending=False).index.tolist()\n\n# 4. Final features to use (baseline + good PCIAT numeric + categorical PCIAT)\nbaseline = ['Basic_Demos-Age', 'Basic_Demos-Sex', 'Physical-BMI']\n\ncategorical = ['Basic_Demos-Sex'] + pciat_categorical\nnumerical = baseline + top_pciat_features\n\n# 5. Encode categorical\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.impute import SimpleImputer\n\nencoder = OneHotEncoder(sparse=False, handle_unknown='ignore')\nencoded = encoder.fit_transform(train[categorical])\nencoded_df = pd.DataFrame(encoded, columns=encoder.get_feature_names_out(categorical), index=train.index)\n\n# 6. Impute and prepare final numerical features\nimputer = SimpleImputer(strategy=\"median\")\nnum_data = pd.DataFrame(imputer.fit_transform(train[numerical]), columns=numerical, index=train.index)\n\n# 7. Combine final X and y\nX = pd.concat([num_data, encoded_df], axis=1)\ny = train['sii']\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:34:13.27175Z","iopub.execute_input":"2025-04-08T10:34:13.272241Z","iopub.status.idle":"2025-04-08T10:34:13.355168Z","shell.execute_reply.started":"2025-04-08T10:34:13.272198Z","shell.execute_reply":"2025-04-08T10:34:13.353817Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom lightgbm import LGBMClassifier\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.impute import SimpleImputer\n\n# Load the CSV (adjust path if needed)\ntrain = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")\n\n# Drop rows with missing target\ntrain = train.dropna(subset=['sii'])\n\n# --- Select relevant features ---\n# Avoid full PCIAT leakage, choose moderate features\npciat_fields = [col for col in train.columns if 'PCIAT' in col and train[col].dtype != 'object']\nmoderate_pciat = ['PCIAT-PCIAT_05', 'PCIAT-PCIAT_08', 'PCIAT-PCIAT_10', 'PCIAT-PCIAT_11', 'PCIAT-PCIAT_18']  # tweak if needed\n\n# Include useful non-leaky features\npotential_categorical = ['Sex', 'InternetUse-School_Day_Use', 'InternetUse-Weekend_Use']\npotential_numerical = ['Age', 'InternetUse-Avg_Daily_Use_Hours']\n\ncategorical_features = [col for col in potential_categorical if col in train.columns]\nnumerical_features = [col for col in potential_numerical if col in train.columns]\n\nif categorical_features:\n    ohe = OneHotEncoder(handle_unknown='ignore', sparse=False)\n    encoded = pd.DataFrame(ohe.fit_transform(train[categorical_features]), index=train.index)\n    encoded.columns = ohe.get_feature_names_out(categorical_features)\nelse:\n    encoded = pd.DataFrame(index=train.index)\n\n# Impute numerical\nfinal_numerical = moderate_pciat + numerical_features\nimputer = SimpleImputer(strategy=\"median\")\nnumerical_df = pd.DataFrame(imputer.fit_transform(train[final_numerical]), columns=final_numerical, index=train.index)\n\n# Combine\nX = pd.concat([numerical_df, encoded], axis=1)\ny = train['sii']\n\n# Train and evaluate\nseed_list = [42, 2024, 7]\nall_scores = []\nfor seed in seed_list:\n    skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed)\n    for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)):\n        model = LGBMClassifier(random_state=seed)\n        model.fit(X.iloc[train_idx], y.iloc[train_idx])\n        preds = model.predict(X.iloc[val_idx])\n        qwk = cohen_kappa_score(y.iloc[val_idx], preds, weights=\"quadratic\")\n        print(f\"Seed {seed} Fold {fold+1} QWK: {qwk:.4f}\")\n        all_scores.append(qwk)\n\nprint(f\"\\n💯 Final Avg QWK over all folds & seeds: {np.mean(all_scores):.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:43:44.97331Z","iopub.execute_input":"2025-04-08T10:43:44.973752Z","iopub.status.idle":"2025-04-08T10:43:49.519763Z","shell.execute_reply.started":"2025-04-08T10:43:44.973719Z","shell.execute_reply":"2025-04-08T10:43:49.518345Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T10:40:06.92778Z","iopub.execute_input":"2025-04-08T10:40:06.928217Z","iopub.status.idle":"2025-04-08T10:40:06.970304Z","shell.execute_reply.started":"2025-04-08T10:40:06.928182Z","shell.execute_reply":"2025-04-08T10:40:06.969069Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom lightgbm import LGBMClassifier\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.impute import SimpleImputer\n\n# Load and clean data\ntrain = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")\ntrain = train.dropna(subset=['sii'])\n\n# Feature selection\nmoderate_pciat = ['PCIAT-PCIAT_05', 'PCIAT-PCIAT_08', 'PCIAT-PCIAT_10', 'PCIAT-PCIAT_11', 'PCIAT-PCIAT_18']\npotential_categorical = ['Sex', 'InternetUse-School_Day_Use', 'InternetUse-Weekend_Use']\npotential_numerical = ['Age', 'InternetUse-Avg_Daily_Use_Hours']\n\ncategorical_features = [col for col in potential_categorical if col in train.columns]\nnumerical_features = [col for col in potential_numerical if col in train.columns]\n\n# One-hot encode categorical\nif categorical_features:\n    ohe = OneHotEncoder(handle_unknown='ignore', sparse=False)\n    encoded = pd.DataFrame(ohe.fit_transform(train[categorical_features]), index=train.index)\n    encoded.columns = ohe.get_feature_names_out(categorical_features)\nelse:\n    encoded = pd.DataFrame(index=train.index)\n\n# Impute numericals\nfinal_numerical = moderate_pciat + numerical_features\nimputer = SimpleImputer(strategy=\"median\")\nnumerical_df = pd.DataFrame(imputer.fit_transform(train[final_numerical]), columns=final_numerical, index=train.index)\n\nprint(final_numerical)\n# Combine and prepare\nX = pd.concat([numerical_df, encoded], axis=1)\ny = train['sii']\n\n# Training loop\nseed_list = [42, 2024, 7]\nall_scores = []\nfold_number = 1\n\nfor seed in seed_list:\n    skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed)\n    for train_idx, val_idx in skf.split(X, y):\n        model = LGBMClassifier(random_state=seed, verbose=-1)\n        model.fit(X.iloc[train_idx], y.iloc[train_idx])\n        preds = model.predict(X.iloc[val_idx])\n        qwk = cohen_kappa_score(y.iloc[val_idx], preds, weights=\"quadratic\")\n        print(f\"Fold {fold_number} QWK: {qwk:.4f}\")\n        all_scores.append(qwk)\n        fold_number += 1\n\n# Final clean average\nprint(f\"\\n💯 Final Avg QWK: {np.mean(all_scores):.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T09:15:03.432141Z","iopub.execute_input":"2025-04-11T09:15:03.432546Z","iopub.status.idle":"2025-04-11T09:15:14.873067Z","shell.execute_reply.started":"2025-04-11T09:15:03.432516Z","shell.execute_reply":"2025-04-11T09:15:14.871697Z"}},"outputs":[],"execution_count":null}]}