{"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":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":7453542,"sourceType":"datasetVersion","datasetId":921302},{"sourceId":212249161,"sourceType":"kernelVersion"},{"sourceId":212270844,"sourceType":"kernelVersion"}],"dockerImageVersionId":30804,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#!pip -q install /kaggle/input/pytorchtabnet/pytorch_tabnet-4.1.0-py3-none-any.whl\n!pip install -q --upgrade --no-index --find-links=/kaggle/input/download-xgboost-2-1-3 xgboost","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:15:29.846777Z","iopub.execute_input":"2024-12-16T09:15:29.847146Z","iopub.status.idle":"2024-12-16T09:15:52.871567Z","shell.execute_reply.started":"2024-12-16T09:15:29.847113Z","shell.execute_reply":"2024-12-16T09:15:52.870046Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom pathlib import Path\nimport h5py\nimport gc\nimport cv2\nimport math\nimport copy\nimport time\nimport random\nimport glob\nimport joblib\nfrom matplotlib import pyplot as plt\nimport seaborn as sns\nimport h5py\nfrom PIL import Image\nfrom io import BytesIO\nfrom tqdm.notebook import tqdm\n\nimport numpy as np\nimport pandas as pd\nimport polars as pl\nfrom scipy.optimize import minimize\nfrom concurrent.futures import ThreadPoolExecutor\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.ensemble import VotingClassifier\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.ensemble import HistGradientBoostingRegressor\n\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom imblearn.pipeline import Pipeline\nfrom colorama import Fore, Back, Style\nimport gc\nfrom scipy.stats import rankdata\nimport shutil\n\nimport lightgbm as lgb\nimport catboost as cb\nimport xgboost as xgb\n\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\n\nimport optuna\nimport warnings\nwarnings.filterwarnings('ignore')\npd.set_option('display.max_columns', None)\npd.set_option('display.max_rows', 500)\n\nimport logging\n\nclass CustomLogger:\n    def __init__(self):\n        self.logger = logging.getLogger(\"lightgbm_custom\")\n        self.logger.setLevel(logging.ERROR)\n\n    def info(self, message):\n        self.logger.info(message)\n\n    def warning(self, message):\n        pass\n\n    def error(self, message):\n        self.logger.error(message)\n\nlgb.register_logger(CustomLogger())\n\nimputation_cols = [\n    'PreInt_EduHx-computerinternet_hoursday',\n    'Basic_Demos-Age','Physical-BMI','Physical-Height','Physical-Weight',\n    'BIA-BIA_BMR','BIA-BIA_BMI','BIA-BIA_ECW','BIA-BIA_ICW','BIA-BIA_SMM',\n    'BIA-BIA_TBW','Internet_Hours_Age','Physical-Height_Age','SDS_BMI',\n    'Age_Systolic_BP','PreInt_Systolic_BP','BMI_Age','SDS_InternetHours'\n]\n\n\ndef knn_imputation(df_train, df_test):\n    imputer = KNNImputer(n_neighbors=5)\n    df_train[imputation_cols] = imputer.fit_transform(df_train[imputation_cols])\n    df_test[imputation_cols] = imputer.transform(df_test[imputation_cols])\n\n    col = 'PreInt_EduHx-computerinternet_hoursday'\n    df_train[col] = df_train[col].round(0)\n    df_test[col] = df_test[col].round(0)\n    \n    col = 'Internet_Hours_Age'\n    df_train['Internet_Hours_Age'] = df_train['Internet_Hours_Age'].round(0) // 5\n    df_test['Internet_Hours_Age'] = df_test['Internet_Hours_Age'].round(0) // 5\n    \n    for col in ['Physical-Height_Age','SDS_BMI','Age_Systolic_BP','PreInt_Systolic_BP','BMI_Age','SDS_InternetHours']:\n        df_train[col] = df_train[col].round(0) // 10\n        df_test[col] = df_test[col].round(0) // 10\n\n    return df_train, df_test\n\n\n\ndef training_and_inference(model_name, use_features, params, target_name, appx_name):\n\n    oof = train[['kfold_42', 'kfold_1993', 'kfold_927', 'kfold_315', 'kfold_167', 'PCIAT-PCIAT_Total', 'sii']].copy()\n    feature_importances = pd.DataFrame()\n    feature_importances['feature'] = use_features\n    feature_importances['null_condition'] = feature_importances['feature'].map(feature_null_dict)\n    seed_kappa = []\n\n    all_train = train[~train['id'].isin(training_exclude_ids)]\n    print(all_train[use_features].shape)\n\n    if target_name == 'PCIAT-PCIAT_Total':\n        optimal_thresholds = [30, 50, 80]\n    else:\n        optimal_thresholds = [0.5, 1.5, 2.5]\n    \n    for seed in seeds:\n\n        # --------------------------------- Training ---------------------------------\n        \n        oof[f'prediction_{seed}'] = 0.0\n        oof[f'pred_sii_{seed}'] = 0.0\n        fold_kappa = []\n        for fold in range(skf.n_splits):\n            \n            x_train = train[train[f'kfold_{seed}'] != fold].copy()\n            x_valid = train[train[f'kfold_{seed}'] == fold].copy()\n            x_train = x_train[~x_train['id'].isin(training_exclude_ids)]\n            weight = x_train['train_weight']\n\n            x_train, x_valid = knn_imputation(x_train, x_valid)\n        \n            y_train = x_train[target_name]\n            y_valid = x_valid[target_name]\n            y_label = x_valid['sii']\n        \n            x_train = x_train[use_features]\n            x_valid = x_valid[use_features]\n\n            if model_name == 'xgb':\n                params.update({'random_state': seed})\n                clf = xgb.XGBRegressor(**params)\n                clf.fit(\n                    x_train, y_train,\n                    eval_set=[(x_valid, y_valid)],\n                    verbose=0,\n                    sample_weight=weight\n                )\n                feature_importances[f'fold_{fold + 1}_{seed}'] = feature_importances['feature'].map(clf.get_booster().get_score())\n            elif model_name == 'lgb':\n                params.update({'random_state': seed})\n                clf = lgb.LGBMRegressor(**params)\n                clf.fit(\n                    x_train, y_train,\n                    eval_set=[(x_valid, y_valid)],\n                    sample_weight=weight\n                )\n                feature_importances[f'fold_{fold + 1}_{seed}'] = clf.feature_importances_\n            elif model_name == 'cb':\n                params.update({'random_state': seed})\n                clf = cb.CatBoostRegressor(**params)\n                clf.fit(\n                    x_train, y_train,\n                    eval_set=[(x_valid, y_valid)],\n                    sample_weight=weight\n                )\n                feature_importances[f'fold_{fold + 1}_{seed}'] = clf.feature_importances_\n            else:\n                params.update({'random_state': seed})\n                clf = HistGradientBoostingRegressor(**params)\n                clf.fit(\n                    x_train, y_train,\n                    sample_weight=weight\n                )\n            \n            preds_valid = clf.predict(x_valid)\n            oof.loc[oof[f'kfold_{seed}']==fold, f'prediction_{seed}'] = preds_valid\n            \n            pred_sii = threshold_Rounder(preds_valid, optimal_thresholds)\n            val_kappa = quadratic_weighted_kappa(y_label, pred_sii)\n            fold_kappa.append(val_kappa)\n        \n        pred_sii = threshold_Rounder(oof[f'prediction_{seed}'], optimal_thresholds)\n        o_kappa = quadratic_weighted_kappa(oof['sii'], pred_sii)\n        print(f\"{Fore.RED}{Style.BRIGHT}# overall kappa = {o_kappa:.4f}(std: {np.std(fold_kappa):.4f}){Style.RESET_ALL}\")\n\n        binS = oof.groupby('sii')[f'prediction_{seed}'].mean().iloc[1:].values.tolist()\n        KappaOPtimizer = minimize(\n            evaluate_predictions,\n            x0=binS, args=(oof['sii'], oof[f'prediction_{seed}']),\n            method='Nelder-Mead'\n        )\n        assert KappaOPtimizer.success, \"Optimization did not converge.\"\n        OPT_binS = KappaOPtimizer.x\n        print(OPT_binS)\n        tuned = threshold_Rounder(oof[f'prediction_{seed}'], OPT_binS)\n        oof[f'pred_sii_{seed}'] = tuned\n        OOF[f'{appx_name}_{seed}'] = tuned\n        \n        tKappa = quadratic_weighted_kappa(oof['sii'], tuned)\n        print(f\"----> || Optimized QWK: {Fore.CYAN}{Style.BRIGHT} {tKappa:.4f}{Style.RESET_ALL}\")\n        seed_kappa.append(tKappa)\n\n        # --------------------------------- Inference ---------------------------------\n\n        full_train_df = all_train.copy()\n        full_test_df = test_df.copy()\n        full_train_df, full_test_df = knn_imputation(full_train_df, full_test_df)\n\n        if model_name == 'xgb':\n            params.update({'random_state': seed})\n            clf = xgb.XGBRegressor(**params)\n            clf.fit(full_train_df[use_features], full_train_df[target_name], verbose=0, sample_weight=full_train_df['train_weight'])\n        elif model_name == 'lgb':\n            params.update({'random_state': seed})\n            clf = lgb.LGBMRegressor(**params)\n            clf.fit(full_train_df[use_features], full_train_df[target_name], sample_weight=full_train_df['train_weight'])\n        elif model_name == 'cb':\n            params.update({'random_state': seed})\n            clf = cb.CatBoostRegressor(**params)\n            clf.fit(full_train_df[use_features], full_train_df[target_name], sample_weight=full_train_df['train_weight'])\n        else:\n            params.update({'random_state': seed})\n            clf = HistGradientBoostingRegressor(**params)\n            clf.fit(full_train_df[use_features], full_train_df[target_name], sample_weight=full_train_df['train_weight'])\n            \n        test_df[f'{appx_name}_{seed}'] = clf.predict(full_test_df[use_features])\n        test_df[f'{appx_name}_{seed}'] = threshold_Rounder(test_df[f'{appx_name}_{seed}'], OPT_binS)\n    \n    print(f\"{Fore.GREEN}{Style.BRIGHT}# overall kappa = {np.mean(seed_kappa):.4f}(std: {np.std(seed_kappa):.4f}){Style.RESET_ALL}\")\n\n    if model_name in ('xgb', 'lgb', 'cb'):\n        feature_importances['importance'] = feature_importances.drop('feature', axis=1).mean(axis=1)\n        feature_importances = feature_importances.sort_values('importance', ascending=False).reset_index(drop=True)\n        display(feature_importances[['feature','null_condition','importance']])\n\n    return oof, feature_importances","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:15:52.874204Z","iopub.execute_input":"2024-12-16T09:15:52.874560Z","iopub.status.idle":"2024-12-16T09:15:59.874891Z","shell.execute_reply.started":"2024-12-16T09:15:52.874527Z","shell.execute_reply":"2024-12-16T09:15:59.874098Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\ndata_dict = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/data_dictionary.csv')\n\nuse_time_faetures = False","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:15:59.876169Z","iopub.execute_input":"2024-12-16T09:15:59.876838Z","iopub.status.idle":"2024-12-16T09:15:59.955985Z","shell.execute_reply.started":"2024-12-16T09:15:59.876793Z","shell.execute_reply":"2024-12-16T09:15:59.955120Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_label = train_df[~train_df.sii.isnull()].reset_index(drop=True)\ndisplay(train_df.shape, train_label.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:15:59.957810Z","iopub.execute_input":"2024-12-16T09:15:59.958161Z","iopub.status.idle":"2024-12-16T09:15:59.977746Z","shell.execute_reply.started":"2024-12-16T09:15:59.958129Z","shell.execute_reply":"2024-12-16T09:15:59.976442Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# BIA-BIA_Fat 体脂率有负值\n# BIA-BIA_FMI 脂肪质量(kg) / 身高(m)^2 正常范围2-10\n# BIA-BIA_FFMI 瘦体重 正常范围15-25\n# BIA-BIA_ECW 细胞外水 正常范围30-40\n# BIA-BIA_DEE 日常能量消耗 正常范围1800-3000\n# BIA-BIA_BMR 基础代谢率 正常范围1200-2500\n# BIA-BIA_Frame_num 体型大小\n# BIA-BIA_ICW 细胞内水 正常范围60-70\n# BIA-BIA_SMM 骨骼肌 正常范围12-50\n# BIA-BIA_TBW 总身体水分 正常范围50-70\n\ncond0 = (train_label['BIA-BIA_Fat']>50)|(train_label['BIA-BIA_Fat']<5)\ncond1 = (train_label['BIA-BIA_FMI']<0.5)\ncond2 = (train_label['BIA-BIA_FFMI']>25)|(train_label['BIA-BIA_FFMI']<12)\ncond3 = (train_label['BIA-BIA_ECW']>40)\ncond4 = (train_label['BIA-BIA_DEE']>3000)|(train_label['BIA-BIA_DEE']<1200)\ncond5 = (train_label['BIA-BIA_BMR']>2500)|(train_label['BIA-BIA_BMR']<900)\ncond6 = (train_label['BIA-BIA_ICW']>70)|(train_label['BIA-BIA_ICW']<20)\ncond7 = (train_label['BIA-BIA_SMM']>70)|(train_label['BIA-BIA_SMM']<12)\ncond8 = (train_label['BIA-BIA_TBW']>80)|(train_label['BIA-BIA_TBW']<30)\ncondition1 = cond0|cond1|cond2|cond3|cond4|cond5|cond6|cond7|cond8\ncondition2 = cond0&cond1&cond2&cond3&cond4&cond5&cond6&cond7&cond8\n\ntraining_exclude_ids = list(train_label.loc[condition2, 'id'].values)\n\ndef process_abnormal(df):\n    cond0 = (df['BIA-BIA_Fat']>50)|(df['BIA-BIA_Fat']<5)\n    df.loc[cond0, 'BIA-BIA_Fat'] = np.nan\n    cond1 = (df['BIA-BIA_FMI']<0.5)\n    df.loc[cond1, 'BIA-BIA_Fat'] = np.nan\n    cond2 = (df['BIA-BIA_FFMI']>25)|(df['BIA-BIA_FFMI']<12)\n    df.loc[cond2, 'BIA-BIA_FFMI'] = np.nan\n    cond3 = (df['BIA-BIA_ECW']>40)\n    df.loc[cond3, 'BIA-BIA_ECW'] = np.nan\n    cond4 = (df['BIA-BIA_DEE']>3000)|(df['BIA-BIA_DEE']<1200)\n    df.loc[cond4, 'BIA-BIA_DEE'] = np.nan\n    cond5 = (df['BIA-BIA_BMR']>2500)|(df['BIA-BIA_BMR']<900)\n    df.loc[cond5, 'BIA-BIA_BMR'] = np.nan\n    cond6 = (df['BIA-BIA_ICW']>70)|(df['BIA-BIA_ICW']<20)\n    df.loc[cond6, 'BIA-BIA_ICW'] = np.nan\n    cond7 = (df['BIA-BIA_SMM']>70)|(df['BIA-BIA_SMM']<12)\n    df.loc[cond7, 'BIA-BIA_SMM'] = np.nan\n    cond8 = (df['BIA-BIA_TBW']>80)|(df['BIA-BIA_TBW']<30)\n    df.loc[cond8, 'BIA-BIA_TBW'] = np.nan\n    cond9 = (df['Physical-Weight']<40)\n    df.loc[cond9, 'Physical-Weight'] = np.nan\n\n    return df\n\n\ntrain_label = process_abnormal(train_label)\ntest_df = process_abnormal(test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:15:59.979022Z","iopub.execute_input":"2024-12-16T09:15:59.979312Z","iopub.status.idle":"2024-12-16T09:16:00.013270Z","shell.execute_reply.started":"2024-12-16T09:15:59.979284Z","shell.execute_reply":"2024-12-16T09:16:00.012400Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"FGC_cols = [f for f in train_label.columns if 'FGC' in f and 'Season' not in f]\ntrain_label['FGC_missing'] = train_label[FGC_cols].isnull().sum(axis=1)\nBIA_cols = [f for f in train_label.columns if 'BIA' in f and 'Season' not in f]\ntrain_label['BIA_missing'] = train_label[BIA_cols].isnull().sum(axis=1)\n\nprint(train_label[(train_label['FGC-Season'].notnull())&(train_label['FGC_missing']==len(FGC_cols))].shape)\nprint(train_label[(train_label['BIA-Season'].notnull())&(train_label['BIA_missing']==len(BIA_cols))].shape)\n\ntrain_label['weight'] = 0\ntrain_label.loc[(train_label['FGC-Season'].notnull())&(train_label['FGC_missing']==len(FGC_cols)), 'weight'] += 1\ntrain_label.loc[(train_label['BIA-Season'].notnull())&(train_label['BIA_missing']==len(BIA_cols)), 'weight'] += 1\n\ndel train_label['FGC_missing'], train_label['BIA_missing']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.014655Z","iopub.execute_input":"2024-12-16T09:16:00.015087Z","iopub.status.idle":"2024-12-16T09:16:00.037445Z","shell.execute_reply.started":"2024-12-16T09:16:00.015043Z","shell.execute_reply":"2024-12-16T09:16:00.036448Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"season_cols = [f for f in train_df.columns if 'Season' in f and f!='PCIAT-Season']\n\ndef feature_engineering(df):\n    \n    df.loc[df['Physical-Diastolic_BP']<40, 'Physical-Diastolic_BP'] = np.nan\n    df.loc[df['Physical-Diastolic_BP']>100, 'Physical-Diastolic_BP'] = np.nan\n    df.loc[df['Physical-Systolic_BP']<80, 'Physical-Systolic_BP'] = np.nan\n    df.loc[df['Physical-Systolic_BP']>160, 'Physical-Systolic_BP'] = np.nan\n\n    df['Fitness_Endurance_Time'] = df['Fitness_Endurance-Time_Mins'] * 60 + df['Fitness_Endurance-Time_Sec']\n    \n    df['Age_Group'] = pd.cut(df['Basic_Demos-Age'], bins=[4, 12, 22], labels=[0, 1]).astype(int)\n    df['Season_nunique'] = df[season_cols].apply(lambda x: x.nunique(), axis=1)\n    df['PAQ_Total'] = df[['PAQ_A-PAQ_A_Total','PAQ_C-PAQ_C_Total']].max(axis=1)\n    #Age\n    df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n    df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age']\n    df['Physical-Height_Age'] = df['Basic_Demos-Age'] * df['Physical-Height']\n    df['SDS_InternetHours'] = df['SDS-SDS_Total_T'] * df['PreInt_EduHx-computerinternet_hoursday']\n\n    #SDS\n    df['SDS_BMI'] = df['BIA-BIA_BMI'] * df['SDS-SDS_Total_T']\n    df['CGAS_SDS'] = df['CGAS-CGAS_Score'] * df['SDS-SDS_Total_T']\n    #df['SDS_Activity'] = df['BIA-BIA_Activity_Level_num'] * df['SDS-SDS_Total_T']\n\n    #df['BMI_Systolic_BP'] = df['BIA-BIA_BMI'] * df['Physical-Systolic_BP'] 缺失值太多\n    df['Age_Systolic_BP'] = df['Basic_Demos-Age'] * df['Physical-Systolic_BP']\n    df['PreInt_Systolic_BP'] = df['Physical-Systolic_BP'] * df['PreInt_EduHx-computerinternet_hoursday']\n    df['PAQ_Activity'] = df['BIA-BIA_Activity_Level_num'] * df['PAQ_Total']\n    #df['Activity_CU_PU'] = df['BIA-BIA_Activity_Level_num'] * df['FGC-FGC_CU'] * df['FGC-FGC_PU'] 缺失值太多\n\n    #FGC 缺失值太多\n    #df['FGC_CU_PU'] = df['FGC-FGC_CU'] * df['FGC-FGC_PU']\n    #df['FGC_CU_PU_Age'] = df['FGC-FGC_CU'] * df['FGC-FGC_PU'] * df['Basic_Demos-Age']\n    #df['CGAS_CU_PU'] = df['CGAS-CGAS_Score'] * df['FGC-FGC_CU'] * df['FGC-FGC_PU']\n    #df['PreInt_FGC_CU_PU'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['FGC-FGC_CU'] * df['FGC-FGC_PU']\n    #df['Endurance_CU_PU'] = df['Fitness_Endurance_Time'] * df['FGC-FGC_CU'] * df['FGC-FGC_PU']\n\n    return df\n\n\ntrain_label = feature_engineering(train_label)\ntest_df = feature_engineering(test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.038489Z","iopub.execute_input":"2024-12-16T09:16:00.038789Z","iopub.status.idle":"2024-12-16T09:16:00.180938Z","shell.execute_reply.started":"2024-12-16T09:16:00.038758Z","shell.execute_reply":"2024-12-16T09:16:00.179979Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"display(train_label[imputation_cols].isnull().sum() / len(train_label))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.182049Z","iopub.execute_input":"2024-12-16T09:16:00.182312Z","iopub.status.idle":"2024-12-16T09:16:00.192410Z","shell.execute_reply.started":"2024-12-16T09:16:00.182285Z","shell.execute_reply":"2024-12-16T09:16:00.191487Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"imputer = KNNImputer(n_neighbors=5)\ntrain_label[imputation_cols] = imputer.fit_transform(train_label[imputation_cols])\ntest_df[imputation_cols] = imputer.transform(test_df[imputation_cols])\n\ncol = 'PreInt_EduHx-computerinternet_hoursday'\ntrain_label[col] = train_label[col].round(0)\ntest_df[col] = test_df[col].round(0)\n\ncol = 'Internet_Hours_Age'\ntrain_label['Internet_Hours_Age'] = train_label['Internet_Hours_Age'].round(0) // 5\ntest_df['Internet_Hours_Age'] = test_df['Internet_Hours_Age'].round(0) // 5\n\nfor col in ['Physical-Height_Age','SDS_BMI','Age_Systolic_BP','PreInt_Systolic_BP','BMI_Age','SDS_InternetHours']:\n    train_label[col] = train_label[col].round(0) // 10\n    test_df[col] = test_df[col].round(0) // 10","metadata":{"execution":{"iopub.status.busy":"2024-12-16T06:17:15.304515Z","iopub.execute_input":"2024-12-16T06:17:15.305004Z","iopub.status.idle":"2024-12-16T06:17:16.143613Z","shell.execute_reply.started":"2024-12-16T06:17:15.304955Z","shell.execute_reply":"2024-12-16T06:17:16.140542Z"}}},{"cell_type":"markdown","source":"## Severity Impairment Index: \n0-30=None;\n\n31-49=Mild;\n\n50-79=Moderate;\n\n80-100=Severe","metadata":{}},{"cell_type":"code","source":"#train_label['Total'] = train_label[[f for f in train_label.columns if 'PCIAT_' in f and f!='PCIAT-PCIAT_Total']].sum(axis=1)\nlabel_null = train_label[[f for f in train_label.columns if 'PCIAT_' in f]].isnull().sum(axis=1)\n\ncond1 = (train_label['PCIAT-PCIAT_Total']>25)&(train_label['PCIAT-PCIAT_Total']<35)\ncond2 = (train_label['PCIAT-PCIAT_Total']>45)&(train_label['PCIAT-PCIAT_Total']<55)\ncond3 = (train_label['PCIAT-PCIAT_Total']>75)&(train_label['PCIAT-PCIAT_Total']<85)\ncond4 = (label_null==1)\ncond5 = (label_null>1)\n\ntraining_exclude_ids += train_label.loc[(cond1|cond2|cond3)&(cond4), 'id'].to_list()\ntraining_exclude_ids += train_label.loc[cond5, 'id'].to_list()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.193750Z","iopub.execute_input":"2024-12-16T09:16:00.194178Z","iopub.status.idle":"2024-12-16T09:16:00.205333Z","shell.execute_reply.started":"2024-12-16T09:16:00.194133Z","shell.execute_reply":"2024-12-16T09:16:00.204376Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(training_exclude_ids)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.209118Z","iopub.execute_input":"2024-12-16T09:16:00.209530Z","iopub.status.idle":"2024-12-16T09:16:00.219732Z","shell.execute_reply.started":"2024-12-16T09:16:00.209498Z","shell.execute_reply":"2024-12-16T09:16:00.218820Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def 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\n#optimal_thresholds = [30, 50, 80]\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,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.220937Z","iopub.execute_input":"2024-12-16T09:16:00.221251Z","iopub.status.idle":"2024-12-16T09:16:00.230206Z","shell.execute_reply.started":"2024-12-16T09:16:00.221222Z","shell.execute_reply":"2024-12-16T09:16:00.229169Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Series data","metadata":{}},{"cell_type":"code","source":"def time_features(df):\n    # Convert time_of_day to hours\n    df[\"time_of_day_hours\"] = df[\"time_of_day\"] // (3_600 * 1_000_000_000)\n    df[\"enmo\"] = pd.Series.rolling(df[\"enmo\"], window=10, min_periods=1).mean()\n    df[\"light\"] = pd.Series.rolling(df[\"light\"], window=10, min_periods=1).mean()\n    df['enmoXlight'] = df['enmo'] * df['light']\n    \n    features = []\n    # ------------------------------- night activity -------------------------------\n    # day: 0, night: 1\n    df['is_night'] = np.where((df['time_of_day_hours']>=8)&(df['time_of_day_hours']<21), 0, 1)\n    df['night_num'] = (df['is_night'].diff()==1).cumsum()\n    df['night_num'] = df['night_num'] * df['is_night']\n\n    df.loc[df.night_num>0, 'night_num'] = 1\n    des = df.groupby('night_num')[['enmo','light','enmoXlight']].agg(\n        {'enmo': ['mean','max','count'], 'light': ['mean','max'], 'enmoXlight': ['mean','max']}\n    ).reset_index()\n    des = des[des['night_num']>0].reset_index(drop=True)\n    des.columns = ['night_num','enmo_mean','enmo_max','num','light_mean','light_max','enmoXlight_mean','enmoXlight_max']\n    des = des[des['num']>500]\n    avg_des = list(des.drop(['night_num','num'], axis=1).mean(axis=0).values)\n    features.extend(avg_des)\n    #std_des = list(des.drop(['night_num','num'], axis=1).std(axis=0).values)\n    #features.extend(std_des)\n\n    # ------------------------------- weekend activity -------------------------------\n    df['is_weekend'] = np.where(df['weekday'] >= 5.5, 1, 0)\n    df['weekend_num'] = (df['is_weekend'].diff()==1).cumsum()\n    df['weekend_num'] = df['weekend_num'] * df['is_weekend']\n    \n    df.loc[df.night_num>0, 'weekend_num'] = 1\n    des = df.groupby('weekend_num')[['enmo','light','enmoXlight']].agg(\n        {'enmo': ['mean','max','count'], 'light': ['mean','max'], 'enmoXlight': ['mean','max']}\n    ).reset_index()\n    des = des[des['weekend_num']>0].reset_index(drop=True)\n    des.columns = ['weekend_num','enmo_mean','enmo_max','num','light_mean','light_max','enmoXlight_mean','enmoXlight_max']\n    des = des[des['num']>2000]\n    avg_des = list(des.drop(['weekend_num','num'], axis=1).mean(axis=0).values)\n    features.extend(avg_des)\n    #std_des = list(des.drop(['weekend_num','num'], axis=1).std(axis=0).values)\n    #features.extend(std_des)\n\n    # ------------------------------- weekend night activity -------------------------------\n    df['is_weekend_night'] = np.where((df['weekday']>=5.5)&((df['time_of_day_hours']<8)|(df['time_of_day_hours']>=21)), 1, 0)\n    df['weekend_night_num'] = (df['is_weekend_night'].diff()==1).cumsum()\n    df['weekend_night_num'] = df['weekend_night_num'] * df['is_weekend_night']\n    \n    df.loc[df.night_num>0, 'weekend_num'] = 1\n    des = df.groupby('weekend_night_num')[['enmo','light','enmoXlight']].agg(\n        {'enmo': ['mean','max','count'], 'light': ['mean','max'], 'enmoXlight': ['mean','max']}\n    ).reset_index()\n    des = des[des['weekend_night_num']>0].reset_index(drop=True)\n    des.columns = ['weekend_night_num','enmo_mean','enmo_max','num','light_mean','light_max','enmoXlight_mean','enmoXlight_max']\n    des = des[des['num']>200]\n    avg_des = list(des.drop(['weekend_night_num','num'], axis=1).mean(axis=0).values)\n    features.extend(avg_des)\n    #std_des = list(des.drop(['weekend_night_num','num'], axis=1).std(axis=0).values)\n    #features.extend(std_des)\n    \n    # Define conditions for night, day, and no mask (full data)\n    #night = df['day_period'] == 1\n    #day = df['day_period'] == 0\n    #no_mask = np.ones(len(df), dtype=bool)\n    # List of columns of interest and masks\n    #keys = [\"enmo\", \"anglez\", \"light\", \"battery_voltage\"]\n    #masks = [no_mask, night, day]\n    # Helper function for feature extraction\n    def extract_stats(data):\n        return [\n            data.mean(), \n            data.std(), \n            data.max(), \n            data.min(), \n            data.diff().mean(), \n            data.diff().std()\n        ]\n    # Iterate over keys and masks to generate the statistics\n    #for key in keys:\n    #    for mask in masks:\n    #        filtered_data = df.loc[mask, key]\n    #        features.extend(extract_stats(filtered_data))\n\n    return features\n\nextra_feature_cols = [\n    'enmo_mean_night','enmo_max_night','light_mean_night','light_max_night','enmoXlight_mean_night','enmoXlight_max_night',\n    'enmo_mean_wk','enmo_max_wk','light_mean_wk','light_max_wk','enmoXlight_mean_wk','enmoXlight_max_wk',\n    'enmo_mean_wknight','enmo_max_wknight','light_mean_wknight','light_max_wknight','enmoXlight_mean_wknight','enmoXlight_max_wknight',\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 time_features(df), filename.split('=')[1]\n\n\ndef load_time_series(dirname):\n    ids = os.listdir(dirname)\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=extra_feature_cols)\n    df['id'] = indexes\n    \n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.232071Z","iopub.execute_input":"2024-12-16T09:16:00.232346Z","iopub.status.idle":"2024-12-16T09:16:00.252459Z","shell.execute_reply.started":"2024-12-16T09:16:00.232319Z","shell.execute_reply":"2024-12-16T09:16:00.251293Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nif use_time_faetures:\n\n    train_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\n    test_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\n    \n    train_label = pd.merge(train_label, train_ts, how=\"left\", on='id')\n    test_df = pd.merge(test_df, test_ts, how=\"left\", on='id')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.253703Z","iopub.execute_input":"2024-12-16T09:16:00.254110Z","iopub.status.idle":"2024-12-16T09:16:00.268126Z","shell.execute_reply.started":"2024-12-16T09:16:00.254064Z","shell.execute_reply":"2024-12-16T09:16:00.267073Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Training","metadata":{}},{"cell_type":"code","source":"folds = 5\ngroups = train_label['Age_Group'].astype(str) + '-' + train_label['sii'].astype(str)\n\nseeds = [42, 1993, 927, 315, 167]\nfor seed in seeds:\n    train_label[f'kfold_{seed}'] = -1\n    skf = StratifiedKFold(n_splits=folds, shuffle=True, random_state=seed)\n    for fold, (train_idx, val_idx) in enumerate(skf.split(X=train_label, y=groups)):\n        train_label.loc[val_idx, f'kfold_{seed}'] = fold","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.269392Z","iopub.execute_input":"2024-12-16T09:16:00.269787Z","iopub.status.idle":"2024-12-16T09:16:00.338856Z","shell.execute_reply.started":"2024-12-16T09:16:00.269731Z","shell.execute_reply":"2024-12-16T09:16:00.337528Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train_label.copy()\nlen_ = len(train)\n\n# ,'Age_Group'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.340618Z","iopub.execute_input":"2024-12-16T09:16:00.341167Z","iopub.status.idle":"2024-12-16T09:16:00.355810Z","shell.execute_reply.started":"2024-12-16T09:16:00.341107Z","shell.execute_reply":"2024-12-16T09:16:00.353631Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"drop_cols = [\n    'id','sii','PAQ_A-PAQ_A_Total','PAQ_C-PAQ_C_Total','kfold','weight',\n    'Fitness_Endurance-Time_Mins','Fitness_Endurance-Time_Sec',\n    'FGC-FGC_GSND_Zone','FGC-FGC_SRR_Zone','FGC-FGC_PU_Zone',\n    'kfold_42', 'kfold_1993', 'kfold_927', 'kfold_315', 'kfold_167',\n    'Fitness_Endurance-Max_Stage'\n] + season_cols + extra_feature_cols\n\nextra = ['enmo_mean_wk','enmo_max_wk','light_mean_wk','light_max_wk','enmoXlight_mean_wk','enmoXlight_max_wk']\nFEATURES = [f for f in train.columns if f not in drop_cols and 'PCIAT' not in f]\nif use_time_faetures:\n    FEATURES += extra\n\nfeature_null_dict = (train_label[FEATURES].isnull().sum() / len(train_label)).to_dict()\n(train_label[FEATURES].isnull().sum() / len(train_label)).sort_values(ascending=False).head(50)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.357378Z","iopub.execute_input":"2024-12-16T09:16:00.357890Z","iopub.status.idle":"2024-12-16T09:16:00.394402Z","shell.execute_reply.started":"2024-12-16T09:16:00.357838Z","shell.execute_reply":"2024-12-16T09:16:00.392568Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train.loc[train.Age_Group==1, 'PAQ_C-PAQ_C_Total'].isnull().sum() / len(train[train.Age_Group==1])\n#cond = (train['PAQ_A-PAQ_A_Total'].notnull())&(train['PAQ_C-PAQ_C_Total'].notnull())\n#train[cond]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.396038Z","iopub.execute_input":"2024-12-16T09:16:00.396533Z","iopub.status.idle":"2024-12-16T09:16:00.403895Z","shell.execute_reply.started":"2024-12-16T09:16:00.396484Z","shell.execute_reply":"2024-12-16T09:16:00.402643Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def weight_mapping(x):\n    if x == 0:\n        return 1\n    elif x == 1:\n        return 1.2\n    elif x == 2:\n        return 1.5\n    else:\n        return 1.8\n\ntrain['train_weight'] = train['sii'].map(weight_mapping)\nOOF = train[['id', 'kfold_42', 'kfold_1993', 'kfold_927', 'kfold_315', 'kfold_167', 'PCIAT-PCIAT_Total', 'sii']].copy()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.406157Z","iopub.execute_input":"2024-12-16T09:16:00.407973Z","iopub.status.idle":"2024-12-16T09:16:00.423572Z","shell.execute_reply.started":"2024-12-16T09:16:00.407891Z","shell.execute_reply":"2024-12-16T09:16:00.422468Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU','FGC-FGC_CU','SDS_Activity'\nxgb_list = [\n    'SDS-SDS_Total_Raw','SDS_InternetHours','Basic_Demos-Age',\n    'Basic_Demos-Sex','CGAS-CGAS_Score','Internet_Hours_Age','PreInt_Systolic_BP',\n    'Physical-Weight','SDS-SDS_Total_T','PAQ_Total','PreInt_EduHx-computerinternet_hoursday',\n    'Physical-Height_Age','FGC-FGC_SRR','FGC-FGC_SRL','Physical-Height',\n    'BIA-BIA_SMM','Physical-HeartRate','BMI_Age','Age_Systolic_BP','FGC-FGC_GSD',\n    'CGAS_SDS','light_max_wk','light_mean_wk','BIA-BIA_BMC','SDS_BMI','Season_nunique',\n    'BIA-BIA_DEE','enmo_mean_wk','Fitness_Endurance_Time','Physical-Diastolic_BP',\n    'BIA-BIA_LDM','enmoXlight_mean_wk','Activity_CU_PU','FGC_CU_PU_Age','FGC_CU_PU',\n    'FGC-FGC_TL','enmoXlight_max_wk','Physical-Systolic_BP','FGC-FGC_GSND','Physical-BMI',\n    'BIA-BIA_FMI','BIA-BIA_FFMI','BIA-BIA_ICW','BIA-BIA_ECW','FGC-FGC_CU_Zone',\n    'CGAS_CU_PU','BIA-BIA_TBW','BMI_Systolic_BP','enmo_max_wk','FGC-FGC_SRL_Zone','BIA-BIA_Fat',\n    'FGC-FGC_TL_Zone','BIA-BIA_LST','BIA-BIA_BMI','FGC-FGC_PU','PAQ_A_Activity',\n    'BIA-BIA_FFM','FGC-FGC_GSD_Zone','BIA-BIA_Activity_Level_num','BIA-BIA_BMR',\n    'BIA-BIA_Frame_num','Age_Group'\n]\nFEATURES = xgb_list[:10]\n\nparams = dict(\n    tree_method=\"hist\",\n    max_depth=2,\n    colsample_bytree=0.5,\n    subsample=0.8,\n    n_estimators=120,\n    learning_rate=0.05,\n    objective='reg:squarederror',\n    enable_categorical=False,\n    min_child_weight=50\n)\noof_xgb, feature_importances_xgb = training_and_inference('xgb', FEATURES, params, 'PCIAT-PCIAT_Total', 'xgb')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:00.425041Z","iopub.execute_input":"2024-12-16T09:16:00.425417Z","iopub.status.idle":"2024-12-16T09:16:23.183132Z","shell.execute_reply.started":"2024-12-16T09:16:00.425383Z","shell.execute_reply":"2024-12-16T09:16:23.181845Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU','FGC-FGC_CU','SDS_Activity','BIA-BIA_FFMI','BIA-BIA_SMM', 'FGC-FGC_GSND'\n# 'FGC-FGC_SRR','Physical-Waist_Circumference',\nlgb_list = [\n    'SDS-SDS_Total_Raw', 'SDS_InternetHours',\n    'SDS-SDS_Total_T', 'Age_Systolic_BP', 'PreInt_Systolic_BP',\n    'Basic_Demos-Sex', 'CGAS-CGAS_Score',\n    'Basic_Demos-Age', 'Physical-Weight','Internet_Hours_Age',\n    'Physical-HeartRate', 'Physical-Height_Age', 'PAQ_Total',\n    'PreInt_EduHx-computerinternet_hoursday','SDS_BMI',\n    'BMI_Age', 'Physical-Height', 'FGC-FGC_GSD', 'BIA-BIA_LDM',\n    'FGC-FGC_SRL', 'light_max_wk', 'enmo_mean_wk', 'CGAS_SDS',\n    'light_mean_wk', 'Physical-Systolic_BP', 'Physical-Diastolic_BP',\n    'FGC_CU_PU_Age', 'BIA-BIA_DEE', 'Physical-BMI', 'PAQ_A_Activity',\n    'FGC_CU_PU', 'BIA-BIA_Fat', 'Activity_CU_PU', 'BIA-BIA_BMC',\n    'Fitness_Endurance_Time', 'BMI_Systolic_BP', 'enmoXlight_mean_wk',\n    'enmo_max_wk', 'FGC-FGC_TL', 'Season_nunique', 'BIA-BIA_FMI',\n    'enmoXlight_max_wk', 'BIA-BIA_ECW', 'CGAS_CU_PU', 'BIA-BIA_TBW',\n    'BIA-BIA_ICW', 'FGC-FGC_SRL_Zone', 'BIA-BIA_BMR', 'BIA-BIA_LST',\n    'BIA-BIA_BMI', 'FGC-FGC_PU', 'BIA-BIA_FFM',\n    'Fitness_Endurance-Max_Stage', 'Age_Group',\n    'BIA-BIA_Activity_Level_num', 'FGC-FGC_CU_Zone',\n    'BIA-BIA_Frame_num', 'FGC-FGC_GSD_Zone', 'FGC-FGC_TL_Zone',\n    'FGC-FGC_PU_Zone'\n]\nFEATURES = lgb_list[:14]\nparams = dict(\n    max_depth=2,\n    boosting_type='gbdt',\n    colsample_bytree=0.5,\n    subsample=0.8,\n    n_estimators=150,\n    learning_rate=0.05,\n    objective='l2',\n    verbose=-1,\n    min_child_samples=30,\n)\noof_lgb, feature_importances_lgb = training_and_inference('lgb', FEATURES, params, 'PCIAT-PCIAT_Total', 'lgb')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:23.185048Z","iopub.execute_input":"2024-12-16T09:16:23.185514Z","iopub.status.idle":"2024-12-16T09:16:44.586277Z","shell.execute_reply.started":"2024-12-16T09:16:23.185463Z","shell.execute_reply":"2024-12-16T09:16:44.585221Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU','BIA-BIA_LDM','FGC-FGC_SRR','Physical-Waist_Circumference', 'FGC-FGC_CU'\n# 'BIA-BIA_DEE', 'BIA-BIA_FFMI','BIA-BIA_Fat','SDS_Activity', 'FGC_CU_PU_Age', 'BIA-BIA_SMM', 'BIA-BIA_FMI',\n# 'FGC-FGC_GSD', 'BIA-BIA_BMC', 'FGC-FGC_TL', 'enmoXlight_mean_wk','FGC-FGC_SRL', 'BIA-BIA_ECW','BIA-BIA_ICW',\n# 'SDS_BMI',\nxpo_list = [\n    'SDS-SDS_Total_Raw', 'SDS_InternetHours',\n    'Basic_Demos-Age', 'Physical-Height', 'Basic_Demos-Sex',\n    'Physical-Weight', 'Internet_Hours_Age', 'PreInt_Systolic_BP',\n    'CGAS-CGAS_Score', 'SDS-SDS_Total_T', 'Age_Systolic_BP',\n    'Physical-Height_Age',\n    'PreInt_EduHx-computerinternet_hoursday',\n    'Physical-HeartRate', 'Physical-Systolic_BP',\n    'Physical-BMI', 'CGAS_SDS', 'light_max_wk', 'enmo_mean_wk',\n    'PAQ_Total','BMI_Age','Physical-Diastolic_BP',\n    'Fitness_Endurance_Time', 'FGC_CU_PU', 'FGC-FGC_PU',\n    'Activity_CU_PU', 'enmo_max_wk','light_mean_wk',\n    'FGC-FGC_GSND', 'BMI_Systolic_BP', 'enmoXlight_max_wk',\n    'PAQ_A_Activity', 'CGAS_CU_PU', 'BIA-BIA_BMI', 'BIA-BIA_TBW',\n    'Season_nunique', 'Fitness_Endurance-Max_Stage', 'BIA-BIA_LST',\n    'BIA-BIA_BMR', 'BIA-BIA_FFM', 'FGC-FGC_SRL_Zone',\n    'BIA-BIA_Activity_Level_num', 'BIA-BIA_Frame_num',\n    'FGC-FGC_TL_Zone', 'FGC-FGC_PU_Zone', 'FGC-FGC_CU_Zone',\n    'FGC-FGC_GSD_Zone'\n]\nFEATURES = [f for f in xpo_list[:16] if f not in ['Physical-Waist_Circumference']]\n\n\nparams = dict(\n    max_depth=2,\n    colsample_bytree=0.8,\n    subsample=0.8,\n    n_estimators=160,\n    learning_rate=0.05,\n    objective='count:poisson',\n    enable_categorical=False,\n    min_child_weight=50\n)\noof_xpo, feature_importances_xpo = training_and_inference('xgb', FEATURES, params, 'sii', 'xpo')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:16:44.587715Z","iopub.execute_input":"2024-12-16T09:16:44.588146Z","iopub.status.idle":"2024-12-16T09:17:08.260797Z","shell.execute_reply.started":"2024-12-16T09:16:44.588100Z","shell.execute_reply":"2024-12-16T09:17:08.259857Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU', 'Physical-Waist_Circumference','FGC-FGC_SRL', 'BMI_Age'\n# 'FGC-FGC_CU','FGC-FGC_GSD', 'BIA-BIA_DEE', 'BIA-BIA_SMM', 'BIA-BIA_ECW',\nxql_list = [\n    'SDS-SDS_Total_Raw', 'Basic_Demos-Sex', 'SDS_InternetHours',\n    'Basic_Demos-Age', 'PreInt_Systolic_BP',\n    'Internet_Hours_Age',\n    'Physical-Height_Age', 'PAQ_Total', 'SDS-SDS_Total_T',\n    'CGAS-CGAS_Score', 'Physical-Weight', 'Physical-Height',\n    'Age_Systolic_BP', 'enmoXlight_mean_wk',\n    'PreInt_EduHx-computerinternet_hoursday', 'Season_nunique',\n    'Physical-Systolic_BP', 'CGAS_SDS', 'light_mean_wk',\n    'SDS_BMI', 'Physical-HeartRate', 'BIA-BIA_BMC', 'light_max_wk',\n    'BIA-BIA_FFMI', 'Activity_CU_PU', 'Physical-BMI', 'SDS_Activity',\n    'enmo_mean_wk', 'FGC-FGC_SRR', 'Fitness_Endurance_Time',\n    'BIA-BIA_LDM', 'BIA-BIA_ICW', 'BMI_Systolic_BP',\n    'Physical-Diastolic_BP', 'enmoXlight_max_wk', 'FGC_CU_PU_Age',\n    'FGC-FGC_GSND', 'BIA-BIA_TBW', 'BIA-BIA_Frame_num', 'BIA-BIA_FMI',\n    'enmo_max_wk', 'BIA-BIA_LST', 'BIA-BIA_BMR', 'CGAS_CU_PU',\n    'BIA-BIA_Fat', 'BIA-BIA_BMI', 'Fitness_Endurance-Max_Stage',\n    'PAQ_A_Activity', 'FGC-FGC_TL', 'BIA-BIA_FFM', 'FGC_CU_PU',\n    'FGC-FGC_GSD_Zone', 'FGC-FGC_PU', 'FGC-FGC_SRL_Zone',\n    'FGC-FGC_CU_Zone', 'BIA-BIA_Activity_Level_num', 'FGC-FGC_TL_Zone',\n    'Age_Group', 'FGC-FGC_PU_Zone'\n]\nFEATURES = xql_list[:5]\n\nparams = dict(\n    tree_method=\"hist\",\n    max_depth=2,\n    colsample_bytree=0.8,\n    subsample=0.8,\n    n_estimators=140,\n    learning_rate=0.05,\n    objective='reg:quantileerror',\n    quantile_alpha=0.55,\n    enable_categorical=False,\n    min_child_weight=50\n)\noof_xql, feature_importances_xql = training_and_inference('xgb', FEATURES, params, 'PCIAT-PCIAT_Total', 'xql')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:17:08.262521Z","iopub.execute_input":"2024-12-16T09:17:08.262944Z","iopub.status.idle":"2024-12-16T09:17:31.518402Z","shell.execute_reply.started":"2024-12-16T09:17:08.262877Z","shell.execute_reply":"2024-12-16T09:17:31.517330Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU','BIA-BIA_LDM','SDS_BMI','Physical-Waist_Circumference',\n# 'FGC-FGC_SRR','FGC-FGC_CU','BIA-BIA_DEE', 'FGC-FGC_TL', \n# 'BIA-BIA_SMM', 'BIA-BIA_BMC','BIA-BIA_FFMI', 'SDS_Activity','BIA-BIA_TBW', 'FGC_CU_PU_Age',\nxtw_list = [\n    'SDS-SDS_Total_Raw', 'Physical-Height_Age', 'SDS_InternetHours',\n    'Physical-Weight', 'CGAS-CGAS_Score', 'Basic_Demos-Sex',\n    'Physical-Height', 'Physical-BMI',\n    'Physical-HeartRate', 'PreInt_Systolic_BP', 'Internet_Hours_Age',\n    'Age_Systolic_BP', 'PreInt_EduHx-computerinternet_hoursday',\n    'CGAS_SDS', 'SDS-SDS_Total_T', 'Physical-Systolic_BP',\n    'light_max_wk', 'BMI_Age', 'enmo_mean_wk', 'PAQ_Total',\n    'Physical-Diastolic_BP','Fitness_Endurance_Time',\n    'FGC-FGC_SRL', 'BMI_Systolic_BP', 'BIA-BIA_FMI', 'BIA-BIA_ECW',\n    'BIA-BIA_ICW', 'BIA-BIA_Fat', 'Activity_CU_PU',\n    'enmoXlight_mean_wk', 'CGAS_CU_PU', 'BIA-BIA_LST', 'FGC-FGC_GSD',\n    'BIA-BIA_BMI', 'FGC-FGC_PU', 'enmoXlight_max_wk', 'FGC_CU_PU',\n    'light_mean_wk', 'BIA-BIA_BMR', 'Fitness_Endurance-Max_Stage',\n    'FGC-FGC_GSND', 'Age_Group', 'enmo_max_wk', 'Season_nunique',\n    'PAQ_A_Activity', 'FGC-FGC_SRL_Zone', 'BIA-BIA_Activity_Level_num',\n    'BIA-BIA_FFM', 'BIA-BIA_Frame_num', 'FGC-FGC_PU_Zone',\n    'FGC-FGC_CU_Zone', 'FGC-FGC_TL_Zone', 'FGC-FGC_GSD_Zone'\n]\nFEATURES = xtw_list[:6]\n\nparams = dict(\n    tree_method=\"hist\",\n    max_depth=2,\n    colsample_bytree=0.8,\n    subsample=0.8,\n    n_estimators=100,\n    learning_rate=0.05,\n    objective='reg:tweedie',\n    tweedie_variance_power=1.5,\n    enable_categorical=False,\n    min_child_weight=50\n)\noof_xtw, feature_importances_xtw = training_and_inference('xgb', FEATURES, params, 'sii', 'xtw')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:17:31.519691Z","iopub.execute_input":"2024-12-16T09:17:31.520046Z","iopub.status.idle":"2024-12-16T09:17:52.755761Z","shell.execute_reply.started":"2024-12-16T09:17:31.520013Z","shell.execute_reply":"2024-12-16T09:17:52.754827Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU','BIA-BIA_Fat','FGC-FGC_SRR','BIA-BIA_LDM','FGC-FGC_SRL', 'BIA-BIA_SMM',\n# 'Physical-Waist_Circumference','SDS_BMI', 'FGC-FGC_CU','BIA-BIA_FMI','Fitness_Endurance_Time'\n# 'BIA-BIA_DEE', 'BIA-BIA_BMC', 'FGC-FGC_GSD', 'FGC-FGC_TL', 'FGC-FGC_GSND', 'SDS_Activity',\nltw_list = [\n    'SDS-SDS_Total_Raw', 'Age_Systolic_BP',\n    'CGAS-CGAS_Score', 'SDS_InternetHours', 'Basic_Demos-Sex',\n    'Physical-Height_Age', 'PreInt_Systolic_BP', 'Physical-Weight',\n    'Physical-Height', 'Physical-HeartRate',\n    'Internet_Hours_Age', 'PAQ_Total',\n    'Physical-Systolic_BP', 'Physical-BMI',\n    'CGAS_SDS', 'Fitness_Endurance_Time',\n    'PreInt_EduHx-computerinternet_hoursday',\n    'BIA-BIA_FFMI', 'BMI_Age', 'SDS-SDS_Total_T','BMI_Systolic_BP',\n    'Physical-Diastolic_BP', 'Activity_CU_PU',\n    'CGAS_CU_PU', 'FGC-FGC_PU', 'Age_Group',\n    'BIA-BIA_ECW', 'FGC_CU_PU_Age', 'BIA-BIA_TBW', 'Season_nunique',\n    'BIA-BIA_BMI', 'FGC_CU_PU', 'BIA-BIA_LST', 'BIA-BIA_ICW',\n    'PAQ_A_Activity', 'Fitness_Endurance-Max_Stage', 'BIA-BIA_BMR',\n    'FGC-FGC_SRL_Zone', 'BIA-BIA_FFM', 'BIA-BIA_Activity_Level_num',\n    'BIA-BIA_Frame_num', 'FGC-FGC_TL_Zone', 'FGC-FGC_GSD_Zone',\n    'FGC-FGC_CU_Zone', 'FGC-FGC_PU_Zone'\n]\nFEATURES = ltw_list[:10]\n\nparams = dict(\n    max_depth=2,\n    boosting_type='gbdt',\n    colsample_bytree=0.5,\n    subsample=0.8,\n    n_estimators=110,\n    learning_rate=0.05,\n    objective='tweedie',\n    tweedie_variance_power=1.5,\n    verbose=-1,\n    min_child_samples=50\n)\noof_ltw, feature_importances_ltw = training_and_inference('lgb', FEATURES, params, 'sii', 'ltw')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:17:52.757655Z","iopub.execute_input":"2024-12-16T09:17:52.758086Z","iopub.status.idle":"2024-12-16T09:18:13.141717Z","shell.execute_reply.started":"2024-12-16T09:17:52.758041Z","shell.execute_reply":"2024-12-16T09:18:13.140743Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU', 'SDS_BMI','FGC-FGC_SRR','BIA-BIA_LDM', 'BIA-BIA_Fat', \n# 'FGC-FGC_CU', 'BIA-BIA_FMI', 'BIA-BIA_FFMI', 'FGC_CU_PU_Age', 'SDS_Activity', 'BIA-BIA_DEE',\n# 'FGC-FGC_GSND', 'FGC_CU_PU', 'FGC-FGC_SRL', 'FGC-FGC_PU','FGC-FGC_TL', \nlpo_list = [\n    'SDS-SDS_Total_Raw', 'SDS-SDS_Total_T',\n    'SDS_InternetHours', 'Basic_Demos-Sex', 'Basic_Demos-Age',\n    'CGAS-CGAS_Score', 'Age_Systolic_BP', 'Physical-Weight',\n    'Physical-Height', 'Internet_Hours_Age', 'PreInt_Systolic_BP',\n    'PreInt_EduHx-computerinternet_hoursday', \n    'Physical-Height_Age','Physical-HeartRate','CGAS_SDS',\n    'PAQ_Total', 'Physical-BMI',\n    'Fitness_Endurance_Time', 'Physical-Systolic_BP',\n    'BMI_Age', 'FGC-FGC_GSD', 'BMI_Systolic_BP',\n    'Physical-Diastolic_BP', 'Season_nunique',\n    'BIA-BIA_BMI', 'CGAS_CU_PU', 'BIA-BIA_ICW', 'BIA-BIA_ECW',\n    'BIA-BIA_BMR', 'BIA-BIA_TBW', 'PAQ_A_Activity', 'BIA-BIA_LST',\n    'BIA-BIA_FFM', 'FGC-FGC_SRL_Zone', 'BIA-BIA_Frame_num',\n    'Age_Group', 'FGC-FGC_TL_Zone', 'BIA-BIA_Activity_Level_num',\n    'FGC-FGC_CU_Zone', 'FGC-FGC_GSD_Zone'\n]\nFEATURES = lpo_list[:13]\n\nparams = dict(\n    max_depth=2,\n    boosting_type='gbdt',\n    colsample_bytree=0.3,\n    subsample=0.8,\n    n_estimators=220,\n    learning_rate=0.05,\n    objective='poisson',\n    verbose=-1,\n    min_child_samples=50\n)\noof_lpo, feature_importances_lpo = training_and_inference('lgb', FEATURES, params, 'sii', 'lpo')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:18:13.142938Z","iopub.execute_input":"2024-12-16T09:18:13.143242Z","iopub.status.idle":"2024-12-16T09:18:33.861810Z","shell.execute_reply.started":"2024-12-16T09:18:13.143211Z","shell.execute_reply":"2024-12-16T09:18:33.860779Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU', 'BIA-BIA_FFMI', 'BIA-BIA_SMM', 'SDS_BMI', 'FGC-FGC_SRR','FGC-FGC_CU',\n# 'BIA-BIA_BMC', 'BIA-BIA_DEE', 'BIA-BIA_FMI', 'FGC-FGC_GSD', 'FGC-FGC_SRL', 'FGC-FGC_GSND',\n# 'BIA-BIA_Fat', 'BIA-BIA_TBW', 'BIA-BIA_ECW', 'BIA-BIA_BMR', 'BIA-BIA_ICW', 'Activity_CU_PU', 'FGC_CU_PU_Age',\n# 'FGC_CU_PU', 'BIA-BIA_LST', 'FGC-FGC_TL', 'BIA-BIA_BMI', 'BIA-BIA_FFM', 'SDS_Activity',\nlql_list = [\n    'SDS-SDS_Total_Raw', 'SDS-SDS_Total_T', 'Basic_Demos-Sex',\n    'CGAS-CGAS_Score', 'PAQ_Total', 'Age_Systolic_BP',\n    'SDS_InternetHours','PreInt_Systolic_BP', 'Internet_Hours_Age', 'Physical-Height_Age',\n    'Physical-Height', 'Physical-HeartRate', 'Basic_Demos-Age', 'Physical-Weight', \n    'CGAS_SDS', 'PAQ_Activity', 'BMI_Age',\n    'Fitness_Endurance_Time', 'Physical-Systolic_BP', 'Physical-Diastolic_BP', \n    'Physical-BMI', 'Season_nunique', 'PreInt_EduHx-computerinternet_hoursday',\n    #'FGC-FGC_PU', 'BIA-BIA_Frame_num', 'FGC-FGC_SRL_Zone','CGAS_CU_PU',\n    #'FGC-FGC_CU_Zone', 'BIA-BIA_Activity_Level_num', 'BMI_Systolic_BP', \n    #'FGC-FGC_GSD_Zone', 'FGC-FGC_TL_Zone', 'FGC-FGC_PU_Zone'\n]\nFEATURES = lql_list[:12]\n\nparams = dict(\n    max_depth=2,\n    boosting_type='gbdt',\n    colsample_bytree=0.5,\n    subsample=0.8,\n    n_estimators=120,\n    learning_rate=0.05,\n    objective='quantile',\n    alpha=0.60,\n    verbose=-1,\n    min_child_samples=50\n)\noof_lql, feature_importances_lql = training_and_inference('lgb', FEATURES, params, 'PCIAT-PCIAT_Total', 'lql')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:18:33.862850Z","iopub.execute_input":"2024-12-16T09:18:33.863174Z","iopub.status.idle":"2024-12-16T09:18:55.664062Z","shell.execute_reply.started":"2024-12-16T09:18:33.863144Z","shell.execute_reply":"2024-12-16T09:18:55.662965Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\n# 'PreInt_FGC_CU_PU','FGC-FGC_SRR','BIA-BIA_LDM','BIA-BIA_Fat','FGC-FGC_CU', \n# 'BIA-BIA_FMI', 'BIA-BIA_FFMI', 'FGC_CU_PU_Age', 'SDS_Activity', 'BIA-BIA_DEE',\n# 'BIA-BIA_SMM', 'BIA-BIA_BMC', 'FGC-FGC_GSD', 'FGC-FGC_SRL','FGC-FGC_GSND', 'FGC_CU_PU',\n# 'BMI_Systolic_BP', 'FGC-FGC_TL', 'FGC-FGC_PU','Activity_CU_PU', \n# 'BIA-BIA_ICW', 'BIA-BIA_ECW', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_TBW', \ndartpo_list = [\n    'SDS-SDS_Total_Raw', 'SDS-SDS_Total_T',\n    'SDS_InternetHours', 'Basic_Demos-Sex', 'Basic_Demos-Age',\n    'CGAS-CGAS_Score', 'Age_Systolic_BP', 'Physical-Weight',\n    'Physical-Height', 'Internet_Hours_Age', 'PreInt_Systolic_BP',\n    'PreInt_EduHx-computerinternet_hoursday', 'SDS_BMI',\n    'Physical-Height_Age', 'Physical-HeartRate', 'CGAS_SDS',\n    'PAQ_Total', 'Physical-BMI', 'Fitness_Endurance_Time', 'Physical-Systolic_BP', \n    'BMI_Age', 'Physical-Diastolic_BP', 'Season_nunique',\n    'CGAS_CU_PU', 'PAQ_A_Activity', 'Age_Group', #'BIA-BIA_LST',\n    #'BIA-BIA_FFM', 'FGC-FGC_SRL_Zone', 'BIA-BIA_Frame_num',\n    #'FGC-FGC_TL_Zone', 'BIA-BIA_Activity_Level_num',\n    #'FGC-FGC_CU_Zone', 'FGC-FGC_GSD_Zone'\n]\nFEATURES = dartpo_list[:8]\n\nparams = dict(\n    max_depth=2,\n    boosting_type='dart',\n    colsample_bytree=0.5,\n    subsample=0.8,\n    n_estimators=500,\n    learning_rate=0.1,\n    objective='poisson',\n    verbose=-1,\n    min_child_samples=50\n)\noof_dartpo, feature_importances_dartpo = training_and_inference('lgb', FEATURES, params, 'sii', 'dartpo')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:18:55.665423Z","iopub.execute_input":"2024-12-16T09:18:55.665848Z","iopub.status.idle":"2024-12-16T09:19:40.886470Z","shell.execute_reply.started":"2024-12-16T09:18:55.665802Z","shell.execute_reply":"2024-12-16T09:19:40.885368Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nFEATURES = [\n    #'PreInt_FGC_CU_PU',\n    #'FGC-FGC_CU',\n    'Physical-Height',\n    'Physical-HeartRate',\n    'Internet_Hours_Age',\n    'PreInt_EduHx-computerinternet_hoursday',\n    #'BIA-BIA_Fat',\n    'CGAS_SDS',\n    'Physical-BMI',\n    'Physical-Height_Age',\n    'Basic_Demos-Sex',\n    'Basic_Demos-Age',\n    'SDS_InternetHours',\n    'BMI_Age',\n    #'BIA-BIA_FFMI',\n    'SDS-SDS_Total_Raw',\n    'PAQ_Total',\n    #'Physical-Waist_Circumference',\n    #'BIA-BIA_LDM',\n    'Physical-Systolic_BP',\n    'CGAS-CGAS_Score',\n    'PreInt_Systolic_BP',\n    'PAQ_Activity',\n    #'FGC-FGC_SRR',\n    'SDS-SDS_Total_T'\n]\n#FEATURES = list(set(xgb_list[:10] + lgb_list[:12] + ltw_list[:20] + lpo_list[:20] + lql_list[:35] + dartpo_list[:18]))\nFEATURES = xql_list[:8]\n\nparams = dict(\n    loss='quantile',\n    quantile=0.65,\n    learning_rate=0.05,\n    max_iter=100,\n    max_depth=2,\n    min_samples_leaf=50,\n    l2_regularization=0.2,\n)\n\noof_dt, _ = training_and_inference('dt', FEATURES, params, 'PCIAT-PCIAT_Total', 'dt')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:19:40.891888Z","iopub.execute_input":"2024-12-16T09:19:40.892193Z","iopub.status.idle":"2024-12-16T09:20:06.007230Z","shell.execute_reply.started":"2024-12-16T09:19:40.892164Z","shell.execute_reply":"2024-12-16T09:20:06.006117Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def majority_vote(row):\n\n    line_dict = row.to_dict()\n    finals = [0, 0, 0, 0]\n    for key, v in line_dict.items():\n        if key.split('_')[0] in ('xql','lql','dt'):\n            finals[v] += 5\n        else:\n            finals[v] += 1\n    answer = np.argmax(finals)\n\n    return answer\n\n# 'xgb','lgb','xtw',\noverall_score = []\nuse_model_list = ['xgb','lgb','xtw','dt','xql','xpo','ltw','lpo','lql','dartpo']\nfor seed in seeds:\n    use_columns = [f'{c}_{seed}' for c in use_model_list]\n    OOF[f'final_sii_{seed}'] = OOF[use_columns].apply(majority_vote, axis=1)\n    tKappa = quadratic_weighted_kappa(OOF['sii'], OOF[f'final_sii_{seed}'].astype(int))\n    print(f\"Using {len(use_model_list)} models ----> || Seed {seed} QWK: {Fore.CYAN}{Style.BRIGHT} {tKappa:.4f}{Style.RESET_ALL}\")\n    overall_score.append(tKappa)\n\nuse_columns = [f'{c}_{seed}' for c in use_model_list for seed in seeds]\nOOF['final_sii'] = OOF[use_columns].apply(majority_vote, axis=1)\naverage_tKappa = quadratic_weighted_kappa(OOF['sii'], OOF['final_sii'].astype(int))\nprint(f\" Overall QWK: {Fore.RED}{Style.BRIGHT} {np.mean(overall_score):.4f} ({average_tKappa:.4f}){Style.RESET_ALL}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:20:06.008697Z","iopub.execute_input":"2024-12-16T09:20:06.009134Z","iopub.status.idle":"2024-12-16T09:20:06.545510Z","shell.execute_reply.started":"2024-12-16T09:20:06.009088Z","shell.execute_reply":"2024-12-16T09:20:06.544520Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['final_sii'] = test_df[use_columns].apply(majority_vote, axis=1)\nsum_submission = test_df[['id', 'final_sii']].rename(columns={'final_sii': 'sii'})\nsum_submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:20:06.547252Z","iopub.execute_input":"2024-12-16T09:20:06.547665Z","iopub.status.idle":"2024-12-16T09:20:06.562534Z","shell.execute_reply.started":"2024-12-16T09:20:06.547619Z","shell.execute_reply":"2024-12-16T09:20:06.561461Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sum_submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T09:20:06.563894Z","iopub.execute_input":"2024-12-16T09:20:06.564334Z","iopub.status.idle":"2024-12-16T09:20:06.578050Z","shell.execute_reply.started":"2024-12-16T09:20:06.564289Z","shell.execute_reply":"2024-12-16T09:20:06.576983Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}