{"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":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 1. Initialization","metadata":{}},{"cell_type":"markdown","source":"## a. Import libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport polars as pl\nimport pandas as pd\nfrom sklearn.base import clone\nfrom copy import deepcopy\nimport optuna\nfrom scipy.optimize import minimize\nimport os\nfrom scipy.stats import mode\n\nimport re\nfrom colorama import Fore, Style\n\nfrom tqdm import tqdm\nfrom IPython.display import clear_output\nfrom concurrent.futures import ThreadPoolExecutor\n\nimport warnings\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\n\nimport lightgbm as lgb\nfrom catboost import CatBoostRegressor, CatBoostClassifier\nfrom xgboost import XGBRegressor\nfrom sklearn.ensemble import VotingRegressor\nfrom sklearn.model_selection import *\nfrom sklearn.metrics import *\n\nSEED = 42\nn_splits = 5\n\n\ndef process_file(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    df.drop('step', axis=1, inplace=True)\n    return df.describe().values.reshape(-1), filename.split('=')[1]\n\ndef load_time_series(dirname) -> pd.DataFrame:\n    ids = os.listdir(dirname)\n\n    with ThreadPoolExecutor() as executor:\n        results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n\n    stats, indexes = zip(*results)\n\n    df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))])\n    df['id'] = indexes\n\n    return df\n\ntrain = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\nsample = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv')\n\ntrain_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\ntime_series_cols = train_ts.columns.tolist()\ntime_series_cols.remove(\"id\")\n\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')\n\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)\n\nfeaturesCols = ['Basic_Demos-Enroll_Season', 'Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-Season', 'CGAS-CGAS_Score', 'Physical-Season', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Season', 'Fitness_Endurance-Max_Stage',\n                'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                'FGC-Season', 'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n                'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n                'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n                'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone', 'BIA-Season',\n                'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n                'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n                'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n                'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n                'BIA-BIA_TBW', 'PAQ_A-Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-Season',\n                'PAQ_C-PAQ_C_Total', 'SDS-Season', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T', 'PreInt_EduHx-Season',\n                'PreInt_EduHx-computerinternet_hoursday', 'sii']\n\nfeaturesCols += time_series_cols\n\ntrain = train[featuresCols]\ntrain = train.dropna(subset='sii')\n\ncat_c = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season',\n            'FGC-Season', 'BIA-Season', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', 'PreInt_EduHx-Season']\n\ndef update(df):\n    for c in cat_c:\n        df[c] = df[c].fillna('Missing')\n        df[c] = df[c].astype('category')\n    return df\n\ntrain = update(train)\ntest = update(test)\n\ndef create_mapping(column, dataset):\n    unique_values = dataset[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\n\nfor col in cat_c:\n    mapping_train = create_mapping(col, train)\n\n    train[col] = train[col].replace(mapping_train).astype(int)\n    test[col] = test[col].replace(mapping_train).astype(int)\n\nprint(f'Train Shape : {train.shape} || Test Shape : {test.shape}')\n\nimport numpy as np\nimport pandas as pd\nimport lightgbm as lgb\nimport xgboost as xgb\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.base import clone\nfrom scipy.optimize import minimize\nfrom tqdm import tqdm\nfrom IPython.display import clear_output\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# Evaluation functions\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)\n\n# Model configurations\nn_splits = 5\nseed_list = [42, 0, 2024, 7269173, 1234]\n\n# LightGBM parameters\nlgb_params = {\n    'learning_rate': 0.03755757104848504,\n    'max_depth': 12,\n    'num_leaves': 18,\n    'min_data_in_leaf': 3,\n    'feature_fraction': 0.723690362968002,\n    'bagging_fraction': 0.688232590484764,\n    'bagging_freq': 5,\n    'lambda_l1': 0.18512987285245963,\n    'lambda_l2': 0.18435628737334625,\n    'verbose': -1,\n    'n_estimators': 200,\n    'objective': 'regression'\n}\n\n# XGBoost parameters\nxgb_params = {\n    'learning_rate': 0.05,\n    'max_depth': 6,\n    'n_estimators': 200,\n    'min_child_weight': 3,\n    'gamma': 0,\n    'subsample': 0.8,\n    'colsample_bytree': 0.8,\n    'reg_alpha': 0.1,\n    'reg_lambda': 1.0,\n    'random_state': 42,\n    'verbosity': 0\n}\n\n# Features and target\nX = train.drop(['sii'], axis=1)\ny = train['sii']\ntest_data = test\n\n# Define model training function\ndef TrainML(model_class, test_data, seed_list):\n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)\n\n    train_S = []\n    test_S = []\n\n    oof_non_rounded = np.zeros(len(y), dtype=float)\n    oof_rounded = np.zeros(len(y), dtype=int)\n    test_preds = np.zeros((len(test_data), n_splits))\n\n    for fold, (train_idx, test_idx) in enumerate(tqdm(SKF.split(X, y.astype(int)), desc=\"Training Folds\", total=n_splits)):\n\n        random_seed = np.random.choice(seed_list)\n\n        X_train, X_val = X.iloc[train_idx], X.iloc[test_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[test_idx]\n\n        model = clone(model_class)\n        if hasattr(model, 'random_state'):\n            model.set_params(random_state=random_seed)\n        model.fit(X_train, y_train)\n        y_train_pred = model.predict(X_train)\n        y_val_pred = model.predict(X_val)\n        test_preds[:, fold] = model.predict(test_data)\n\n        oof_non_rounded[test_idx] = y_val_pred\n        y_val_pred_rounded = np.round(y_val_pred).astype(int)\n        oof_rounded[test_idx] = y_val_pred_rounded\n        train_kappa = quadratic_weighted_kappa(y_train, np.round(y_train_pred).astype(int))\n        val_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded)\n        train_S.append(train_kappa)\n        test_S.append(val_kappa)\n\n        print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")\n\n    print(f\"Train : {np.mean(train_S):.4f}\")\n    print(f\"Validation : {np.mean(test_S):.4f}\")\n\n    KappaOPtimizer = minimize(evaluate_predictions,\n                                 x0=[0.5, 1.5, 2.5], args=(y, oof_non_rounded),\n                                 method='Nelder-Mead')\n\n    oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x)\n    tKappa = quadratic_weighted_kappa(y, oof_tuned)\n    print(f\"----> || Optimized QWK: {tKappa:.3f}\")\n    print(f\"Optimal thresholds: {KappaOPtimizer.x}\")\n\n    tpm = test_preds.mean(axis=1)\n    tpTuned = threshold_Rounder(tpm, KappaOPtimizer.x)\n\n    return tpTuned, oof_non_rounded, KappaOPtimizer.x\n\n# Initialize models\nlgb_model = lgb.LGBMRegressor(**lgb_params)\n#xgb_model = xgb.XGBRegressor(**xgb_params)\n\nprint(\"Training LightGBM model...\")\nlgb_preds, lgb_oof, lgb_thresholds = TrainML(lgb_model, test_data, seed_list)\n\n#print(\"\\nTraining XGBoost model...\")\n#xgb_preds, xgb_oof, xgb_thresholds = TrainML(xgb_model, test_data, seed_list)\n\n\n\n#print(\"\\nTraining XGBoost model...\")\n#xgb_preds, xgb_oof, xgb_thresholds = TrainML(xgb_model, test_data, seed_list)\n\n# # Create ensemble by averaging predictions\n# print(\"\\nCreating ensemble...\")\n# # Simple average of OOF predictions\n# ensemble_oof = (lgb_oof + xgb_oof) / 2\n\n# # Optimize thresholds for ensemble\n# ensemble_optimizer = minimize(evaluate_predictions,\n#                                  x0=[0.5, 1.5, 2.5], args=(y, ensemble_oof),\n#                                  method='Nelder-Mead')\n\n# ensemble_tuned_oof = threshold_Rounder(ensemble_oof, ensemble_optimizer.x)\n# ensemble_kappa = quadratic_weighted_kappa(y, ensemble_tuned_oof)\n# print(f\"Ensemble OOF QWK: {ensemble_kappa:.4f}\")\n# print(f\"Ensemble optimal thresholds: {ensemble_optimizer.x}\")\n\n# # Create ensemble test predictions\n# ensemble_test = (lgb_preds + xgb_preds) / 2\n# final_preds = threshold_Rounder(ensemble_test, ensemble_optimizer.x)\n\n\n\nxgb_submission = pd.DataFrame({'id': sample['id'], 'sii': lgb_preds})\nxgb_submission.to_csv('submission.csv', index=False)\n# Create submission file\nsubmission = pd.DataFrame({\n    'id': sample['id'],\n    'sii': lgb_preds\n})\nsubmission.to_csv('submission.csv', index=False)\nprint(\"\\nSubmission file created: submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T04:51:38.861229Z","iopub.execute_input":"2025-04-09T04:51:38.861992Z","iopub.status.idle":"2025-04-09T04:53:11.101296Z","shell.execute_reply.started":"2025-04-09T04:51:38.861947Z","shell.execute_reply":"2025-04-09T04:53:11.100039Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-09T04:58:27.018064Z","iopub.execute_input":"2025-04-09T04:58:27.018572Z","iopub.status.idle":"2025-04-09T04:58:27.043986Z","shell.execute_reply.started":"2025-04-09T04:58:27.018538Z","shell.execute_reply":"2025-04-09T04:58:27.043051Z"}},"outputs":[],"execution_count":null}]}