{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30762,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport re\nfrom sklearn.base import clone\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom scipy.optimize import minimize\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nfrom sklearn.model_selection import KFold\nfrom colorama import Fore, Style\nfrom IPython.display import clear_output\nimport warnings\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom sklearn.ensemble import VotingRegressor\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\n\n\nSEED = 42\nn_splits = 5\n\n# Load datasets\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\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_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\")\n\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)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestRegressor\nfrom sklearn.impute import KNNImputer\nfrom sklearn.impute import SimpleImputer","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\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', \n              'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', \n              'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', 'PreInt_EduHx-Season']\n\n\n\ndef advanced_handle_missing_values(df, cat_columns):\n    # Separate numerical and categorical columns\n    numerical_cols = df.select_dtypes(include=['float64', 'int64']).columns\n    \n    # KNN Imputer for numerical columns\n    knn_imputer = KNNImputer(n_neighbors=5)\n    df[numerical_cols] = knn_imputer.fit_transform(df[numerical_cols])\n\n    # Simple Imputer for categorical columns (using mode)\n    mode_imputer = SimpleImputer(strategy='most_frequent')\n    df[cat_columns] = mode_imputer.fit_transform(df[cat_columns])\n    \n    return df\n\ntrain = advanced_handle_missing_values(train, cat_c)\ntest = advanced_handle_missing_values(test, cat_c)\n\n\n\"\"\"def update(df):\n        global cat_c\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 = create_mapping(col, train)\n        mappingTe = create_mapping(col, test)\n\n        train[col] = train[col].replace(mapping).astype(int)\n        test[col] = test[col].replace(mappingTe).astype(int)\n\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)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\n\ndef TrainML(model_class, test_data):\n        X = train.drop(['sii'], axis=1)\n        y = train['sii']\n\n        SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)\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), desc=\"Training Folds\", total=n_splits)):\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            model.fit(X_train, y_train)\n\n            y_train_pred = model.predict(X_train)\n            y_val_pred = model.predict(X_val)\n\n            oof_non_rounded[test_idx] = y_val_pred\n            y_val_pred_rounded = y_val_pred.round(0).astype(int)\n            oof_rounded[test_idx] = y_val_pred_rounded\n\n            train_kappa = quadratic_weighted_kappa(y_train, y_train_pred.round(0).astype(int))\n            val_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded)\n\n            train_S.append(train_kappa)\n            test_S.append(val_kappa)\n\n            test_preds[:, fold] = model.predict(test_data)\n\n            print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")\n            clear_output(wait=True)\n\n        print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\")\n        print(f\"Mean Validation QWK ---> {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        assert KappaOPtimizer.success, \"Optimization did not converge.\"\n\n        oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x)\n        tKappa = quadratic_weighted_kappa(y, oof_tuned)\n\n        print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {tKappa:.3f}{Style.RESET_ALL}\")\n\n        tpm = test_preds.mean(axis=1)\n        tpTuned = threshold_Rounder(tpm, KappaOPtimizer.x)\n\n        submission = pd.DataFrame({\n            'id': sample['id'],\n            'sii': tpTuned\n        })\n\n        return submission","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"et_params = {\n    'n_estimators': 700,\n    'max_depth': None,  # Can be tuned\n    'min_samples_split': 2,\n    'min_samples_leaf': 1,\n    'random_state': SEED\n}\n\nParams = {\n        'learning_rate': 0.046,\n        'max_depth': 8,\n        'num_leaves': 478,\n        'min_data_in_leaf': 13,\n        'feature_fraction': 0.893,\n        'bagging_fraction': 0.784,\n        'bagging_freq': 4,\n        'lambda_l1': 6,  # Increased from 6.59\n        'lambda_l2': 0.01  # Increased from 2.68e-06\n    }\n\n\n    # XGBoost parameters\nXGB_Params = {\n        'learning_rate': 0.05,\n        'max_depth': 10,\n        'n_estimators': 300,\n        'subsample': 0.8,\n        'colsample_bytree': 0.8,\n        'reg_alpha': 0.1,  # Increased from 0.1\n        'reg_lambda': 5,  # Increased from 1\n        'random_state': SEED\n    }\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.ensemble import ExtraTreesRegressor\n\n# Define individual models\nxgb_model = XGBRegressor(**XGB_Params)\nlgbm_model = LGBMRegressor(**Params)\nextra_trees_model = ExtraTreesRegressor(**et_params)\n\n# Create Voting Regressor\nvoting_model = VotingRegressor(estimators=[\n    ('xgb', xgb_model),\n    ('lgbm', lgbm_model),\n    ('extra_trees', extra_trees_model)\n])\n\n# Train the voting model\nsubmission = TrainML(voting_model, test)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save submission\nsubmission.to_csv('submission.csv', index=False)\nprint(submission['sii'].value_counts())","metadata":{},"outputs":[],"execution_count":null}]}