{"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}],"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","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:36.858964Z","iopub.execute_input":"2024-12-13T19:00:36.859274Z","iopub.status.idle":"2024-12-13T19:00:36.864522Z","shell.execute_reply.started":"2024-12-13T19:00:36.859240Z","shell.execute_reply":"2024-12-13T19:00:36.863626Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport random\nimport os\nfrom sklearn.base import clone, BaseEstimator, RegressorMixin\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelEncoder\nfrom sklearn.decomposition import PCA\nfrom sklearn.cluster import KMeans\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.ensemble import RandomForestClassifier, RandomForestRegressor, GradientBoostingRegressor\nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report, cohen_kappa_score\nfrom concurrent.futures import ThreadPoolExecutor\nfrom lightgbm import LGBMRegressor\nfrom catboost import CatBoostRegressor, CatBoostClassifier\nfrom xgboost import XGBRegressor\nfrom tqdm import tqdm\n# from pytorch_tabnet.tab_model import TabNetClassifier, TabNetRegressor\n# from pytorch_tabnet.callbacks import Callback\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom sklearn.ensemble import StackingRegressor\nfrom sklearn.pipeline import Pipeline\nfrom IPython.display import clear_output\nfrom scipy.optimize import minimize\nfrom colorama import Fore, Style","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:36.866949Z","iopub.execute_input":"2024-12-13T19:00:36.867318Z","iopub.status.idle":"2024-12-13T19:00:40.637581Z","shell.execute_reply.started":"2024-12-13T19:00:36.867288Z","shell.execute_reply":"2024-12-13T19:00:40.636702Z"}},"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')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.638952Z","iopub.execute_input":"2024-12-13T19:00:40.639483Z","iopub.status.idle":"2024-12-13T19:00:40.704561Z","shell.execute_reply.started":"2024-12-13T19:00:40.639449Z","shell.execute_reply":"2024-12-13T19:00:40.703373Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"conflict_rows = train_df[(train_df['PAQ_A-PAQ_A_Total'].notna()) & (train_df['PAQ_C-PAQ_C_Total'].notna())]\n\n# 判斷是否存在衝突行\nif not conflict_rows.empty:\n    train_df = train_df.drop(conflict_rows.index)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.705899Z","iopub.execute_input":"2024-12-13T19:00:40.706216Z","iopub.status.idle":"2024-12-13T19:00:40.715511Z","shell.execute_reply.started":"2024-12-13T19:00:40.706177Z","shell.execute_reply":"2024-12-13T19:00:40.714399Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 將合併結果存回 column1\ntrain_df['PAQ_A-PAQ_A_Total'] = train_df['PAQ_A-PAQ_A_Total'].fillna(train_df['PAQ_C-PAQ_C_Total'])\ntrain_df['PAQ_A-Season'] = train_df['PAQ_A-Season'].fillna(train_df['PAQ_C-Season'])\ntest_df['PAQ_A-PAQ_A_Total'] = test_df['PAQ_A-PAQ_A_Total'].fillna(test_df['PAQ_C-PAQ_C_Total'])\ntest_df['PAQ_A-Season'] = test_df['PAQ_A-Season'].fillna(test_df['PAQ_C-Season'])\n\n# 刪除 column2\ntrain_df = train_df.drop(columns=['PAQ_C-PAQ_C_Total', 'PAQ_C-Season'])\ntest_df = test_df.drop(columns=['PAQ_C-PAQ_C_Total', 'PAQ_C-Season'])\n\ntrain_df = train_df.rename(columns={'PAQ_A-Season': 'PAQ-Season'})\ntrain_df = train_df.rename(columns={'PAQ_A-PAQ_A_Total': 'PAQ-PAQ_Total'})\ntest_df = test_df.rename(columns={'PAQ_A-Season': 'PAQ-Season'})\ntest_df = test_df.rename(columns={'PAQ_A-PAQ_A_Total': 'PAQ-PAQ_Total'})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.716885Z","iopub.execute_input":"2024-12-13T19:00:40.717238Z","iopub.status.idle":"2024-12-13T19:00:40.738378Z","shell.execute_reply.started":"2024-12-13T19:00:40.717207Z","shell.execute_reply":"2024-12-13T19:00:40.737288Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = train_df.dropna(axis=1, thresh=len(train_df) - 3000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.739706Z","iopub.execute_input":"2024-12-13T19:00:40.740104Z","iopub.status.idle":"2024-12-13T19:00:40.753790Z","shell.execute_reply.started":"2024-12-13T19:00:40.740071Z","shell.execute_reply":"2024-12-13T19:00:40.752897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def max_min_difference(data):\n    Max = data[np.argmax(data)]\n    Min = data[np.argmin(data)]\n    return Max-Min\n\ndef Acceleration_Vector_Changes(length,timestamp):\n    change_sum = 0\n    for i in range(1, len(timestamp)):\n        change_sum +=abs((length[i]-length[i-1]))\n    return change_sum/(timestamp[-1]-timestamp[0])\n\ndef loss_pass_filter(data,alpha=0.2):\n    data_filtered = [data[0]]\n    for i in range(1,len(data)):\n        data_filtered.append(alpha*data[i]+(1-alpha)*data_filtered[i-1])\n    return data_filtered\n\ndef process_file(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    \n    df = df[df['non-wear_flag']==0.0]\n    \n    df.drop('step', axis=1, inplace=True)\n    df.drop(columns=['battery_voltage'], inplace=True)\n    df.drop(columns=['quarter'], inplace=True )\n    df.drop(columns=['relative_date_PCIAT'], inplace=True)\n    df.drop(columns=['weekday'], inplace=True)\n    df.drop(columns=['non-wear_flag'], inplace=True)\n    df.drop(columns=['light'], inplace=True)\n    \n    df['X_low'] = loss_pass_filter(df['X'].to_numpy())\n    df['Y_low'] = loss_pass_filter(df['Y'].to_numpy())\n    df['Z_low'] = loss_pass_filter(df['Z'].to_numpy())\n    \n    acc_vec_len = np.sqrt(np.square(df['X'].to_numpy())+np.square(df['Y'].to_numpy())+np.square(df['Z'].to_numpy()))\n    df['acc_vec_len'] = acc_vec_len\n    \n    X_low_mean = np.mean(df['X_low'].to_numpy())\n    Y_low_mean = np.mean(df['Y_low'].to_numpy())\n    Z_low_mean = np.mean(df['Z_low'].to_numpy())\n\n    X_low_RMS = np.sqrt(np.mean(np.square(df['X_low'].to_numpy())))\n    Y_low_RMS = np.sqrt(np.mean(np.square(df['Y_low'].to_numpy())))\n    Z_low_RMS = np.sqrt(np.mean(np.square(df['Z_low'].to_numpy())))\n\n    X_low_std = np.std(df['X_low'].to_numpy())\n    Y_low_std = np.std(df['Y_low'].to_numpy())\n    Z_low_std = np.std(df['Z_low'].to_numpy())\n\n    timestamp = df['time_of_day'].to_numpy()\n    X = df['X'].to_numpy()\n    Y = df['Y'].to_numpy()\n    Z = df['Z'].to_numpy()\n    AVC = []\n    MM_diff_X = []\n    MM_diff_Y = []\n    MM_diff_Z = []\n    start_time = []\n    end_time = []\n    windows = 6\n    stride = 1\n    start = 0\n    end = start+windows\n    while(start<len(acc_vec_len) and end<len(acc_vec_len)):\n        avc = Acceleration_Vector_Changes(acc_vec_len[start:end],timestamp[start:end])\n        mm_diff_x= max_min_difference(X[start:end])\n        mm_diff_y= max_min_difference(Y[start:end])\n        mm_diff_z= max_min_difference(Z[start:end])\n        start_time.append(timestamp[start])\n        end_time.append(timestamp[end])\n        AVC.append(avc)\n        MM_diff_X.append(mm_diff_x)\n        MM_diff_Y.append(mm_diff_y)\n        MM_diff_Z.append(mm_diff_z)\n        start+=stride\n        end=start+windows\n    temp_df = pd.DataFrame({\n        'AVC': AVC\n    })\n    temp_df['MM_diff_X'] = MM_diff_X\n    temp_df['MM_diff_Y'] = MM_diff_Y\n    temp_df['MM_diff_Z'] = MM_diff_Z\n\n    # acc_vec_len_low = np.sqrt(np.square(df['X_low'].to_numpy())+np.square(df['Y_low'].to_numpy())+np.square(df['Z_low'].to_numpy()))\n    # df['varphi_x'] = np.arccos(df['X_low'].to_numpy()/acc_vec_len_low)\n    # df['varphi_y'] = np.arccos(df['Y_low'].to_numpy()/acc_vec_len_low)\n    # df['varphi_z'] = np.arccos(df['Z_low'].to_numpy()/acc_vec_len_low)\n\n    df.drop(columns=['time_of_day'], inplace=True)\n    df.drop(columns=['X'], inplace=True)\n    df.drop(columns=['Y'], inplace=True)\n    df.drop(columns=['Z'], inplace=True)\n\n    df = df.describe()\n    temp_df = temp_df.describe()\n    df = pd.concat([df, temp_df], axis=1)\n\n    df['X_low_mean'] = X_low_mean\n    df['Y_low_mean'] = Y_low_mean\n    df['Z_low_mean'] = Z_low_mean\n\n    df['X_low_RMS'] = X_low_RMS\n    df['Y_low_RMS'] = Y_low_RMS\n    df['Z_low_RMS'] = Z_low_RMS\n\n    df['X_low_std'] = X_low_std\n    df['Y_low_std'] = Y_low_std\n    df['Z_low_std'] = Z_low_std\n    return df.values.reshape(-1), filename.split('=')[1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.757153Z","iopub.execute_input":"2024-12-13T19:00:40.757466Z","iopub.status.idle":"2024-12-13T19:00:40.777618Z","shell.execute_reply.started":"2024-12-13T19:00:40.757437Z","shell.execute_reply":"2024-12-13T19:00:40.776551Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_time_series(dirname) -> pd.DataFrame:\n    ids = os.listdir(dirname)\n    results = []\n    for fname in tqdm(ids, total=len(ids)):\n        result = process_file(fname, dirname)\n        results.append(result)\n    stats, indexes = zip(*results)\n    \n    df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))])\n    df['id'] = indexes\n    \n    return df\n\nclass AutoEncoder(nn.Module):\n    def __init__(self, input_dim, encoding_dim):\n        super(AutoEncoder, self).__init__()\n        self.encoder = nn.Sequential(\n            nn.Linear(input_dim, encoding_dim*3),\n            nn.ReLU(),\n            nn.Linear(encoding_dim*3, encoding_dim*2),\n            nn.ReLU(),\n            nn.Linear(encoding_dim*2, encoding_dim),\n            nn.ReLU()\n        )\n        self.decoder = nn.Sequential(\n            nn.Linear(encoding_dim, input_dim*2),\n            nn.ReLU(),\n            nn.Linear(input_dim*2, input_dim*3),\n            nn.ReLU(),\n            nn.Linear(input_dim*3, input_dim),\n            nn.Sigmoid()\n        )\n        \n    def forward(self, x):\n        encoded = self.encoder(x)\n        decoded = self.decoder(encoded)\n        return decoded\n\ndef perform_autoencoder(df, encoding_dim=50, epochs=50, batch_size=32):\n    scaler = StandardScaler()\n    df_scaled = scaler.fit_transform(df)\n    \n    data_tensor = torch.FloatTensor(df_scaled)\n    \n    input_dim = data_tensor.shape[1]\n    autoencoder = AutoEncoder(input_dim, encoding_dim)\n    \n    criterion = nn.MSELoss()\n    optimizer = optim.Adam(autoencoder.parameters())\n    \n    for epoch in range(epochs):\n        for i in range(0, len(data_tensor), batch_size):\n            batch = data_tensor[i : i + batch_size]\n            optimizer.zero_grad()\n            reconstructed = autoencoder(batch)\n            loss = criterion(reconstructed, batch)\n            loss.backward()\n            optimizer.step()\n            \n        if (epoch + 1) % 10 == 0:\n            print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}]')\n                 \n    with torch.no_grad():\n        encoded_data = autoencoder.encoder(data_tensor).numpy()\n        \n    df_encoded = pd.DataFrame(encoded_data, columns=[f'Enc_{i + 1}' for i in range(encoded_data.shape[1])])\n    \n    return df_encoded","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.779249Z","iopub.execute_input":"2024-12-13T19:00:40.780071Z","iopub.status.idle":"2024-12-13T19:00:40.798123Z","shell.execute_reply.started":"2024-12-13T19:00:40.779986Z","shell.execute_reply":"2024-12-13T19:00:40.797242Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 把SII是空的column刪除\ntrain_df = train_df.dropna(subset=['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.799361Z","iopub.execute_input":"2024-12-13T19:00:40.799802Z","iopub.status.idle":"2024-12-13T19:00:40.818481Z","shell.execute_reply.started":"2024-12-13T19:00:40.799770Z","shell.execute_reply":"2024-12-13T19:00:40.817431Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# PCIAT 有些欄位是空的，會影響最後SII結果，把若填滿PCIAT有可能改變SII的column刪除\nPCIAT_cols = [f'PCIAT-PCIAT_{i+1:02d}' for i in range(20)]\ndef IncorrectRows(row):\n    if pd.isna(row['PCIAT-PCIAT_Total']):\n        return np.nan\n    max_possible = row['PCIAT-PCIAT_Total'] + row[PCIAT_cols].isna().sum() * 5\n    if row['PCIAT-PCIAT_Total'] <= 30 and max_possible <= 30:\n        return 0\n    elif 31 <= row['PCIAT-PCIAT_Total'] <= 49 and max_possible <= 49:\n        return 1\n    elif 50 <= row['PCIAT-PCIAT_Total'] <= 79 and max_possible <= 79:\n        return 2\n    elif row['PCIAT-PCIAT_Total'] >= 80 and max_possible >= 80:\n        return 3\n    return np.nan\n\ntrain_df['recal_sii'] = train_df.apply(IncorrectRows, axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:40.819921Z","iopub.execute_input":"2024-12-13T19:00:40.820296Z","iopub.status.idle":"2024-12-13T19:00:42.143454Z","shell.execute_reply.started":"2024-12-13T19:00:40.820264Z","shell.execute_reply":"2024-12-13T19:00:42.142392Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"mismatch_rows = train_df[\n    (train_df['recal_sii'] != train_df['sii']) & train_df['sii'].notna()\n]\nmismatch_indexes = mismatch_rows.index\ntrain_df = train_df.drop(mismatch_indexes)\ntrain_df = train_df.drop(['recal_sii'], axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.144820Z","iopub.execute_input":"2024-12-13T19:00:42.145259Z","iopub.status.idle":"2024-12-13T19:00:42.156251Z","shell.execute_reply.started":"2024-12-13T19:00:42.145205Z","shell.execute_reply":"2024-12-13T19:00:42.154869Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sii_0 = train_df[train_df['sii'] == 0]  # 'sii' 為 0 的樣本\nsii_1 = train_df[train_df['sii'] == 1]  # 'sii' 為 1 的樣本\nsii_2 = train_df[train_df['sii'] == 2]  # 'sii' 為 2 的樣本\nsii_3 = train_df[train_df['sii'] == 3]  # 'sii' 為 3 的樣本\n\np0 = sii_0['PCIAT-PCIAT_Total'].value_counts().sort_index()\np1 = sii_1['PCIAT-PCIAT_Total'].value_counts().sort_index()\np2 = sii_2['PCIAT-PCIAT_Total'].value_counts().sort_index()\np3 = sii_3['PCIAT-PCIAT_Total'].value_counts().sort_index()\nadditional_scores = pd.Series({\n    94.0: 0,\n    95.0: 0,\n    96.0: 0,\n    97.0: 0,\n    98.0: 0,\n    99.0: 0,\n    100.0: 0\n})\n\np3 = pd.concat([p3, additional_scores])\n\n# print(sii_0['PCIAT-PCIAT_Total'].describe())\n# print(sii_1['PCIAT-PCIAT_Total'].describe())\n# print(sii_2['PCIAT-PCIAT_Total'].describe())\n# print(sii_3['PCIAT-PCIAT_Total'].describe())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.157675Z","iopub.execute_input":"2024-12-13T19:00:42.158109Z","iopub.status.idle":"2024-12-13T19:00:42.173083Z","shell.execute_reply.started":"2024-12-13T19:00:42.158075Z","shell.execute_reply":"2024-12-13T19:00:42.172215Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 把有關Season的column做mapping \nSEASON_COLS = [\n    \"Basic_Demos-Enroll_Season\", \n    \"CGAS-Season\", \n    \"Physical-Season\", \n    \"Fitness_Endurance-Season\", \n    \"FGC-Season\", \n    \"BIA-Season\", \n    \"PAQ-Season\",\n    \"SDS-Season\",\n    \"PreInt_EduHx-Season\", \n    ]\ndef update(df):\n    for c in SEASON_COLS:\n        if not isinstance(df[c].dtype, pd.CategoricalDtype):\n                df[c] = df[c].astype('category')\n        if 'Missing' not in df[c].cat.categories:\n            df[c] = df[c].cat.add_categories(['Missing'])\n        df[c] = df[c].fillna('Missing')\n    return df\ntrain_df = update(train_df)\ntest_df = update(test_df)\nseason_mapping = {'Spring': 0, 'Summer': 1, 'Fall': 2, 'Winter': 3, 'Missing': 4}\nfor col in SEASON_COLS:\n    train_df[col] = train_df[col].map(season_mapping)\n    test_df[col] = test_df[col].map(season_mapping)\ntrain_df['PCIAT-Season'] = train_df['PCIAT-Season'].map(season_mapping)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.174429Z","iopub.execute_input":"2024-12-13T19:00:42.175297Z","iopub.status.idle":"2024-12-13T19:00:42.224429Z","shell.execute_reply.started":"2024-12-13T19:00:42.175243Z","shell.execute_reply":"2024-12-13T19:00:42.223522Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 做Imputer\ntrain_id = train_df['id']\ntest_id = test_df['id']\ntrain_features = train_df.drop(columns=['id'])\ntest_features = test_df.drop(columns=['id'])\n\nimputer = SimpleImputer(strategy='median')\ntrain_features_imputed = pd.DataFrame(imputer.fit_transform(train_features), columns=train_features.columns, index=train_features.index)\ntest_features_imputed = pd.DataFrame(imputer.fit_transform(test_features), columns=test_features.columns, index=test_features.index)\n\ntrain_df = pd.concat([train_id, train_features_imputed], axis=1)\ntest_df = pd.concat([test_id, test_features_imputed], axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.226121Z","iopub.execute_input":"2024-12-13T19:00:42.226462Z","iopub.status.idle":"2024-12-13T19:00:42.284618Z","shell.execute_reply.started":"2024-12-13T19:00:42.226428Z","shell.execute_reply":"2024-12-13T19:00:42.283582Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_cor = train_df.drop('id', axis=1)\ntest_cor = test_df.drop('id', axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.286107Z","iopub.execute_input":"2024-12-13T19:00:42.286544Z","iopub.status.idle":"2024-12-13T19:00:42.294947Z","shell.execute_reply.started":"2024-12-13T19:00:42.286488Z","shell.execute_reply":"2024-12-13T19:00:42.293693Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 尋找和PCIAT_Total相關性低的column並刪除 \ncorr_matrix = train_cor[['PCIAT-PCIAT_Total', 'Basic_Demos-Age', 'Basic_Demos-Sex', 'Physical-BMI', \n                        'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                        'Physical-Diastolic_BP', 'Physical-Systolic_BP', 'Physical-HeartRate',\n                        'PreInt_EduHx-computerinternet_hoursday', 'SDS-SDS_Total_T', 'PAQ-PAQ_Total',\n                        'Fitness_Endurance-Max_Stage', 'Fitness_Endurance-Time_Mins', \n                        'Fitness_Endurance-Time_Sec', 'FGC-FGC_CU', 'FGC-FGC_GSND', 'FGC-FGC_GSD', \n                        'FGC-FGC_PU', 'FGC-FGC_SRL', 'FGC-FGC_SRR', 'FGC-FGC_TL', 'BIA-BIA_Activity_Level_num', \n                        '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_Frame_num', 'BIA-BIA_ICW', \n                        'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM', 'BIA-BIA_TBW']].corr()\nsii_corr = corr_matrix['PCIAT-PCIAT_Total'].drop('PCIAT-PCIAT_Total')\nfiltered_corr = sii_corr[(sii_corr > 0.1) | (sii_corr < -0.1)]\nother_corr = sii_corr[(sii_corr <= 0.1) & (sii_corr >= -0.1)]\nother_corr_columns = other_corr.index.tolist()\nprint(other_corr)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.296186Z","iopub.execute_input":"2024-12-13T19:00:42.296532Z","iopub.status.idle":"2024-12-13T19:00:42.322961Z","shell.execute_reply.started":"2024-12-13T19:00:42.296487Z","shell.execute_reply":"2024-12-13T19:00:42.321782Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# plt.figure(figsize=(8, 6))\n# filtered_corr.sort_values().plot(kind='barh', color='coral')\n# plt.title('Features with Correlation > 0.1 or < -0.1 with PCIAT-PCIAT_Total')\n# plt.xlabel('Correlation coefficient')\n# plt.ylabel('Features')\n# plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.324629Z","iopub.execute_input":"2024-12-13T19:00:42.324996Z","iopub.status.idle":"2024-12-13T19:00:42.329676Z","shell.execute_reply.started":"2024-12-13T19:00:42.324955Z","shell.execute_reply":"2024-12-13T19:00:42.328521Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = train_df.drop(columns=other_corr_columns)\ntest_df = test_df.drop(columns=other_corr_columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.331316Z","iopub.execute_input":"2024-12-13T19:00:42.331658Z","iopub.status.idle":"2024-12-13T19:00:42.347190Z","shell.execute_reply.started":"2024-12-13T19:00:42.331607Z","shell.execute_reply":"2024-12-13T19:00:42.346057Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 把parquet data加進去 \ntrain_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\n\n# make sure no inf or -inf or nan\ntrain_ts = train_ts.replace([1000000, -1000000], np.nan)\ntrain_ts = train_ts.fillna(0)\ntest_ts = test_ts.replace([1000000, -1000000], np.nan)\ntest_ts = test_ts.fillna(0)\n\n# train_ts_encoded = perform_autoencoder(train_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\n# test_ts_encoded = perform_autoencoder(test_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\n\n# make sure no inf or -inf or nan\n# train_ts_encoded = train_ts_encoded.replace([np.inf, -np.inf], np.nan)\n# train_ts_encoded = train_ts_encoded.dropna()\n# test_ts_encoded = test_ts_encoded.replace([np.inf, -np.inf], np.nan)\n# test_ts_encoded = test_ts_encoded.dropna()\n\n# train_ts_encoded[\"id\"]=train_ts[\"id\"]\n# test_ts_encoded['id']=test_ts[\"id\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T19:00:42.348565Z","iopub.execute_input":"2024-12-13T19:00:42.348956Z","iopub.status.idle":"2024-12-13T20:45:27.830132Z","shell.execute_reply.started":"2024-12-13T19:00:42.348925Z","shell.execute_reply":"2024-12-13T20:45:27.828675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts_df = train_ts.merge(train_df[['id', 'PCIAT-PCIAT_Total']], on='id', how='left')\ntrain_ts_noID = train_ts_df.drop('id', axis=1)\ntime_series_cols = train_ts_noID.columns.tolist()\n# test_ts_noID = test_ts_df.drop('id', axis=1)\n# time_series_cols.append('PCIAT-PCIAT_Total')\ncorr_matrix = train_ts_df[time_series_cols].corr()\nsii_corr = corr_matrix['PCIAT-PCIAT_Total'].drop('PCIAT-PCIAT_Total')\nfiltered_corr = sii_corr[(sii_corr > 0.1) | (sii_corr < -0.1)]\nother_corr = sii_corr[(sii_corr <= 0.1) & (sii_corr >= -0.1)]\nother_corr_columns = other_corr.index.tolist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:27.831793Z","iopub.execute_input":"2024-12-13T20:45:27.832269Z","iopub.status.idle":"2024-12-13T20:45:27.922989Z","shell.execute_reply.started":"2024-12-13T20:45:27.832219Z","shell.execute_reply":"2024-12-13T20:45:27.921891Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(time_series_cols)\n# train_ts[filtered_corr] = train_ts_noID[filtered_corr]\ntrain_ts = train_ts.drop(columns=other_corr_columns)\ntest_ts = test_ts.drop(columns=other_corr_columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:27.924454Z","iopub.execute_input":"2024-12-13T20:45:27.924895Z","iopub.status.idle":"2024-12-13T20:45:27.933267Z","shell.execute_reply.started":"2024-12-13T20:45:27.924821Z","shell.execute_reply":"2024-12-13T20:45:27.932068Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# pd.set_option('display.max_columns', None)\n# pd.set_option('display.max_rows', None)\nprint(train_df.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:27.939349Z","iopub.execute_input":"2024-12-13T20:45:27.939725Z","iopub.status.idle":"2024-12-13T20:45:27.952392Z","shell.execute_reply.started":"2024-12-13T20:45:27.939694Z","shell.execute_reply":"2024-12-13T20:45:27.951066Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TARGET_COLS = [\n    \"PCIAT-Season\",\n    \"PCIAT-PCIAT_01\",\n    \"PCIAT-PCIAT_02\",\n    \"PCIAT-PCIAT_03\",\n    \"PCIAT-PCIAT_04\",\n    \"PCIAT-PCIAT_05\",\n    \"PCIAT-PCIAT_06\",\n    \"PCIAT-PCIAT_07\",\n    \"PCIAT-PCIAT_08\",\n    \"PCIAT-PCIAT_09\",\n    \"PCIAT-PCIAT_10\",\n    \"PCIAT-PCIAT_11\",\n    \"PCIAT-PCIAT_12\",\n    \"PCIAT-PCIAT_13\",\n    \"PCIAT-PCIAT_14\",\n    \"PCIAT-PCIAT_15\",\n    \"PCIAT-PCIAT_16\",    \n    \"PCIAT-PCIAT_17\",\n    \"PCIAT-PCIAT_18\",\n    \"PCIAT-PCIAT_19\",\n    \"PCIAT-PCIAT_20\",\n    # \"PCIAT-PCIAT_Total\"\n]\ntrain_df = train_df.drop(TARGET_COLS,axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:27.954007Z","iopub.execute_input":"2024-12-13T20:45:27.954376Z","iopub.status.idle":"2024-12-13T20:45:27.967770Z","shell.execute_reply.started":"2024-12-13T20:45:27.954344Z","shell.execute_reply":"2024-12-13T20:45:27.966611Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.merge(train_df, train_ts, how=\"left\", on='id')\ntest_df = pd.merge(test_df, test_ts, how=\"left\", on='id')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:27.969389Z","iopub.execute_input":"2024-12-13T20:45:27.969848Z","iopub.status.idle":"2024-12-13T20:45:27.987366Z","shell.execute_reply.started":"2024-12-13T20:45:27.969783Z","shell.execute_reply":"2024-12-13T20:45:27.986345Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(filtered_corr)\nnan_check = train_df.isna().sum()\nprint(nan_check)\n# large_values_check = (train_df > 1e6).sum()\n\n# # Print how many values exceed the threshold for each column\n# print(large_values_check)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:46:51.206205Z","iopub.execute_input":"2024-12-13T20:46:51.206588Z","iopub.status.idle":"2024-12-13T20:46:51.217523Z","shell.execute_reply.started":"2024-12-13T20:46:51.206557Z","shell.execute_reply":"2024-12-13T20:46:51.216342Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# imputer = KNNImputer(n_neighbors=5)\n# numeric_cols = train_df.select_dtypes(include=['float64', 'int64']).columns\n# imputed_data = imputer.fit_transform(train_df[numeric_cols])\n# train_imputed = pd.DataFrame(imputed_data, columns=numeric_cols)\n# train_imputed['sii'] = train_imputed['sii'].round().astype(int)\n# for col in train_df.columns:\n#     if col not in numeric_cols:\n#         train_imputed[col] = train_df[col]\n        \n# train_df = train_imputed\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.459545Z","iopub.status.idle":"2024-12-13T20:45:29.460015Z","shell.execute_reply.started":"2024-12-13T20:45:29.459768Z","shell.execute_reply":"2024-12-13T20:45:29.459802Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = train_df.drop('id', axis=1)\ntest_df = test_df.drop('id', axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:47:12.644376Z","iopub.execute_input":"2024-12-13T20:47:12.644739Z","iopub.status.idle":"2024-12-13T20:47:12.651976Z","shell.execute_reply.started":"2024-12-13T20:47:12.644709Z","shell.execute_reply":"2024-12-13T20:47:12.650841Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f'Train Shape : {train_df.shape} || Test Shape : {test_df.shape}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:47:19.383847Z","iopub.execute_input":"2024-12-13T20:47:19.384876Z","iopub.status.idle":"2024-12-13T20:47:19.390331Z","shell.execute_reply.started":"2024-12-13T20:47:19.384814Z","shell.execute_reply":"2024-12-13T20:47:19.389192Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = train_df.replace([1000000, -1000000], np.nan)\ntest_df = test_df.replace([1000000, -1000000], np.nan)\ntrain_df = train_df.fillna(0)\ntest_df = test_df.fillna(0)\nnan_check = train_df.isna().sum()\nprint(nan_check)\nlarge_values_check = (train_df > 1e6).sum()\n\n# Print how many values exceed the threshold for each column\n# pd.set_option('display.max_rows', None)\nprint(large_values_check)\ncolumns_to_drop = large_values_check[large_values_check > 0].index\n\n# Drop these columns from the DataFrame\ntrain_df = train_df.drop(columns=columns_to_drop)\ntest_df = test_df.drop(columns=columns_to_drop)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:47:23.603788Z","iopub.execute_input":"2024-12-13T20:47:23.604264Z","iopub.status.idle":"2024-12-13T20:47:23.621110Z","shell.execute_reply.started":"2024-12-13T20:47:23.604231Z","shell.execute_reply":"2024-12-13T20:47:23.619775Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from imblearn.over_sampling import SMOTE\nX_train = train_df.drop(columns=['sii'])  # 假設 'sii' 是目標欄位\ny_train1 = train_df['sii']\n\nX_train = X_train.drop(columns=['PCIAT-PCIAT_Total']) \nX_train2 = X_train\ny_train2 = train_df['PCIAT-PCIAT_Total']\n\n# # 使用 SMOTE 進行過採樣\n# smote = SMOTE(random_state=42)\n# X_train_resampled1, y_train_resampled1 = smote.fit_resample(X_train, y_train1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.467559Z","iopub.status.idle":"2024-12-13T20:45:29.468003Z","shell.execute_reply.started":"2024-12-13T20:45:29.467755Z","shell.execute_reply":"2024-12-13T20:45:29.467774Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def filling(distribution, SCORE):\n    \n#     total = 0\n#     for score, freq in distribution.items():\n#         total += freq\n    \n#     length = int(len(X_train_resampled1) / 4 - total)\n#     left_space = length\n    \n#     fill_dict = {}\n#     for score, freq in distribution.items():\n#         freq = int(freq / total * length)\n#         fill_dict[score] = freq\n#         left_space = left_space - freq\n        \n#     fill_data = []\n#     for score, fill_count in fill_dict.items():\n#         fill_data.extend([score] * fill_count)\n        \n#     for i in range(left_space):\n#         random_score = random.choice(list(distribution.keys()))\n#         fill_data.append(random_score)\n    \n#     random.shuffle(fill_data)\n#     fill_data = pd.Series(fill_data)\n#     SCORE = pd.concat([SCORE, fill_data])\n    \n#     return SCORE\n\n# y_train2 = filling(p1, y_train2)\n# # print(len(y_train2))\n# y_train2 = filling(p2, y_train2)\n# # print(len(y_train2))\n# y_train2 = filling(p3, y_train2)\n# # print(len(y_train2))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.469614Z","iopub.status.idle":"2024-12-13T20:45:29.470049Z","shell.execute_reply.started":"2024-12-13T20:45:29.469811Z","shell.execute_reply":"2024-12-13T20:45:29.469860Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"n_splits = 5\n\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)\n\ndef TrainML(model_class, X_train, y_train, test_data):\n    \n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)\n    \n    train_S = []\n    test_S = []\n    \n    oof_non_rounded = np.zeros(len(y_train), dtype=float) \n    oof_rounded = np.zeros(len(y_train), dtype=int) \n    test_preds = np.zeros((len(test_data), n_splits))\n\n    for fold, (train_idx, test_idx) in enumerate(tqdm(SKF.split(X_train, y_train), desc=\"Training Folds\", total=n_splits)):\n        X_train_fold, X_val_fold = X_train[train_idx], X_train[test_idx]\n        y_train_fold, y_val_fold = y_train[train_idx], y_train[test_idx]\n\n        model = clone(model_class)\n        model.fit(X_train_fold, y_train_fold)\n\n        y_train_pred = model.predict(X_train_fold)\n        y_val_pred = model.predict(X_val_fold)\n\n        oof_non_rounded[test_idx] = y_val_pred\n        y_val_pred_rounded = y_val_pred.round(0).astype(int)\n        oof_rounded[test_idx] = y_val_pred_rounded\n\n        train_kappa = quadratic_weighted_kappa(y_train_fold, y_train_pred.round(0).astype(int))\n        val_kappa = quadratic_weighted_kappa(y_val_fold, y_val_pred_rounded)\n\n        train_S.append(train_kappa)\n        test_S.append(val_kappa)\n        \n        test_preds[:, fold] = model.predict(test_data)\n        \n        print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")\n        clear_output(wait=True)\n\n    print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\")\n    print(f\"Mean Validation QWK ---> {np.mean(test_S):.4f}\")\n\n    KappaOPtimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y_train, oof_non_rounded), \n                              method='Nelder-Mead')\n    assert KappaOPtimizer.success, \"Optimization did not converge.\"\n    \n    oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x)\n    tKappa = quadratic_weighted_kappa(y_train, oof_tuned)\n\n    print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {tKappa:.3f}{Style.RESET_ALL}\")\n\n    tpm = test_preds.mean(axis=1)\n    tp_rounded = threshold_Rounder(tpm, KappaOPtimizer.x)\n\n    return tp_rounded\n\n# 假設 X_train_resampled1, y_train_resampled1 是訓練集數據，X_test 是測試集數據\nX_train = X_train.values\ny_train = y_train1.values.reshape(-1, 1)\nX_test = test_df.values\n\n# 訓練集與測試集的數據進行模型訓練\nimputer = SimpleImputer(strategy='median')\n\nensemble = StackingRegressor(estimators=[\n    ('lgb', Pipeline(steps=[('imputer', imputer), ('regressor', LGBMRegressor(random_state=42))])),\n    ('xgb', Pipeline(steps=[('imputer', imputer), ('regressor', XGBRegressor(random_state=42))])),\n    ('cat', Pipeline(steps=[('imputer', imputer), ('regressor', CatBoostRegressor(random_state=42, silent=True))])),\n    ('rf', Pipeline(steps=[('imputer', imputer), ('regressor', RandomForestRegressor(random_state=42))])),\n    ('gb', Pipeline(steps=[('imputer', imputer), ('regressor', GradientBoostingRegressor(random_state=42))]))\n])\n\nSubmission = TrainML(ensemble, X_train, y_train, X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.472291Z","iopub.status.idle":"2024-12-13T20:45:29.472882Z","shell.execute_reply.started":"2024-12-13T20:45:29.472569Z","shell.execute_reply":"2024-12-13T20:45:29.472603Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\nSubmission = pd.DataFrame({\n    'id': test_df['id'],\n    'sii': Submission\n})\n\nSubmission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.474752Z","iopub.status.idle":"2024-12-13T20:45:29.475347Z","shell.execute_reply.started":"2024-12-13T20:45:29.475041Z","shell.execute_reply":"2024-12-13T20:45:29.475074Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.476529Z","iopub.status.idle":"2024-12-13T20:45:29.477092Z","shell.execute_reply.started":"2024-12-13T20:45:29.476784Z","shell.execute_reply":"2024-12-13T20:45:29.476817Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# pd.set_option('display.max_columns', None)\n# X_train_resampled1\n# y_train_resampled1","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.479364Z","iopub.status.idle":"2024-12-13T20:45:29.479744Z","shell.execute_reply.started":"2024-12-13T20:45:29.479570Z","shell.execute_reply":"2024-12-13T20:45:29.479590Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# pd.set_option('display.max_rows', None)\n# y_train2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.481215Z","iopub.status.idle":"2024-12-13T20:45:29.481585Z","shell.execute_reply.started":"2024-12-13T20:45:29.481412Z","shell.execute_reply":"2024-12-13T20:45:29.481431Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# X_train = X_train_resampled1.values\n# y_train = y_train_resampled1.values.reshape(-1, 1)\n# X_test = test_df.values\n\n# model = RandomForestClassifier(random_state=0)\n# model.fit(X_train, y_train)\n\n# test_df['sii'] = model.predict(X_test)\n\n# submit_df1 = pd.concat([test_id, test_df['sii']], axis=1)\n# submit_df1['sii'] = submit_df1['sii'].astype(int)\n\n# model = CatBoostClassifier(\n#     learning_rate=0.05,\n#     depth=6,\n#     iterations=200,\n#     random_seed=0,\n# )\n# model.fit(X_train, y_train)\n# test_df['sii'] = model.predict(X_test)\n\n# submit_df4 = pd.concat([test_id, test_df['sii']], axis=1)\n# submit_df4['sii'] = submit_df4['sii'].astype(int)\n\n# model = RandomForestRegressor(random_state=0)\n# model.fit(X_train, y_train2)\n\n# test_df['PCIAT-PCIAT_Total'] = model.predict(X_test)\n\n# submit_df2 = pd.concat([test_id, test_df['PCIAT-PCIAT_Total']], axis=1)\n# submit_df2['PCIAT-PCIAT_Total'] = submit_df2['PCIAT-PCIAT_Total'].astype(int)\n\n# lgbm_model = LGBMRegressor(\n#     learning_rate=0.046,\n#     max_depth=12,\n#     num_leaves=478,\n#     min_data_in_leaf=13,\n#     feature_fraction=0.893,\n#     bagging_fraction=0.784,\n#     bagging_freq=4,\n#     lambda_l1=10,  # Increased from 6.59\n#     lambda_l2=0.01,  # Increased from 2.68e-06\n#     device='cpu'\n# )\n# lgbm_model.fit(X_train, y_train2)\n\n# # 用 LGBMRegressor 預測測試集\n# test_df['PCIAT-PCIAT_Total'] = lgbm_model.predict(X_test)\n\n# # 創建 submit_df2，並加入 LGBMRegressor 預測結果\n# submit_df3 = pd.concat([test_id, test_df['PCIAT-PCIAT_Total']], axis=1)\n# submit_df3['PCIAT-PCIAT_Total'] = submit_df3['PCIAT-PCIAT_Total'].astype(int)\n\n# model = CatBoostRegressor(\n#     learning_rate=0.05,\n#     depth=6,\n#     iterations=200,\n#     random_seed=0,\n#     verbose=0,\n#     l2_leaf_reg=10,\n#     task_type='CPU'\n# )\n# model.fit(X_train, y_train2)\n\n# test_df['PCIAT-PCIAT_Total'] = model.predict(X_test)\n\n# submit_df5 = pd.concat([test_id, test_df['PCIAT-PCIAT_Total']], axis=1)\n# submit_df5['PCIAT-PCIAT_Total'] = submit_df5['PCIAT-PCIAT_Total'].astype(int)\n# # X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)\n\n# # y_train = y_train.ravel()\n# # y_val = y_val.ravel()\n\n# # model = TabNetClassifier(\n# #     n_d=64,              # Width of the decision prediction layer\n# #     n_a=64,              # Width of the attention embedding for each step\n# #     n_steps=5,           # Number of steps in the architecture\n# #     gamma=1.5,           # Coefficient for feature selection regularization\n# #     n_independent=2,     # Number of independent GLU layer in each GLU block\n# #     n_shared=2,          # Number of shared GLU layer in each GLU block\n# #     lambda_sparse=1e-4,  # Sparsity regularization\n# #     optimizer_fn=torch.optim.Adam,\n# #     optimizer_params=dict(lr=2e-2, weight_decay=1e-5),\n# #     mask_type='entmax',\n# #     scheduler_params=dict(mode=\"min\", patience=10, min_lr=1e-5, factor=0.5),\n# #     scheduler_fn=torch.optim.lr_scheduler.ReduceLROnPlateau,\n# #     verbose=1,\n# #     device_name='cuda' if torch.cuda.is_available() else 'cpu'\n# # )\n\n\n# # # 訓練 TabNet 模型\n# # model.fit(\n# #     X_train, y_train,\n# #     eval_set=[(X_val, y_val)],    # 指定驗證集\n# #     eval_name=['val'],            # 命名驗證集\n# #     eval_metric=['logloss'],\n# #     max_epochs=500,      \n# #     patience=50,          \n# #     batch_size=1024,\n# #     virtual_batch_size=128,\n# #     num_workers=0,\n# #     drop_last=False,\n# # )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.483596Z","iopub.status.idle":"2024-12-13T20:45:29.484158Z","shell.execute_reply.started":"2024-12-13T20:45:29.483865Z","shell.execute_reply":"2024-12-13T20:45:29.483894Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def transfer_sii(row):\n#     if row <= 30:\n#         return 0\n#     elif 30 < row < 50:\n#         return 1\n#     elif 50 <= row < 80:\n#         return 2\n#     elif 80 <= row:\n#         return 3\n\n# submit_df2['sii'] = submit_df2['PCIAT-PCIAT_Total'].apply(transfer_sii)\n# submit_df2 = submit_df2.drop(columns=['PCIAT-PCIAT_Total'])\n\n# submit_df3['sii'] = submit_df3['PCIAT-PCIAT_Total'].apply(transfer_sii)\n# submit_df3 = submit_df3.drop(columns=['PCIAT-PCIAT_Total'])\n\n# submit_df5['sii'] = submit_df5['PCIAT-PCIAT_Total'].apply(transfer_sii)\n# submit_df5 = submit_df5.drop(columns=['PCIAT-PCIAT_Total'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.485660Z","iopub.status.idle":"2024-12-13T20:45:29.486112Z","shell.execute_reply.started":"2024-12-13T20:45:29.485876Z","shell.execute_reply":"2024-12-13T20:45:29.485895Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# submit_df1","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.487285Z","iopub.status.idle":"2024-12-13T20:45:29.487628Z","shell.execute_reply.started":"2024-12-13T20:45:29.487466Z","shell.execute_reply":"2024-12-13T20:45:29.487483Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# submit_df2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.489058Z","iopub.status.idle":"2024-12-13T20:45:29.489476Z","shell.execute_reply.started":"2024-12-13T20:45:29.489269Z","shell.execute_reply":"2024-12-13T20:45:29.489287Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# submit_df3","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.490441Z","iopub.status.idle":"2024-12-13T20:45:29.490798Z","shell.execute_reply.started":"2024-12-13T20:45:29.490603Z","shell.execute_reply":"2024-12-13T20:45:29.490620Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# submit_df4","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.492394Z","iopub.status.idle":"2024-12-13T20:45:29.492718Z","shell.execute_reply.started":"2024-12-13T20:45:29.492561Z","shell.execute_reply":"2024-12-13T20:45:29.492578Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# submit_df5","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.494194Z","iopub.status.idle":"2024-12-13T20:45:29.494516Z","shell.execute_reply.started":"2024-12-13T20:45:29.494359Z","shell.execute_reply":"2024-12-13T20:45:29.494375Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# combined = pd.DataFrame({\n#     'id': submit_df1['id'],\n#     'sii_1': submit_df1['sii'],\n#     'sii_2': submit_df2['sii'],\n#     'sii_3': submit_df3['sii'],\n#     'sii_4': submit_df4['sii'],\n#     'sii_5': submit_df5['sii'],\n# })\n\n# def majority_vote(row):\n#     return row.mode()[0]\n\n# combined['final_sii'] = combined[['sii_1', 'sii_2', 'sii_3', 'sii_4', 'sii_5']].apply(majority_vote, axis=1)\n\n# sum_submission = combined[['id', 'final_sii']].rename(columns={'final_sii': 'sii'})\n# sum_submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T20:45:29.496744Z","iopub.status.idle":"2024-12-13T20:45:29.497157Z","shell.execute_reply.started":"2024-12-13T20:45:29.496978Z","shell.execute_reply":"2024-12-13T20:45:29.497002Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}