{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","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"}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# # Import Module\n# ! pip install pandas\n# ! pip install numpy\n# ! pip install scipy\n# ! pip install tqdm\n# ! pip install seaborn\n# ! pip install matplotlib\n# ! pip install scikit-learn\n# ! pip install xgboost\n# ! pip install imblearn\n# ! pip install pyarrow\n# ! pip install fastparquet\n# 基本工具包\nimport os\nimport re\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom concurrent.futures import ThreadPoolExecutor\nimport warnings\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Scipy\nfrom scipy import stats\nfrom scipy.optimize import minimize\n\n# Scikit-learn 工具包\nfrom sklearn.base import clone\nfrom sklearn.metrics import (\n    cohen_kappa_score,\n    accuracy_score,\n    classification_report,\n    confusion_matrix\n)\nfrom sklearn.model_selection import (\n    StratifiedKFold,\n    GridSearchCV,\n    train_test_split\n)\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.manifold import Isomap\nfrom sklearn.feature_selection import SelectKBest, mutual_info_classif\nfrom lightgbm import LGBMRegressor, LGBMClassifier\nfrom xgboost import XGBRegressor, XGBClassifier\nfrom catboost import CatBoostRegressor, CatBoostClassifier\nfrom sklearn.svm import SVC\n\n# 機器學習模型\nfrom sklearn.ensemble import (\n    VotingRegressor, \n    VotingClassifier,\n    RandomForestRegressor, \n    GradientBoostingRegressor, \n    RandomForestClassifier,\n    GradientBoostingClassifier\n)\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nimport xgboost as xgb\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.cluster import DBSCAN\n\n# 不平衡數據處理工具\nfrom imblearn.over_sampling import SMOTE, BorderlineSMOTE, ADASYN\nfrom imblearn.combine import SMOTEENN\n\n# PyTorch\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\n\n# 顏色輸出\nfrom colorama import Fore, Style\n\n# Jupyter Notebook 專用\nfrom IPython.display import clear_output\n\npath = '/kaggle/input/child-mind-institute-problematic-internet-use'\nSEED = 42\nn_splits = 5","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T21:56:53.449061Z","iopub.execute_input":"2024-12-12T21:56:53.449582Z","iopub.status.idle":"2024-12-12T21:56:53.459868Z","shell.execute_reply.started":"2024-12-12T21:56:53.449532Z","shell.execute_reply":"2024-12-12T21:56:53.458866Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load data\ntrain_df_path = f'{path}/train.csv'\ntrain_df = pd.read_csv(train_df_path)\ntest_df_path = f'{path}/test.csv'\ntest_df = pd.read_csv(test_df_path)\ntrain_parquet_path = f'{path}/series_train.parquet'\ntest_parquet_path = f'{path}/series_test.parquet'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T21:56:53.461545Z","iopub.execute_input":"2024-12-12T21:56:53.461873Z","iopub.status.idle":"2024-12-12T21:56:53.556625Z","shell.execute_reply.started":"2024-12-12T21:56:53.461841Z","shell.execute_reply":"2024-12-12T21:56:53.555753Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Preprocess Training Data\ndef Preprocess_Training_Data(train_df: pd.DataFrame) -> pd.DataFrame: \n    return_df = train_df.copy()\n\n    age_masks = {\n        '5-7': (return_df['Basic_Demos-Age'] >= 5) & (return_df['Basic_Demos-Age'] <= 7),\n        '8-10': (return_df['Basic_Demos-Age'] >= 8) & (return_df['Basic_Demos-Age'] <= 10),\n        '11-13': (return_df['Basic_Demos-Age'] >= 11) & (return_df['Basic_Demos-Age'] <= 13),\n        '14-17': (return_df['Basic_Demos-Age'] >= 14) & (return_df['Basic_Demos-Age'] <= 17),\n        '18-22': (return_df['Basic_Demos-Age'] >= 18) & (return_df['Basic_Demos-Age'] <= 22),\n    }\n\n    sex_masks = {\n        '1': return_df['Basic_Demos-Sex'] == 1,\n        '0': return_df['Basic_Demos-Sex'] == 0,\n    }\n\n    season_features = ['CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', 'SDS-Season']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for season_feature in season_features:\n                if return_df.loc[age_mask & sex_mask, season_feature].value_counts().empty:\n                    most_season = return_df[season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n                else:\n                    most_season = return_df.loc[age_mask & sex_mask, season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n    \n    # Physical Measures --------------------------------------------------------------------------------------------------- #\n    return_df['Physical-Diastolic_BP'] = return_df.groupby('Physical-Season')['Physical-Diastolic_BP'].transform(lambda x: (x - x.mean()))\n    return_df['Physical-Systolic_BP'] = return_df.groupby('Physical-Season')['Physical-Systolic_BP'].transform(lambda x: (x - x.mean()))\n    return_df['Physical-HeartRate'] = return_df.groupby('Physical-Season')['Physical-HeartRate'].transform(lambda x: (x - x.mean()))\n    physical_measures = ['Physical-BMI', 'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference', 'Physical-Diastolic_BP', 'Physical-Systolic_BP', 'Physical-HeartRate']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for physical_measure in physical_measures:\n                median = np.nan\n                if return_df.loc[age_mask & sex_mask, physical_measure].notna().any():\n                    median = return_df.loc[age_mask & sex_mask, physical_measure].median()\n                elif return_df.loc[sex_mask, physical_measure].notna().any():\n                    median = return_df.loc[sex_mask, physical_measure].median()\n                else:\n                    median = return_df[physical_measure].median()\n                return_df.loc[sex_mask & age_mask & return_df[physical_measure].isna(), physical_measure] = median\n\n    # Children's Global Assessment Scale ---------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['CGAS-CGAS_Score']>100)|(return_df['CGAS-CGAS_Score']<0), 'CGAS-CGAS_Score'] = pd.NA\n    return_df['CGAS-CGAS_Score'] = return_df.groupby('CGAS-Season')['CGAS-CGAS_Score'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            median = np.nan\n            if return_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = return_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].median()\n            elif return_df.loc[sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = return_df.loc[sex_mask, 'CGAS-CGAS_Score'].median()\n            else:\n                median = return_df['CGAS-CGAS_Score'].median()\n            return_df.loc[sex_mask & age_mask & return_df['CGAS-CGAS_Score'].isna(), 'CGAS-CGAS_Score'] = median\n    \n    # FitnessGram Vitals and Treadmill ------------------------------------------------------------------------------------ #\n    return_df['Fitness_Endurance-Max_Stage'] = return_df.groupby('Fitness_Endurance-Season')['Fitness_Endurance-Max_Stage'].transform(lambda x: (x - x.mean()))\n    return_df['Fitness_Endurance-Time_Sec'] = return_df.groupby('Fitness_Endurance-Season')['Fitness_Endurance-Time_Sec'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_max_stage = np.nan\n            if return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            elif return_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = return_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            else:\n                mean_max_stage = return_df['Fitness_Endurance-Max_Stage'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Max_Stage'].isna(), 'Fitness_Endurance-Max_Stage'] = mean_max_stage\n            mean_sec = np.nan\n            if return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            elif return_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = return_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            else:\n                mean_sec = return_df['Fitness_Endurance-Time_Sec'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Time_Sec'].isna(), 'Fitness_Endurance-Time_Sec'] = mean_sec\n\n    # FitnessGram Child --------------------------------------------------------------------------------------------------- #\n    return_df['FGC-FGC_CU'] = return_df.groupby('FGC-Season')['FGC-FGC_CU'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_PU'] = return_df.groupby('FGC-Season')['FGC-FGC_PU'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_SRL'] = return_df.groupby('FGC-Season')[ 'FGC-FGC_SRL'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_SRR'] = return_df.groupby('FGC-Season')['FGC-FGC_SRR'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_TL'] = return_df.groupby('FGC-Season')['FGC-FGC_TL'].transform(lambda x: (x - x.mean()))\n    two_categorical_fgc_features = ['FGC-FGC_CU', 'FGC-FGC_PU', 'FGC-FGC_SRL', 'FGC-FGC_SRR', 'FGC-FGC_TL']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items(): \n            for fgc_feature in two_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if return_df.loc[age_mask & sex_mask & (return_df[zone]==1), fgc_feature].notna().any():\n                    mean = return_df.loc[age_mask & sex_mask & (return_df[zone]==1), fgc_feature].mean()\n                else:\n                    mean = return_df.loc[return_df[zone]==1, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 1\n\n    return_df['FGC-FGC_GSND'] = return_df.groupby('FGC-Season')['FGC-FGC_GSND'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_GSD'] = return_df.groupby('FGC-Season')['FGC-FGC_GSD'].transform(lambda x: (x - x.mean()))\n    three_categorical_fgc_features = ['FGC-FGC_GSND', 'FGC-FGC_GSD']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for fgc_feature in three_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if return_df.loc[age_mask & sex_mask & (return_df[zone]==2), fgc_feature].notna().any():\n                    mean = return_df.loc[age_mask & sex_mask & (return_df[zone]==2), fgc_feature].mean()\n                else:\n                    mean = return_df.loc[return_df[zone]==2, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 2\n    \n    # Sleep Disturbance Scale --------------------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['SDS-SDS_Total_Raw']>100)|(return_df['SDS-SDS_Total_Raw']<0), 'SDS-SDS_Total_Raw'] = pd.NA\n    return_df['SDS-SDS_Total_Raw'] = return_df.groupby('SDS-Season')['SDS-SDS_Total_Raw'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_sds = np.nan\n            if return_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = return_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            elif return_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = return_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            else:\n                mean_sds = return_df['SDS-SDS_Total_Raw'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['SDS-SDS_Total_Raw'].isna(), 'SDS-SDS_Total_Raw'] = mean_sds\n    \n    # Bio-electric Impedance Analysis ------------------------------------------------------------------------------------- #\n    return_df['BIA-BIA_BMC'] = return_df.groupby('BIA-Season')['BIA-BIA_BMC'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_BMI'] = return_df.groupby('BIA-Season')['BIA-BIA_BMI'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_BMR'] = return_df.groupby('BIA-Season')['BIA-BIA_BMR'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_DEE'] = return_df.groupby('BIA-Season')['BIA-BIA_DEE'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_ECW'] = return_df.groupby('BIA-Season')['BIA-BIA_ECW'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_FFM'] = return_df.groupby('BIA-Season')['BIA-BIA_FFM'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_FFMI'] = return_df.groupby('BIA-Season')['BIA-BIA_FFMI'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_FMI'] = return_df.groupby('BIA-Season')['BIA-BIA_FMI'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_Fat'] = return_df.groupby('BIA-Season')['BIA-BIA_Fat'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_ICW'] = return_df.groupby('BIA-Season')['BIA-BIA_ICW'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_LDM'] = return_df.groupby('BIA-Season')['BIA-BIA_LDM'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_LST'] = return_df.groupby('BIA-Season')['BIA-BIA_LST'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_SMM'] = return_df.groupby('BIA-Season')['BIA-BIA_SMM'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_TBW'] = return_df.groupby('BIA-Season')['BIA-BIA_TBW'].transform(lambda x: (x - x.mean()))\n    numerical_bia_features = ['BIA-BIA_BMC', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n       'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM', 'BIA-BIA_TBW']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for bia_features in numerical_bia_features:\n                mean = np.nan\n                if return_df.loc[age_mask & sex_mask, bia_features].notna().any():\n                    mean = return_df.loc[age_mask & sex_mask, bia_features].mean()\n                elif return_df.loc[sex_mask, bia_features].notna().any():\n                    mean = return_df.loc[sex_mask, bia_features].mean()\n                else:\n                    mean = return_df[bia_features].mean()\n                return_df.loc[sex_mask & age_mask & return_df[bia_features].isna(), bia_features] = mean\n    return_df.loc[return_df['BIA-BIA_Activity_Level_num'].isna(), 'BIA-BIA_Activity_Level_num'] = 3\n    return_df.loc[return_df['BIA-BIA_Frame_num'].isna(), 'BIA-BIA_Frame_num'] = 2\n\n    # Physical Activity Questionnaire ------------------------------------------------------------------------------------- #\n    age_masks_PAQ = {\n        '5-13': (return_df['Basic_Demos-Age'] >= 5) & (return_df['Basic_Demos-Age'] <= 13),\n        '14-22': (return_df['Basic_Demos-Age'] >= 14) & (return_df['Basic_Demos-Age'] <= 22)\n    }\n    return_df['PAQ_Total'] = return_df['PAQ_A-PAQ_A_Total'].combine_first(return_df['PAQ_C-PAQ_C_Total'])\n    return_df['PAQ_Season'] = return_df['PAQ_A-Season'].combine_first(return_df['PAQ_C-Season'])\n    return_df['PAQ_Total'] = return_df.groupby('PAQ_Season')['PAQ_Total'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks_PAQ.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_paq = return_df.loc[age_mask & sex_mask, 'PAQ_Total'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Total'].isna(), 'PAQ_Total'] = mean_paq\n            most_paq_season = return_df.loc[age_mask & sex_mask, 'PAQ_Season'].value_counts().index[0]\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Season'].isna(), 'PAQ_Season'] = most_paq_season\n    \n    return_df.drop(['Basic_Demos-Enroll_Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-PAQ_C_Total', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-SDS_Total_T', 'Fitness_Endurance-Time_Mins', 'PreInt_EduHx-Season', 'PreInt_EduHx-computerinternet_hoursday'], axis=1, inplace=True)\n    return_df.drop(['PCIAT-PCIAT_01', 'PCIAT-PCIAT_02', 'PCIAT-PCIAT_03', 'PCIAT-PCIAT_04', 'PCIAT-PCIAT_05', 'PCIAT-PCIAT_06', 'PCIAT-PCIAT_07', 'PCIAT-PCIAT_08', 'PCIAT-PCIAT_09', 'PCIAT-PCIAT_10',\n       'PCIAT-PCIAT_11', 'PCIAT-PCIAT_12', 'PCIAT-PCIAT_13', 'PCIAT-PCIAT_14', 'PCIAT-PCIAT_15', 'PCIAT-PCIAT_16', 'PCIAT-PCIAT_17', 'PCIAT-PCIAT_18', 'PCIAT-PCIAT_19', 'PCIAT-PCIAT_20'], axis=1, inplace=True)\n    return_df.drop(['CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', 'SDS-Season', 'PAQ_Season'], axis=1, inplace=True)\n    \n    return return_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T21:56:53.690568Z","iopub.execute_input":"2024-12-12T21:56:53.690988Z","iopub.status.idle":"2024-12-12T21:56:53.737056Z","shell.execute_reply.started":"2024-12-12T21:56:53.690951Z","shell.execute_reply":"2024-12-12T21:56:53.735967Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def Preprocess_Training_Parquet(train_parquet_path) -> pd.DataFrame:\n    def Preprocess_Parquet(parquet: pd.DataFrame) -> pd.DataFrame:\n        data = parquet.copy()\n        data['timestamp'] = pd.to_datetime(data['relative_date_PCIAT'], unit='D') + pd.to_timedelta(data['time_of_day'])\n        # remenber the non-wear-flag \n        non_wear_flag = data['non-wear_flag'].sum()\n        total = len(data['non-wear_flag'])\n        \n        data = data[data['non-wear_flag'] == 0]\n        hour = pd.to_datetime(data['time_of_day']).dt.hour\n        time_masks = {\n            'morning': (hour >= 6) & (hour < 12),\n            'afternoon': (hour >= 12) & (hour < 17),\n            'evening': (hour >= 17) & (hour < 22),\n            'night': (hour >= 22) | (hour < 6)\n        }\n        \n        features = dict()\n        # season -----------------------------------------------------------------------------------------------#\n        features.update({\n            'actigraphy_season': data['quarter'].value_counts().index[0]\n        })\n        # weekend vs weekday -----------------------------------------------------------------------------------#\n        proportions = data['weekday'].isin([6, 7]).value_counts(normalize=True).to_dict()\n        features.update({\n            'weekend/weekday': proportions.get(True, 0)\n        })\n        # time base data ---------------------------------------------------------------------------------------#\n        for period, mask in time_masks.items():\n            features.update({\n                f'{period}_enmo_mean': data.loc[mask, 'enmo'].mean(),\n                f'{period}_enmo_std': data.loc[mask, 'enmo'].std(),\n                f'{period}_anglez_std': data.loc[mask, 'anglez'].std(),\n            })\n        # sleep quality ----------------------------------------------------------------------------------------#\n        sleep_hours = time_masks['night']\n        features.update({\n            'sleep_disruption_count': len(data.loc[sleep_hours & (data['enmo'] > data['enmo'].mean() + 2 * data['enmo'].std())]),\n            'light_exposure_during_sleep': data.loc[sleep_hours, 'light'].mean(),\n            'light_exposure_during_sleep_std': data.loc[sleep_hours, 'light'].std(),\n            'light_exposure_during_sleep_disruption': len(data.loc[sleep_hours & (data['light'] > data['light'].mean() + 2 * data['light'].std())]),\n            'sleep_position_changes': len(data.loc[sleep_hours & (abs(data['anglez'].diff()) > 60)]),\n            'good_sleep_cycle': int(data.loc[sleep_hours, 'light'].mean() < 50)\n        })\n        # non-wear metrices ------------------------------------------------------------------------------------#\n        features.update({\n            'wear_consistency': non_wear_flag / total,\n        })\n        # arm movement -----------------------------------------------------------------------------------------#\n        bins = [-90, -60, -30, 0, 30, 60, 90]\n        labels = ['anglez -90 to -60', 'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30', 'anglez 30 to 60', 'anglez 60 to 90']\n        interval_proportion_dict = pd.cut(data['anglez'], bins=bins, labels=labels, right=False).value_counts(normalize=True).sort_index().to_dict()\n        features.update(interval_proportion_dict)\n\n        return pd.DataFrame([features])\n    \n    ids = os.listdir(train_parquet_path)\n    data_frames = []\n    for file_id in tqdm(ids, desc=\"Preprocess Training Parquet\"):\n        result = Preprocess_Parquet(pd.read_parquet(os.path.join(train_parquet_path, file_id, 'part-0.parquet')))\n        result['id'] = file_id.split('=')[1]\n        data_frames.append(result)\n\n    return pd.concat(data_frames, ignore_index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T21:56:53.739219Z","iopub.execute_input":"2024-12-12T21:56:53.739854Z","iopub.status.idle":"2024-12-12T21:56:53.758548Z","shell.execute_reply.started":"2024-12-12T21:56:53.739801Z","shell.execute_reply":"2024-12-12T21:56:53.757341Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Merging data and qarquet\ndef Merging_Data_Parquet(data, parquet) -> pd.DataFrame:\n    merged_train_df = pd.merge(data, parquet, on='id', how='left')\n    merged_train_df['with_parquet'] = merged_train_df['actigraphy_season'].notna()\n    sex_masks = {\n        '1': merged_train_df['Basic_Demos-Sex'] == 1,\n        '0': merged_train_df['Basic_Demos-Sex'] == 0,\n    }\n\n    # --------------------------------------------------------------------------------------------------- #\n    time_zone_datas = ['morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std', 'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n                       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std', 'night_enmo_mean', 'night_enmo_std', 'night_anglez_std']\n    for sex_label, sex_mask in sex_masks.items():\n        for time_zone_data in time_zone_datas:\n            mean = np.nan\n            if merged_train_df.loc[sex_mask, time_zone_data].notna().any():\n                mean = merged_train_df.loc[sex_mask, time_zone_data].mean()\n            else:\n                mean = merged_train_df[time_zone_data].mean()\n            merged_train_df.loc[sex_mask & merged_train_df[time_zone_data].isna(), time_zone_data] = mean\n\n    # --------------------------------------------------------------------------------------------------- #\n    sleep_datas = ['sleep_disruption_count', 'light_exposure_during_sleep', 'light_exposure_during_sleep_std', \n                   'light_exposure_during_sleep_disruption', 'sleep_position_changes', 'good_sleep_cycle']\n    for sex_label, sex_mask in sex_masks.items():\n        for sleep_data in sleep_datas:\n            median = np.nan\n            if merged_train_df.loc[sex_mask, sleep_data].notna().any():\n                median = merged_train_df.loc[sex_mask, sleep_data].median()\n            else:\n                median = merged_train_df[sleep_data].median()\n            merged_train_df.loc[sex_mask & merged_train_df[sleep_data].isna(), sleep_data] = median\n\n    # --------------------------------------------------------------------------------------------------- #\n    angles_datas = ['anglez -90 to -60', 'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30', 'anglez 30 to 60', 'anglez 60 to 90']\n    for sex_label, sex_mask in sex_masks.items():\n        for angles_data in angles_datas:\n            mean = np.nan\n            if merged_train_df.loc[sex_mask, angles_data].notna().any():\n                mean = merged_train_df.loc[sex_mask, angles_data].mean()\n            else:\n                mean = merged_train_df[angles_data].mean()\n            merged_train_df.loc[sex_mask & merged_train_df[angles_data].isna(), angles_data] = mean\n\n    season_mapping = {'Spring': 1, 'Summer': 2, 'Fall': 3, 'Winter': 4}\n    merged_train_df['PCIAT-Season'] = merged_train_df['PCIAT-Season'].map(season_mapping)\n    \n    columns_to_exclude = ['PCIAT-Season', 'PCIAT-PCIAT_Total', 'sii']\n    merged_train_df.fillna({col: 0 for col in merged_train_df.columns if col not in columns_to_exclude}, inplace=True)\n    \n    return merged_train_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T21:56:53.760338Z","iopub.execute_input":"2024-12-12T21:56:53.760671Z","iopub.status.idle":"2024-12-12T21:56:53.776069Z","shell.execute_reply.started":"2024-12-12T21:56:53.760640Z","shell.execute_reply":"2024-12-12T21:56:53.775062Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Preprocessing\npost_train_data = Preprocess_Training_Data(train_df)\npost_train_parquet = Preprocess_Training_Parquet(train_parquet_path)\nmerged_train_df = Merging_Data_Parquet(post_train_data, post_train_parquet)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T21:56:53.778922Z","iopub.execute_input":"2024-12-12T21:56:53.779386Z","iopub.status.idle":"2024-12-12T22:00:49.034653Z","shell.execute_reply.started":"2024-12-12T21:56:53.779336Z","shell.execute_reply":"2024-12-12T22:00:49.032978Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"check_nan = merged_train_df[merged_train_df['with_parquet']==True].isna().sum()\ncheck_nan.sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:49.035712Z","iopub.execute_input":"2024-12-12T22:00:49.036038Z","iopub.status.idle":"2024-12-12T22:00:49.049064Z","shell.execute_reply.started":"2024-12-12T22:00:49.036006Z","shell.execute_reply":"2024-12-12T22:00:49.047831Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"post_train_data['sii'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:49.050513Z","iopub.execute_input":"2024-12-12T22:00:49.051005Z","iopub.status.idle":"2024-12-12T22:00:49.065467Z","shell.execute_reply.started":"2024-12-12T22:00:49.050954Z","shell.execute_reply":"2024-12-12T22:00:49.064360Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_train_df['sii'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:49.067118Z","iopub.execute_input":"2024-12-12T22:00:49.067462Z","iopub.status.idle":"2024-12-12T22:00:49.085551Z","shell.execute_reply.started":"2024-12-12T22:00:49.067430Z","shell.execute_reply":"2024-12-12T22:00:49.084238Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_train_df['PCIAT-Season'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:49.086902Z","iopub.execute_input":"2024-12-12T22:00:49.087430Z","iopub.status.idle":"2024-12-12T22:00:49.103372Z","shell.execute_reply.started":"2024-12-12T22:00:49.087381Z","shell.execute_reply":"2024-12-12T22:00:49.102104Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_train_df['PCIAT-PCIAT_Total'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:49.104953Z","iopub.execute_input":"2024-12-12T22:00:49.105387Z","iopub.status.idle":"2024-12-12T22:00:49.121082Z","shell.execute_reply.started":"2024-12-12T22:00:49.105353Z","shell.execute_reply":"2024-12-12T22:00:49.119866Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Preprocess Test Data\ndef Preprocess_Test_Data(train_df: pd.DataFrame, test_df: pd.DataFrame) -> pd.DataFrame:\n    total_df = pd.concat([train_df, test_df], ignore_index=True) # contain both \n    total_df.drop_duplicates(subset=['id'])\n    \n    return_df = test_df.copy()\n\n    age_masks = {\n        '5-7': (total_df['Basic_Demos-Age'] >= 5) & (total_df['Basic_Demos-Age'] <= 7),\n        '8-10': (total_df['Basic_Demos-Age'] >= 8) & (total_df['Basic_Demos-Age'] <= 10),\n        '11-13': (total_df['Basic_Demos-Age'] >= 11) & (total_df['Basic_Demos-Age'] <= 13),\n        '14-17': (total_df['Basic_Demos-Age'] >= 14) & (total_df['Basic_Demos-Age'] <= 17),\n        '18-22': (total_df['Basic_Demos-Age'] >= 18) & (total_df['Basic_Demos-Age'] <= 22),\n    }\n\n    sex_masks = {\n        '1': total_df['Basic_Demos-Sex'] == 1,\n        '0': total_df['Basic_Demos-Sex'] == 0,\n    }\n\n    season_features = ['CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', 'SDS-Season']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for season_feature in season_features:\n                if total_df.loc[age_mask & sex_mask, season_feature].value_counts().empty:\n                    most_season = total_df[season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n                else:\n                    most_season = total_df.loc[age_mask & sex_mask, season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n    \n    # Physical Measures --------------------------------------------------------------------------------------------------- #\n    physical_measures = ['Physical-BMI', 'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference', 'Physical-Diastolic_BP', 'Physical-Systolic_BP', 'Physical-HeartRate']\n    return_df['Physical-Diastolic_BP'] = total_df.groupby('Physical-Season')['Physical-Diastolic_BP'].transform(lambda x: (x - x.mean()))\n    return_df['Physical-Systolic_BP'] = total_df.groupby('Physical-Season')['Physical-Systolic_BP'].transform(lambda x: (x - x.mean()))\n    return_df['Physical-HeartRate'] = total_df.groupby('Physical-Season')['Physical-HeartRate'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for physical_measure in physical_measures:\n                median = np.nan\n                if total_df.loc[age_mask & sex_mask, physical_measure].notna().any():\n                    median = total_df.loc[age_mask & sex_mask, physical_measure].median()\n                elif total_df.loc[sex_mask, physical_measure].notna().any():\n                    median = total_df.loc[sex_mask, physical_measure].median()\n                else:\n                    median = total_df[physical_measure].median()\n                return_df.loc[sex_mask & age_mask & return_df[physical_measure].isna(), physical_measure] = median\n\n    # Children's Global Assessment Scale ---------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['CGAS-CGAS_Score']>100)|(return_df['CGAS-CGAS_Score']<0), 'CGAS-CGAS_Score'] = pd.NA\n    return_df['CGAS-CGAS_Score'] = total_df.groupby('CGAS-Season')['CGAS-CGAS_Score'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            median = np.nan\n            if total_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = total_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].median()\n            elif total_df.loc[sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = total_df.loc[sex_mask, 'CGAS-CGAS_Score'].median()\n            else:\n                median = total_df['CGAS-CGAS_Score'].median()\n            return_df.loc[sex_mask & age_mask & return_df['CGAS-CGAS_Score'].isna(), 'CGAS-CGAS_Score'] = median\n    \n    # FitnessGram Vitals and Treadmill ------------------------------------------------------------------------------------ #\n    return_df['Fitness_Endurance-Max_Stage'] = total_df.groupby('Fitness_Endurance-Season')['Fitness_Endurance-Max_Stage'].transform(lambda x: (x - x.mean()))\n    return_df['Fitness_Endurance-Time_Sec'] = total_df.groupby('Fitness_Endurance-Season')['Fitness_Endurance-Time_Sec'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_max_stage = np.nan\n            if total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            elif total_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = total_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            else:\n                mean_max_stage = total_df['Fitness_Endurance-Max_Stage'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Max_Stage'].isna(), 'Fitness_Endurance-Max_Stage'] = mean_max_stage\n            mean_sec = np.nan\n            if total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            elif total_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = total_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            else:\n                mean_sec = total_df['Fitness_Endurance-Time_Sec'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Time_Sec'].isna(), 'Fitness_Endurance-Time_Sec'] = mean_sec\n\n    # FitnessGram Child --------------------------------------------------------------------------------------------------- #\n    return_df['FGC-FGC_CU'] = total_df.groupby('FGC-Season')['FGC-FGC_CU'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_PU'] = total_df.groupby('FGC-Season')['FGC-FGC_PU'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_SRL'] = total_df.groupby('FGC-Season')[ 'FGC-FGC_SRL'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_SRR'] = total_df.groupby('FGC-Season')['FGC-FGC_SRR'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_TL'] = total_df.groupby('FGC-Season')['FGC-FGC_TL'].transform(lambda x: (x - x.mean()))\n    two_categorical_fgc_features = ['FGC-FGC_CU', 'FGC-FGC_PU', 'FGC-FGC_SRL', 'FGC-FGC_SRR', 'FGC-FGC_TL']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items(): \n            for fgc_feature in two_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if total_df.loc[age_mask & sex_mask & (total_df[zone]==1), fgc_feature].notna().any():\n                    mean = total_df.loc[age_mask & sex_mask & (total_df[zone]==1), fgc_feature].mean()\n                else:\n                    mean = total_df.loc[total_df[zone]==1, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 1\n\n    return_df['FGC-FGC_GSND'] = total_df.groupby('FGC-Season')['FGC-FGC_GSND'].transform(lambda x: (x - x.mean()))\n    return_df['FGC-FGC_GSD'] = total_df.groupby('FGC-Season')['FGC-FGC_GSD'].transform(lambda x: (x - x.mean()))\n    three_categorical_fgc_features = ['FGC-FGC_GSND', 'FGC-FGC_GSD']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for fgc_feature in three_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if total_df.loc[age_mask & sex_mask & (total_df[zone]==2), fgc_feature].notna().any():\n                    mean = total_df.loc[age_mask & sex_mask & (total_df[zone]==2), fgc_feature].mean()\n                else:\n                    mean = total_df.loc[total_df[zone]==2, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 2\n    \n    # Sleep Disturbance Scale --------------------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['SDS-SDS_Total_Raw']>100)|(return_df['SDS-SDS_Total_Raw']<0), 'SDS-SDS_Total_Raw'] = pd.NA\n    return_df['SDS-SDS_Total_Raw'] = total_df.groupby('SDS-Season')['SDS-SDS_Total_Raw'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_sds = np.nan\n            if total_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = total_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            elif total_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = total_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            else:\n                mean_sds = total_df['SDS-SDS_Total_Raw'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['SDS-SDS_Total_Raw'].isna(), 'SDS-SDS_Total_Raw'] = mean_sds\n    \n    # Bio-electric Impedance Analysis ------------------------------------------------------------------------------------- #\n    return_df['BIA-BIA_BMC'] = total_df.groupby('BIA-Season')['BIA-BIA_BMC'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_BMI'] = total_df.groupby('BIA-Season')['BIA-BIA_BMI'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_BMR'] = total_df.groupby('BIA-Season')['BIA-BIA_BMR'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_DEE'] = total_df.groupby('BIA-Season')['BIA-BIA_DEE'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_ECW'] = total_df.groupby('BIA-Season')['BIA-BIA_ECW'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_FFM'] = total_df.groupby('BIA-Season')['BIA-BIA_FFM'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_FFMI'] = total_df.groupby('BIA-Season')['BIA-BIA_FFMI'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_FMI'] = total_df.groupby('BIA-Season')['BIA-BIA_FMI'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_Fat'] = total_df.groupby('BIA-Season')['BIA-BIA_Fat'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_ICW'] = total_df.groupby('BIA-Season')['BIA-BIA_ICW'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_LDM'] = total_df.groupby('BIA-Season')['BIA-BIA_LDM'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_LST'] = total_df.groupby('BIA-Season')['BIA-BIA_LST'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_SMM'] = total_df.groupby('BIA-Season')['BIA-BIA_SMM'].transform(lambda x: (x - x.mean()))\n    return_df['BIA-BIA_TBW'] = total_df.groupby('BIA-Season')['BIA-BIA_TBW'].transform(lambda x: (x - x.mean()))\n    numerical_bia_features = ['BIA-BIA_BMC', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n       'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM', 'BIA-BIA_TBW']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for bia_features in numerical_bia_features:\n                mean = np.nan\n                if total_df.loc[age_mask & sex_mask, bia_features].notna().any():\n                    mean = total_df.loc[age_mask & sex_mask, bia_features].mean()\n                elif total_df.loc[sex_mask, bia_features].notna().any():\n                    mean = total_df.loc[sex_mask, bia_features].mean()\n                else:\n                    mean = total_df[bia_features].mean()\n                return_df.loc[sex_mask & age_mask & return_df[bia_features].isna(), bia_features] = mean\n    return_df.loc[return_df['BIA-BIA_Activity_Level_num'].isna(), 'BIA-BIA_Activity_Level_num'] = 3\n    return_df.loc[return_df['BIA-BIA_Frame_num'].isna(), 'BIA-BIA_Frame_num'] = 2\n\n    # Physical Activity Questionnaire ------------------------------------------------------------------------------------- #\n    age_masks_PAQ = {\n        '5-13': (total_df['Basic_Demos-Age'] >= 5) & (total_df['Basic_Demos-Age'] <= 13),\n        '14-22': (total_df['Basic_Demos-Age'] >= 14) & (total_df['Basic_Demos-Age'] <= 22)\n    }\n\n    total_df['PAQ_Total'] = total_df['PAQ_A-PAQ_A_Total'].combine_first(total_df['PAQ_C-PAQ_C_Total'])\n    total_df['PAQ_Season'] = total_df['PAQ_A-Season'].combine_first(total_df['PAQ_C-Season'])\n    return_df['PAQ_Total'] = return_df['PAQ_A-PAQ_A_Total'].combine_first(return_df['PAQ_C-PAQ_C_Total'])\n    return_df['PAQ_Season'] = return_df['PAQ_A-Season'].combine_first(return_df['PAQ_C-Season'])\n    return_df['PAQ_Total'] = total_df.groupby('PAQ_Season')['PAQ_Total'].transform(lambda x: (x - x.mean()))\n    for range_label, age_mask in age_masks_PAQ.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_paq = total_df.loc[age_mask & sex_mask, 'PAQ_Total'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Total'].isna(), 'PAQ_Total'] = mean_paq\n            most_paq_season = total_df.loc[age_mask & sex_mask, 'PAQ_Season'].value_counts().index[0]\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Season'].isna(), 'PAQ_Season'] = most_paq_season\n    \n    return_df.drop(['Basic_Demos-Enroll_Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-PAQ_C_Total', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-SDS_Total_T', 'Fitness_Endurance-Time_Mins', 'PreInt_EduHx-Season', 'PreInt_EduHx-computerinternet_hoursday'], axis=1, inplace=True)\n    return_df.drop(['CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', 'SDS-Season', 'PAQ_Season'], axis=1, inplace=True)\n\n    return return_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:49.125947Z","iopub.execute_input":"2024-12-12T22:00:49.126369Z","iopub.status.idle":"2024-12-12T22:00:49.173507Z","shell.execute_reply.started":"2024-12-12T22:00:49.126335Z","shell.execute_reply":"2024-12-12T22:00:49.172359Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"post_test_data = Preprocess_Test_Data(train_df, test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:49.174925Z","iopub.execute_input":"2024-12-12T22:00:49.175307Z","iopub.status.idle":"2024-12-12T22:00:50.711219Z","shell.execute_reply.started":"2024-12-12T22:00:49.175271Z","shell.execute_reply":"2024-12-12T22:00:50.710056Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Preprocess Test Parquet\n## Test data's parquet is same as train data.\npost_test_parquet = Preprocess_Training_Parquet(test_parquet_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:50.712662Z","iopub.execute_input":"2024-12-12T22:00:50.713024Z","iopub.status.idle":"2024-12-12T22:00:50.975090Z","shell.execute_reply.started":"2024-12-12T22:00:50.712989Z","shell.execute_reply":"2024-12-12T22:00:50.973740Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Merging test data and test qarquet\ndef Merging_Test_Data_Parquet(train_data, train_parquet, test_data, test_parquet) -> pd.DataFrame:\n    merged_train_df = pd.merge(train_data, train_parquet, on='id', how='left')\n    merged_test_df = pd.merge(test_data, test_parquet, on='id', how='left')\n    merged_train_df['with_parquet'] = merged_train_df['actigraphy_season'].notna()\n    merged_test_df['with_parquet'] = merged_test_df['actigraphy_season'].notna()\n    total_merged_df = pd.concat([merged_train_df, merged_test_df], ignore_index=True)\n    total_merged_df.drop_duplicates(subset=['id'])\n    \n    sex_masks = {\n        '1': total_merged_df['Basic_Demos-Sex'] == 1,\n        '0': total_merged_df['Basic_Demos-Sex'] == 0,\n    }\n\n    # --------------------------------------------------------------------------------------------------- #\n    time_zone_datas = ['morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std', 'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n                       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std', 'night_enmo_mean', 'night_enmo_std', 'night_anglez_std']\n    for sex_label, sex_mask in sex_masks.items():\n        for time_zone_data in time_zone_datas:\n            mean = np.nan\n            if total_merged_df.loc[sex_mask, time_zone_data].notna().any():\n                mean = total_merged_df.loc[sex_mask, time_zone_data].mean()\n            else:\n                mean = total_merged_df[time_zone_data].mean()\n            merged_test_df.loc[sex_mask & merged_test_df[time_zone_data].isna(), time_zone_data] = mean\n\n    # --------------------------------------------------------------------------------------------------- #\n    sleep_datas = ['sleep_disruption_count', 'light_exposure_during_sleep', 'light_exposure_during_sleep_std', \n                   'light_exposure_during_sleep_disruption', 'sleep_position_changes', 'good_sleep_cycle']\n    for sex_label, sex_mask in sex_masks.items():\n        for sleep_data in sleep_datas:\n            median = np.nan\n            if total_merged_df.loc[sex_mask, sleep_data].notna().any():\n                median = total_merged_df.loc[sex_mask, sleep_data].median()\n            else:\n                median = total_merged_df[sleep_data].median()\n            merged_test_df.loc[sex_mask & merged_test_df[sleep_data].isna(), sleep_data] = median\n\n    # --------------------------------------------------------------------------------------------------- #\n    angles_datas = ['anglez -90 to -60', 'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30', 'anglez 30 to 60', 'anglez 60 to 90']\n    for sex_label, sex_mask in sex_masks.items():\n        for angles_data in angles_datas:\n            mean = np.nan\n            if total_merged_df.loc[sex_mask, angles_data].notna().any():\n                mean = total_merged_df.loc[sex_mask, angles_data].mean()\n            else:\n                mean = total_merged_df[angles_data].mean()\n            merged_test_df.loc[sex_mask & merged_test_df[angles_data].isna(), angles_data] = mean\n\n    merged_test_df = merged_test_df.fillna(0)\n\n    return merged_test_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:50.976710Z","iopub.execute_input":"2024-12-12T22:00:50.977111Z","iopub.status.idle":"2024-12-12T22:00:50.991532Z","shell.execute_reply.started":"2024-12-12T22:00:50.977077Z","shell.execute_reply":"2024-12-12T22:00:50.990232Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_test_df = Merging_Test_Data_Parquet(post_train_data, post_train_parquet, post_test_data, post_test_parquet)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:50.993751Z","iopub.execute_input":"2024-12-12T22:00:50.994329Z","iopub.status.idle":"2024-12-12T22:00:51.174506Z","shell.execute_reply.started":"2024-12-12T22:00:50.994277Z","shell.execute_reply":"2024-12-12T22:00:51.173591Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"check_nan = merged_test_df[merged_test_df['with_parquet']==True].isna().sum()\ncheck_nan.sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:00:51.176239Z","iopub.execute_input":"2024-12-12T22:00:51.176523Z","iopub.status.idle":"2024-12-12T22:00:51.185392Z","shell.execute_reply.started":"2024-12-12T22:00:51.176494Z","shell.execute_reply":"2024-12-12T22:00:51.183966Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Result\nmerged_train_df\nmerged_train_df.to_pickle(f'/kaggle/working/merged_train_df_v3.pkl')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:07:33.200454Z","iopub.execute_input":"2024-12-12T22:07:33.200922Z","iopub.status.idle":"2024-12-12T22:07:33.212381Z","shell.execute_reply.started":"2024-12-12T22:07:33.200885Z","shell.execute_reply":"2024-12-12T22:07:33.211284Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_test_df\nmerged_test_df.to_pickle(f'/kaggle/working/merged_test_df_v3.pkl')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:07:45.279267Z","iopub.execute_input":"2024-12-12T22:07:45.279656Z","iopub.status.idle":"2024-12-12T22:07:45.285439Z","shell.execute_reply.started":"2024-12-12T22:07:45.279620Z","shell.execute_reply":"2024-12-12T22:07:45.284317Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Check correlation\ntrain_df = pd.read_pickle(f'/kaggle/working/merged_train_df_v3.pkl')\ntest_df = pd.read_pickle(f'/kaggle/working/merged_test_df_v3.pkl')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:00.803968Z","iopub.execute_input":"2024-12-12T22:08:00.804358Z","iopub.status.idle":"2024-12-12T22:08:00.814567Z","shell.execute_reply.started":"2024-12-12T22:08:00.804326Z","shell.execute_reply":"2024-12-12T22:08:00.813643Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from scipy.spatial.distance import pdist, squareform\ncheck_corr = train_df.drop(columns=['PCIAT-Season', 'PCIAT-PCIAT_Total', 'id'])\ncorrelation_matrix = check_corr.corr()\n\nsii_correlation = correlation_matrix['sii'].sort_values(ascending=False)\n\nplt.figure(figsize=(10, 8))\nsns.heatmap(correlation_matrix, annot=False, cmap='coolwarm', vmin=-1, vmax=1)\nplt.title('Correlation Matrix with Sii')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:04.331415Z","iopub.execute_input":"2024-12-12T22:08:04.331877Z","iopub.status.idle":"2024-12-12T22:08:05.340438Z","shell.execute_reply.started":"2024-12-12T22:08:04.331836Z","shell.execute_reply":"2024-12-12T22:08:05.339231Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(sii_correlation.to_string())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:10.706359Z","iopub.execute_input":"2024-12-12T22:08:10.706813Z","iopub.status.idle":"2024-12-12T22:08:10.716120Z","shell.execute_reply.started":"2024-12-12T22:08:10.706750Z","shell.execute_reply":"2024-12-12T22:08:10.714896Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"correlation_series = pd.Series(sii_correlation)\nselected_features = correlation_series[correlation_series.abs() > 0.1].drop('sii')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:15.529321Z","iopub.execute_input":"2024-12-12T22:08:15.529881Z","iopub.status.idle":"2024-12-12T22:08:15.538566Z","shell.execute_reply.started":"2024-12-12T22:08:15.529820Z","shell.execute_reply":"2024-12-12T22:08:15.537231Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load preprocessed data\ntrain_df = pd.read_pickle(f'/kaggle/working/merged_train_df_v3.pkl')\ntest_df = pd.read_pickle(f'/kaggle/working/merged_test_df_v3.pkl')\ntrain_df.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:32.610062Z","iopub.execute_input":"2024-12-12T22:08:32.610462Z","iopub.status.idle":"2024-12-12T22:08:32.622735Z","shell.execute_reply.started":"2024-12-12T22:08:32.610425Z","shell.execute_reply":"2024-12-12T22:08:32.621526Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Prepare training data\ntrain_df = train_df.drop(columns=['PCIAT-Season', 'PCIAT-PCIAT_Total'])\ntrain_df = train_df.dropna(subset=['sii'])\ntrain_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:35.843566Z","iopub.execute_input":"2024-12-12T22:08:35.844016Z","iopub.status.idle":"2024-12-12T22:08:35.883962Z","shell.execute_reply.started":"2024-12-12T22:08:35.843979Z","shell.execute_reply":"2024-12-12T22:08:35.882854Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df_with_parquet = train_df[train_df['with_parquet'] == True]\ntrain_df_without_parquet = train_df[train_df['with_parquet'] == False]\nparquet_features = ['actigraphy_season', 'weekend/weekday',\n       'morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std',\n       'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std',\n       'night_enmo_mean', 'night_enmo_std', 'night_anglez_std',\n       'sleep_disruption_count', 'light_exposure_during_sleep',\n       'light_exposure_during_sleep_std',\n       'light_exposure_during_sleep_disruption', 'sleep_position_changes',\n       'good_sleep_cycle', 'wear_consistency', 'anglez -90 to -60',\n       'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30',\n       'anglez 30 to 60', 'anglez 60 to 90', 'with_parquet']\ntrain_df_without_parquet = train_df_without_parquet.drop(columns = parquet_features)\ntrain_df_with_parquet = train_df_with_parquet.drop(columns = ['with_parquet'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:39.083736Z","iopub.execute_input":"2024-12-12T22:08:39.084159Z","iopub.status.idle":"2024-12-12T22:08:39.095798Z","shell.execute_reply.started":"2024-12-12T22:08:39.084121Z","shell.execute_reply":"2024-12-12T22:08:39.094550Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"key_features = selected_features.index.to_list()\nkey_features_without_parqurt = list(set(key_features) - set(parquet_features))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:08:42.329376Z","iopub.execute_input":"2024-12-12T22:08:42.329849Z","iopub.status.idle":"2024-12-12T22:08:42.335090Z","shell.execute_reply.started":"2024-12-12T22:08:42.329759Z","shell.execute_reply":"2024-12-12T22:08:42.333921Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y = train_df_with_parquet['sii']\nX = train_df_with_parquet.drop(columns=['id', 'sii'])\nX_train_with, X_test_with, y_train_with, y_test_with = train_test_split(X[key_features], y, test_size=0.2, random_state=42, stratify=y)\n\ny = train_df_without_parquet['sii']\nX = train_df_without_parquet.drop(columns=['id', 'sii'])\nX_train_without, X_test_without, y_train_without, y_test_without = train_test_split(X[key_features_without_parqurt], y, test_size=0.2, random_state=42, stratify=y)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:21:37.416343Z","iopub.execute_input":"2024-12-12T22:21:37.416820Z","iopub.status.idle":"2024-12-12T22:21:37.435075Z","shell.execute_reply.started":"2024-12-12T22:21:37.416742Z","shell.execute_reply":"2024-12-12T22:21:37.433892Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unique_classes, counts = np.unique(y_train_with, return_counts=True)\nclass_weights = np.sum(counts) / (len(unique_classes) * counts)\nclasses = np.unique(y_train_with)\nclass_weight_dict = {classes[i]: class_weights[i] for i in range(len(classes))}\nprint(\"Class weights:\", class_weight_dict)\n\nunique_classes, counts = np.unique(y_train_without, return_counts=True)\nclass_weights = np.sum(counts) / (len(unique_classes) * counts)\nclasses = np.unique(y_train_without)\nclass_weight_dict = {classes[i]: class_weights[i] for i in range(len(classes))}\nprint(\"Class weights:\", class_weight_dict)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:21:40.425215Z","iopub.execute_input":"2024-12-12T22:21:40.425766Z","iopub.status.idle":"2024-12-12T22:21:40.437816Z","shell.execute_reply.started":"2024-12-12T22:21:40.425702Z","shell.execute_reply":"2024-12-12T22:21:40.436575Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Create individual models\n# Light = LGBMRegressor(random_state=SEED, verbose=-1, n_estimators=300)\n# XGB_Model = XGBRegressor()\n# CatBoost_Model = CatBoostRegressor()\n# RandomForest_Model = RandomForestRegressor(random_state=SEED)\n# GradientBoosting_Model = GradientBoostingRegressor(random_state=SEED)\nLight = LGBMClassifier(random_state=SEED, verbose=-1, n_estimators=300)\nXGB_Model = XGBClassifier(random_state=SEED)\nCatBoost_Model = CatBoostClassifier(random_state=SEED, verbose=0)\nRandomForest_Model = RandomForestClassifier(random_state=SEED)\nGradientBoosting_Model = GradientBoostingClassifier(random_state=SEED)\nfrom sklearn.model_selection import GridSearchCV, RandomizedSearchCV\nfrom sklearn.metrics import accuracy_score\n\n# 設定搜尋範圍的參數\nparam_grids_1 = {\n    'LGBM': {\n        'n_estimators': [300],\n        'learning_rate': [0.1],\n        'max_depth': [7]\n    },\n    'XGB': {\n        'n_estimators': [300],\n        'learning_rate': [0.01],\n        'max_depth': [5]\n    },\n    'CatBoost': {\n        'depth': [7],\n        'learning_rate': [0.05],\n        'iterations': [300]\n    },\n    'RandomForest': {\n        'n_estimators': [100],\n        'max_depth': [None],\n        'min_samples_split': [2]\n    },\n    'GradientBoosting': {\n        'n_estimators': [100],\n        'learning_rate': [0.05],\n        'max_depth': [3]\n    }\n}\nparam_grids_2 = {\n    'LGBM': {\n        'n_estimators': [200],\n        'learning_rate': [0.01],\n        'max_depth': [5]\n    },\n    'XGB': {\n        'n_estimators': [100],\n        'learning_rate': [0.01],\n        'max_depth': [3]\n    },\n    'CatBoost': {\n        'depth': [3],\n        'learning_rate': [0.05],\n        'iterations': [300]\n    },\n    'RandomForest': {\n        'n_estimators': [300],\n        'max_depth': [10],\n        'min_samples_split': [2]\n    },\n    'GradientBoosting': {\n        'n_estimators': [300],\n        'learning_rate': [0.1],\n        'max_depth': [5]\n    }\n}\n\n# 調參函數\ndef optimize_model_1(model, param_grid, X_train, y_train):\n    search = GridSearchCV(model, param_grid, cv=5, scoring='f1_weighted', verbose=2, n_jobs=-1)\n    search.fit(X_train, y_train)\n    return search.best_estimator_, search.best_params_\ndef optimize_model_2(model, param_grid, X_train, y_train):\n    search = GridSearchCV(model, param_grid, cv=5, scoring='f1_weighted', verbose=2, n_jobs=-1)\n    search.fit(X_train, y_train)\n    return search.best_estimator_, search.best_params_\n\n# 假設已經有 X_train, y_train 資料\noptimized_models_with = {}\nfor model_name, model in zip(['LGBM', 'XGB', 'CatBoost', 'RandomForest', 'GradientBoosting'],\n                             [Light, XGB_Model, CatBoost_Model, RandomForest_Model, GradientBoosting_Model]):\n    print(f\"Optimizing {model_name}...\")\n    best_model, best_params = optimize_model_1(model, param_grids_1[model_name], X_train_with, y_train_with)\n    optimized_models_with[model_name] = best_model\n    print(f\"Best parameters for {model_name}: {best_params}\")\n\n# 以上調參後的最佳模型\nLight_with = optimized_models_with['LGBM']\nXGB_Model_with = optimized_models_with['XGB']\nCatBoost_Model_with = optimized_models_with['CatBoost']\nRandomForest_Model_with = optimized_models_with['RandomForest']\nGradientBoosting_Model_with = optimized_models_with['GradientBoosting']\n\n# 假設已經有 X_train, y_train 資料\noptimized_models_without = {}\nfor model_name, model in zip(['LGBM', 'XGB', 'CatBoost', 'RandomForest', 'GradientBoosting'],\n                             [Light, XGB_Model, CatBoost_Model, RandomForest_Model, GradientBoosting_Model]):\n    print(f\"Optimizing {model_name}...\")\n    best_model, best_params = optimize_model_2(model, param_grids_2[model_name], X_train_without, y_train_without)\n    optimized_models_without[model_name] = best_model\n    print(f\"Best parameters for {model_name}: {best_params}\")\n\n# 以上調參後的最佳模型\nLight_without = optimized_models_without['LGBM']\nXGB_Model_without = optimized_models_without['XGB']\nCatBoost_Model_without = optimized_models_without['CatBoost']\nRandomForest_Model_without = optimized_models_without['RandomForest']\nGradientBoosting_Model_without = optimized_models_without['GradientBoosting']\n\n# Combine models using Voting Regressor\nvoting_model_1 = VotingClassifier(estimators=[\n    ('lightgbm', Light_with),\n    ('xgboost', XGB_Model_with),\n    ('catboost', CatBoost_Model_with),\n    ('randomforest', RandomForest_Model_with),\n    ('gradientboosting', GradientBoosting_Model_with)\n], voting='soft')\n\nvoting_model_2 = VotingClassifier(estimators=[\n    ('lightgbm', Light_without),\n    ('xgboost', XGB_Model_without),\n    ('catboost', CatBoost_Model_without),\n    ('randomforest', RandomForest_Model_without),\n    ('gradientboosting', GradientBoosting_Model_without)\n], voting='soft')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:24:50.944070Z","iopub.execute_input":"2024-12-12T22:24:50.944512Z","iopub.status.idle":"2024-12-12T22:26:43.623131Z","shell.execute_reply.started":"2024-12-12T22:24:50.944477Z","shell.execute_reply":"2024-12-12T22:26:43.621830Z"}},"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\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\ndef evaluate_model(y_true, y_pred, oof_non_rounded):\n    # Calculate accuracy\n    accuracy = accuracy_score(y_true, y_pred)\n    print(f\"Accuracy: {accuracy:.2f}\")\n\n    # Print classification report\n    print(classification_report(y_true=y_true, y_pred=y_pred))\n\n    # Optimize thresholds for QWK\n    KappaOptimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y_true, oof_non_rounded), \n                              method='Nelder-Mead')\n    assert KappaOptimizer.success, \"Optimization did not converge.\"\n\n    thresholds_optimized = KappaOptimizer.x\n    y_pred_tuned = threshold_Rounder(oof_non_rounded, thresholds_optimized)\n    tuned_kappa = quadratic_weighted_kappa(y_true, y_pred_tuned)\n\n    print(f\"Optimized QWK: {tuned_kappa:.3f}\")\n    print(f\"Optimized thresholds: {thresholds_optimized}\")\n\n    return thresholds_optimized, tuned_kappa","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:27:07.687714Z","iopub.execute_input":"2024-12-12T22:27:07.688154Z","iopub.status.idle":"2024-12-12T22:27:07.698044Z","shell.execute_reply.started":"2024-12-12T22:27:07.688117Z","shell.execute_reply":"2024-12-12T22:27:07.696696Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_with_parquet = voting_model_1.fit(X_train_with, y_train_with)\n# Predict on test data\ny_pred = model_with_parquet.predict(X_test_with)\n# Calculate accuracy\naccuracy = accuracy_score(y_test_with, y_pred)\nprint(f\"Accuracy: {accuracy:.2f}\")\nprint(classification_report(y_true=y_test_with, y_pred=y_pred))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:27:11.518164Z","iopub.execute_input":"2024-12-12T22:27:11.518594Z","iopub.status.idle":"2024-12-12T22:27:20.479411Z","shell.execute_reply.started":"2024-12-12T22:27:11.518556Z","shell.execute_reply":"2024-12-12T22:27:20.478461Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_without_parquet = voting_model_2.fit(X_train_without, y_train_without)\n# Predict on test data\ny_pred = model_without_parquet.predict(X_test_without)\n# Calculate accuracy\naccuracy = accuracy_score(y_test_without, y_pred)\nprint(f\"Accuracy: {accuracy:.2f}\")\nprint(classification_report(y_true=y_test_without, y_pred=y_pred))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:27:48.948652Z","iopub.execute_input":"2024-12-12T22:27:48.949113Z","iopub.status.idle":"2024-12-12T22:28:00.946741Z","shell.execute_reply.started":"2024-12-12T22:27:48.949073Z","shell.execute_reply":"2024-12-12T22:28:00.945457Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Predict\ntest_df_with_parquet = test_df[test_df['with_parquet'] == True]\ntest_df_without_parquet = test_df[test_df['with_parquet'] == False]\nparquet_features = ['actigraphy_season', 'weekend/weekday',\n       'morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std',\n       'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std',\n       'night_enmo_mean', 'night_enmo_std', 'night_anglez_std',\n       'sleep_disruption_count', 'light_exposure_during_sleep',\n       'light_exposure_during_sleep_std',\n       'light_exposure_during_sleep_disruption', 'sleep_position_changes',\n       'good_sleep_cycle', 'wear_consistency', 'anglez -90 to -60',\n       'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30',\n       'anglez 30 to 60', 'anglez 60 to 90', 'with_parquet']\ntest_df_without_parquet = test_df_without_parquet.drop(columns = parquet_features)\ntest_df_with_parquet = test_df_with_parquet.drop(columns = ['with_parquet'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:28:08.901086Z","iopub.execute_input":"2024-12-12T22:28:08.901513Z","iopub.status.idle":"2024-12-12T22:28:08.915842Z","shell.execute_reply.started":"2024-12-12T22:28:08.901468Z","shell.execute_reply":"2024-12-12T22:28:08.914872Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_predict = test_df_without_parquet.drop(columns=['id'])\npred_result = model_without_parquet.predict(X_predict[key_features_without_parqurt])\nlist_of_tuples = list(zip(pred_result, test_df_without_parquet['id'].values))\nresult_without_parquet = pd.DataFrame(list_of_tuples, columns=['sii', 'id'])\nresult_without_parquet","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:28:13.008819Z","iopub.execute_input":"2024-12-12T22:28:13.009228Z","iopub.status.idle":"2024-12-12T22:28:13.056931Z","shell.execute_reply.started":"2024-12-12T22:28:13.009193Z","shell.execute_reply":"2024-12-12T22:28:13.055683Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_predict = test_df_with_parquet.drop(columns=['id'])\npred_result = model_with_parquet.predict(X_predict[key_features])\nlist_of_tuples = list(zip(pred_result, test_df_with_parquet['id'].values))\nresult_with_parquet = pd.DataFrame(list_of_tuples, columns=['sii', 'id'])\nresult_with_parquet","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:28:19.954417Z","iopub.execute_input":"2024-12-12T22:28:19.954856Z","iopub.status.idle":"2024-12-12T22:28:19.991490Z","shell.execute_reply.started":"2024-12-12T22:28:19.954816Z","shell.execute_reply":"2024-12-12T22:28:19.990497Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"result = pd.concat([result_with_parquet, result_without_parquet], ignore_index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:28:24.240464Z","iopub.execute_input":"2024-12-12T22:28:24.241348Z","iopub.status.idle":"2024-12-12T22:28:24.249529Z","shell.execute_reply.started":"2024-12-12T22:28:24.241305Z","shell.execute_reply":"2024-12-12T22:28:24.248352Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"result.to_csv(f'/kaggle/working/submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T22:28:28.646766Z","iopub.execute_input":"2024-12-12T22:28:28.647478Z","iopub.status.idle":"2024-12-12T22:28:28.669655Z","shell.execute_reply.started":"2024-12-12T22:28:28.647409Z","shell.execute_reply":"2024-12-12T22:28:28.666955Z"}},"outputs":[],"execution_count":null}]}