From 23a7fdeb86cd722edc16c6465dce85a4bd5fbb19 Mon Sep 17 00:00:00 2001 From: Billy152op <84769275+Billy152op@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:40:14 +0800 Subject: [PATCH 1/3] Add files via upload Add time-series data processing Add TabNet --- DM_FinalProject.ipynb | 1 + 1 file changed, 1 insertion(+) create mode 100644 DM_FinalProject.ipynb diff --git a/DM_FinalProject.ipynb b/DM_FinalProject.ipynb new file mode 100644 index 0000000..1629ff3 --- /dev/null +++ b/DM_FinalProject.ipynb @@ -0,0 +1 @@ +{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":7453542,"sourceType":"datasetVersion","datasetId":921302}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:21:31.777954Z","iopub.execute_input":"2024-11-13T02:21:31.778382Z","iopub.status.idle":"2024-11-13T02:22:03.498711Z","shell.execute_reply.started":"2024-11-13T02:21:31.778345Z","shell.execute_reply":"2024-11-13T02:22:03.497290Z"}},"outputs":[],"execution_count":49},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nfrom pytorch_tabnet.tab_model import TabNetClassifier, TabNetRegressor\nfrom pytorch_tabnet.callbacks import Callback\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom sklearn.preprocessing import StandardScaler","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.501829Z","iopub.execute_input":"2024-11-13T02:22:03.502726Z","iopub.status.idle":"2024-11-13T02:22:03.509700Z","shell.execute_reply.started":"2024-11-13T02:22:03.502688Z","shell.execute_reply":"2024-11-13T02:22:03.508849Z"}},"outputs":[],"execution_count":50},{"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-11-13T02:22:03.510903Z","iopub.execute_input":"2024-11-13T02:22:03.511158Z","iopub.status.idle":"2024-11-13T02:22:03.583895Z","shell.execute_reply.started":"2024-11-13T02:22:03.511129Z","shell.execute_reply":"2024-11-13T02:22:03.582950Z"}},"outputs":[],"execution_count":51},{"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-11-13T02:22:03.585273Z","iopub.execute_input":"2024-11-13T02:22:03.586795Z","iopub.status.idle":"2024-11-13T02:22:03.598238Z","shell.execute_reply.started":"2024-11-13T02:22:03.586760Z","shell.execute_reply":"2024-11-13T02:22:03.597344Z"}},"outputs":[],"execution_count":52},{"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-11-13T02:22:03.601120Z","iopub.execute_input":"2024-11-13T02:22:03.601575Z","iopub.status.idle":"2024-11-13T02:22:03.623005Z","shell.execute_reply.started":"2024-11-13T02:22:03.601533Z","shell.execute_reply":"2024-11-13T02:22:03.621956Z"}},"outputs":[],"execution_count":53},{"cell_type":"code","source":"df = train_df.dropna(axis=1, thresh=len(train_df) - 3000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.624384Z","iopub.execute_input":"2024-11-13T02:22:03.624731Z","iopub.status.idle":"2024-11-13T02:22:03.637543Z","shell.execute_reply.started":"2024-11-13T02:22:03.624698Z","shell.execute_reply":"2024-11-13T02:22:03.636644Z"}},"outputs":[],"execution_count":54},{"cell_type":"code","source":"def process_file(filename, dirname):\n df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n df.drop('step', axis=1, inplace=True)\n return df.describe().values.reshape(-1), filename.split('=')[1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.638742Z","iopub.execute_input":"2024-11-13T02:22:03.639033Z","iopub.status.idle":"2024-11-13T02:22:03.653571Z","shell.execute_reply.started":"2024-11-13T02:22:03.639000Z","shell.execute_reply":"2024-11-13T02:22:03.652709Z"}},"outputs":[],"execution_count":55},{"cell_type":"code","source":"def load_time_series(dirname) -> pd.DataFrame:\n ids = os.listdir(dirname)\n \n with ThreadPoolExecutor() as executor:\n results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n \n stats, indexes = zip(*results)\n \n df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))])\n df['id'] = indexes\n \n return df\n\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\n\ndef feature_engineering(df):\n season_cols = [col for col in df.columns if 'Season' in col]\n df = df.drop(season_cols, axis=1) \n df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age']\n df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n df['BMI_Internet_Hours'] = df['Physical-BMI'] * df['PreInt_EduHx-computerinternet_hoursday']\n df['BFP_BMI'] = df['BIA-BIA_Fat'] / df['BIA-BIA_BMI']\n df['FFMI_BFP'] = df['BIA-BIA_FFMI'] / df['BIA-BIA_Fat']\n df['FMI_BFP'] = df['BIA-BIA_FMI'] / df['BIA-BIA_Fat']\n df['LST_TBW'] = df['BIA-BIA_LST'] / df['BIA-BIA_TBW']\n df['BFP_BMR'] = df['BIA-BIA_Fat'] * df['BIA-BIA_BMR']\n df['BFP_DEE'] = df['BIA-BIA_Fat'] * df['BIA-BIA_DEE']\n df['BMR_Weight'] = df['BIA-BIA_BMR'] / df['Physical-Weight']\n df['DEE_Weight'] = df['BIA-BIA_DEE'] / df['Physical-Weight']\n df['SMM_Height'] = df['BIA-BIA_SMM'] / df['Physical-Height']\n df['Muscle_to_Fat'] = df['BIA-BIA_SMM'] / df['BIA-BIA_FMI']\n df['Hydration_Status'] = df['BIA-BIA_TBW'] / df['Physical-Weight']\n df['ICW_TBW'] = df['BIA-BIA_ICW'] / df['BIA-BIA_TBW']\n \n return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.654988Z","iopub.execute_input":"2024-11-13T02:22:03.655301Z","iopub.status.idle":"2024-11-13T02:22:03.670953Z","shell.execute_reply.started":"2024-11-13T02:22:03.655269Z","shell.execute_reply":"2024-11-13T02:22:03.670145Z"}},"outputs":[],"execution_count":56},{"cell_type":"code","source":"# 把SII是空的column刪除\ntrain_df = train_df.dropna(subset=['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.671812Z","iopub.execute_input":"2024-11-13T02:22:03.672082Z","iopub.status.idle":"2024-11-13T02:22:03.689356Z","shell.execute_reply.started":"2024-11-13T02:22:03.672052Z","shell.execute_reply":"2024-11-13T02:22:03.688536Z"}},"outputs":[],"execution_count":57},{"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-11-13T02:22:03.690459Z","iopub.execute_input":"2024-11-13T02:22:03.690754Z","iopub.status.idle":"2024-11-13T02:22:05.212628Z","shell.execute_reply.started":"2024-11-13T02:22:03.690714Z","shell.execute_reply":"2024-11-13T02:22:05.211733Z"}},"outputs":[],"execution_count":58},{"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-11-13T02:22:05.213705Z","iopub.execute_input":"2024-11-13T02:22:05.213980Z","iopub.status.idle":"2024-11-13T02:22:05.223670Z","shell.execute_reply.started":"2024-11-13T02:22:05.213950Z","shell.execute_reply":"2024-11-13T02:22:05.222698Z"}},"outputs":[],"execution_count":59},{"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 df[c] = df[c].fillna('Missing')\n df[c] = df[c].astype('category')\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-11-13T02:22:05.224804Z","iopub.execute_input":"2024-11-13T02:22:05.225082Z","iopub.status.idle":"2024-11-13T02:22:05.268967Z","shell.execute_reply.started":"2024-11-13T02:22:05.225050Z","shell.execute_reply":"2024-11-13T02:22:05.268264Z"}},"outputs":[],"execution_count":60},{"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-11-13T02:22:05.269975Z","iopub.execute_input":"2024-11-13T02:22:05.270259Z","iopub.status.idle":"2024-11-13T02:22:05.320255Z","shell.execute_reply.started":"2024-11-13T02:22:05.270221Z","shell.execute_reply":"2024-11-13T02:22:05.319329Z"}},"outputs":[],"execution_count":61},{"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-11-13T02:22:05.324201Z","iopub.execute_input":"2024-11-13T02:22:05.324603Z","iopub.status.idle":"2024-11-13T02:22:05.330044Z","shell.execute_reply.started":"2024-11-13T02:22:05.324568Z","shell.execute_reply":"2024-11-13T02:22:05.329145Z"}},"outputs":[],"execution_count":62},{"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-11-13T02:22:05.331055Z","iopub.execute_input":"2024-11-13T02:22:05.331355Z","iopub.status.idle":"2024-11-13T02:22:05.355510Z","shell.execute_reply.started":"2024-11-13T02:22:05.331310Z","shell.execute_reply":"2024-11-13T02:22:05.354710Z"}},"outputs":[{"name":"stdout","text":"Basic_Demos-Sex -0.094312\nPhysical-Diastolic_BP 0.066374\nPhysical-HeartRate -0.035771\nPAQ-PAQ_Total -0.042217\nFitness_Endurance-Max_Stage -0.020330\nFitness_Endurance-Time_Mins -0.038346\nFitness_Endurance-Time_Sec 0.001800\nFGC-FGC_SRL -0.073663\nFGC-FGC_SRR -0.064219\nBIA-BIA_Activity_Level_num 0.075633\nBIA-BIA_BMC -0.007859\nBIA-BIA_BMR 0.028779\nBIA-BIA_DEE 0.041886\nBIA-BIA_ECW 0.027491\nBIA-BIA_FFM 0.028779\nBIA-BIA_FFMI 0.085982\nBIA-BIA_FMI 0.066753\nBIA-BIA_Fat 0.031164\nBIA-BIA_ICW 0.041286\nBIA-BIA_LDM 0.019975\nBIA-BIA_LST 0.059496\nBIA-BIA_SMM 0.041344\nBIA-BIA_TBW 0.033559\nName: PCIAT-PCIAT_Total, dtype: float64\n","output_type":"stream"}],"execution_count":63},{"cell_type":"code","source":"plt.figure(figsize=(8, 6))\nfiltered_corr.sort_values().plot(kind='barh', color='coral')\nplt.title('Features with Correlation > 0.1 or < -0.1 with PCIAT-PCIAT_Total')\nplt.xlabel('Correlation coefficient')\nplt.ylabel('Features')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:05.356620Z","iopub.execute_input":"2024-11-13T02:22:05.356927Z","iopub.status.idle":"2024-11-13T02:22:05.731893Z","shell.execute_reply.started":"2024-11-13T02:22:05.356894Z","shell.execute_reply":"2024-11-13T02:22:05.730934Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"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cHFxAfAmGW3dujXWr1+PO3fuiPf/NmnSBLm5uXjw4IFYV/5S2NDkunXr4tSpU3Lr3n1dEmpqauL9z0RERERUPTEBJvrAuLq6QkdHByEhIeJ9r/kmTJiAAwcO4NatWzhz5gyOHDkCBwcHhfUEBATg1KlTGD16NM6fP48rV65g1apVePToEfT19WFoaIg1a9bg+vXrOHz4MCZNmlSmeDt16oRt27YhOzsbTZs2Fdd37NgRy5cvFyfLAgB7e3sMHjwYQ4cORWRkJG7duoWTJ09iwYIF2Lt3r8L6x44di/Xr12PDhg24du0aQkJCcP78+VLP5GxlZYX4+Hj8888/ePToUZmOlYiIiIiqNibARB8YJSUleHt7Izc3F0OHDpXblpubCz8/Pzg4OMDNzQ329vZyk1y9zd7eHjExMTh37hxatmyJNm3aYNeuXVBRUYGSkhK2bduGv/76C/Xr18fEiRPxzTfflCneTp064dmzZ3B2dpbr8e7YsSOePXsmPi4pX1hYGIYOHYrJkyejbt26+Pzzz3Hq1CnUrl1bYf2DBw9GQEAApkyZgqZNm+LWrVvw9vaGurp6qeIMDg5GcnIy6tSpAyMjozIdKxERERFVbRLh7RsQieiDMHz4cDx8+FDu+cH0P926dYOJiYncI6MqSkZGBnR1dZHu3wM6UtXidyAiIqLKEbizsiOgSiJ+X0tPh46OTpFlOQkW0QckPT0dFy5cwJYtW5j8/r+srCz89NNPcHV1hbKyMrZu3YpDhw7h4MGD/20gAVuAYj5QiYiIiOjDxgSY6APSs2dPnDx5Er6+vujWrVtlh/NBkEgkiI6Oxrx585CdnY26devi119/RdeuXSs7NCIiIiKqYjgEmoioCKUZUkNERERE/73SfF/jJFhERERERERULTABJiIiIiIiomqBCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgUmwERERERERFQtMAEmIiIiIiKiaoEJMBEREREREVULTICJiIiIiIioWmACTERERERERNWCSmUHQERUJSwYBEhVKzsKIqKqKXBnZUdARASAPcBERERERERUTTABJiIiIiIiomqBCTARERERERFVC0yAiT5w3t7ekEgkBZbr168DAO7fv4/x48fD1tYW6urqqFmzJpydnbFq1SpkZWXJ1XX27Fn069cPNWvWhLq6Ouzs7DBy5EhcvXq10Pbj4uIUtj9z5kyxjCAIWLt2Ldq0aQMdHR3IZDI4OTlh/PjxYpz5MjIy8PXXX6NevXpQV1eHiYkJunbtisjISAiCUKJzcv36dfj4+MDc3BxSqRTW1tYYOHAgTp8+DQBITk6GRCJBYmJigX1dXFwwYcKEErVDRERERB8XToJFVAW4ubkhLCxMbp2RkRFu3rwJZ2dn6OnpYf78+WjQoAGkUikuXLiANWvWoFatWvjss88AAFFRUejTpw9cXV0RERGBOnXq4MGDB9ixYwdmzZqF7du3FxlDUlISdHR0xNcymQzAm+R30KBB+O233zBjxgx89913MDMzw71797Bz506EhIQgPDwcAPD06VO0a9cO6enpCAkJQYsWLaCiooKjR49i2rRp6Ny5M/T09IqM4/Tp0+jSpQvq16+P1atXo169enj27Bl27dqFyZMn4+jRo6U8u0RERERUXTABJqoCpFIpTExMCqwfPXo0VFRUcPr0aWhpaYnrbWxs0LNnT7FHNSsrCz4+PujevTt27vzfTJzW1tZo1aoVnj59WmwMxsbGCpPT7du3Y9u2bdi1a5eYbANA7dq10bp1a7le3RkzZiA5ORlXr16FmZmZuN7e3h4DBw6Eurp6kTEIggBvb2/Y2dkhISEBSkr/G8TSuHFjjB8/vtjjKE5OTg5ycnLE1xkZGe9dJxERERF9GDgEmqiKSktLQ0xMDPz8/OSS37dJJBIAwIEDB/Do0SNMmzZNYbniel2LsnXrVtStW1cu+VUUQ15eHrZt24bBgwfLJb/5ZDIZVFSK/k0uMTERFy9exOTJk+WS33zvcxz5FixYAF1dXXGxsLB47zqJiIiI6MPABJioCoiKioJMJhOXfv364fr16xAEAXXr1pUrW6NGDbHc9OnTAQDXrl0DANSrV6/MMZibm8vFkJaWBgC4evVqgRgmTJggljM3NwcAPHr0CE+ePHmvGMrjOIoTEBCA9PR0cblz506FtUVERERE/y0OgSaqAjp16oRVq1aJr7W0tJCSkqKw7MmTJ5GXl4fBgweLQ3lLOrmUk5MTbt++DQBo37499u3bJ25LSEiAtra2+FpfX7/Qer7++muMGTMGkZGRmD9/fqliKEp51FEcqVQKqVRa4e0QERER0X+PCTBRFaClpQVbW1u5dWpqapBIJEhKSpJbb2NjAwDQ0NAQ19nb2wMArly5gjZt2hTaTnR0NF69elVgf+DN/cKKhhjb2dkViMHIyAhGRkYwNjaWW6enp4crV64U2n5x3j6OJk2aFFouf7Ku9PT0AtuePn0KXV3dMsdARERERFUXh0ATVVGGhobo1q0bVqxYgefPnxdZ9pNPPkGNGjWwePFihdvzJ8GytLSEra0tbG1tUatWrRLFMXDgQCQlJWHXrl1FllNSUsKAAQMQERGBe/fuFdiemZmJ169fF1lH48aN4ejoiKVLlyIvL6/Q4zAwMECNGjXw119/yW3PyMjA9evXxUSaiIiIiKoXJsBEVdjKlSvx+vVrNG/eHNu3b8fly5eRlJSEzZs348qVK1BWVgbwpgd53bp12Lt3Lz777DMcOnQIycnJOH36NKZNmwZfX98yxzBgwAD07dsXAwYMQHBwMP78808kJyfj6NGj2L59uxgDAMybNw8WFhZo1aoVNm7ciEuXLuHatWsIDQ1FkyZNkJmZWWRbEokEYWFhuHr1Ktq3b4/o6GjcvHkT58+fx7x589CzZ0+x7KRJkzB//nxERETgxo0bOHnyJAYPHgwjIyP07t27zMdLRERERFUXh0ATVWF16tTB2bNnMX/+fAQEBODu3buQSqVwdHTElClTMHr0aLFsz549ceLECSxYsACDBg1CRkYGLCws0LlzZ4SEhJQ5BolEgu3bt2Pt2rUICwvD4sWL8erVK5ibm6NLly749ttvxbIGBgb4448/sHDhQoSEhOD27dvQ19dHgwYN8M0335RoaHLLli1x+vRpzJs3DyNHjsSjR49gamqKtm3b4vvvvxfLTZs2DTKZDIsWLcKNGzdgYGAAZ2dnHDlypMDwbiIiIiKqHiTCfzGrDBFRFZWRkQFdXV2k+/eAjlS1ssMhIqqaAncWX4aIqIzE72vp6eJcMIVhDzARUUkEbAGK+UAlIiIiog8b7wEmog9GQkKC3LOG312IiIiIiN4He4CJ6IPRvHlzJCYmVnYYRERERPSRYgJMRB8MDQ2NAs87JiIiIiIqLxwCTURERERERNUCE2AiIiIiIiKqFpgAExERERERUbXABJiIiIiIiIiqBSbAREREREREVC0wASYiIiIiIqJqgQkwERERERERVQtMgImIiIiIiKhaYAJMRERERERE1QITYCIiIiIiIqoWmAATERERERFRtaBS2QEQEVUJCwYBUtXKjoKI6MMWuLOyIyAiKhJ7gImIiIiIiKhaYAJMRERERERE1QITYKKPQHh4OPT09Cqs/ri4OEgkEjx9+rRc6ktOToZEIkFiYmK51EdEREREVBJMgImqCG9vb0gkEkgkEqipqcHW1hbBwcF4/fp1hbfdtm1bpKamQldXt8Lbyufi4iIer0QiQc2aNdGvXz/cvn1bLJOfSCsrK+Off/6R2z81NRUqKiqQSCRITk6WK8/Em4iIiKh6YgJMVIW4ubkhNTUV165dw+TJkxEYGIhvvvmmwttVU1ODiYkJJBJJhbf1tpEjRyI1NRX37t3Drl27cOfOHQwZMqRAuVq1amHjxo1y6zZs2IBatWr9V6ESERERURXABJioCpFKpTAxMYGlpSW++uordO3aFbt37xa3HzhwAA4ODpDJZGKyDADx8fFQVVXF/fv35eqbMGEC2rdvDwC4ffs2PDw8oK+vDy0tLTg5OSE6OhqA4iHQx48fh4uLCzQ1NaGvrw9XV1c8efIEALB//360a9cOenp6MDQ0xKeffoobN26U+ng1NTVhYmICU1NTtG7dGmPGjMGZM2cKlPPy8kJYWJjcurCwMHh5eZW6TSIiIiL6eDEBJqrCNDQ08PLlSwBAVlYWlixZgk2bNiE+Ph4pKSmYMmUKAKBDhw6wsbHBpk2bxH1fvXqFiIgIDBs2DADg5+eHnJwcxMfH48KFC1i0aBFkMpnCdhMTE9GlSxc4Ojri999/x7Fjx+Dh4YHc3FwAwPPnzzFp0iScPn0asbGxUFJSQq9evZCXl1fmY338+DF+/vlntGrVqsC2zz77DE+ePMGxY8cAAMeOHcOTJ0/g4eFR6nZycnKQkZEhtxARERHRx4HPASaqggRBQGxsLA4cOICxY8cCeJPQ/vTTT6hTpw4AYMyYMQgODhb3GT58OMLCwjB16lQAwJ49e5CdnQ1PT08AQEpKCvr06YMGDRoAAGxsbAptf/HixWjevDlWrlwprnNychL/3adPH7nyoaGhMDIywqVLl1C/fv0SH+fKlSuxbt06CIKArKws2Nvb48CBAwXKqaqqYsiQIQgNDUW7du0QGhqKIUOGQFW19M/tXbBgAYKCgkq9HxERERF9+NgDTFSFREVFQSaTQV1dHe7u7ujfvz8CAwMBvBkunJ/8AoCpqSkePHggvvb29sb169fxxx9/AHgzc7Snpye0tLQAAOPGjUNISAicnZ0xZ84cnD9/vtA48nuAC3Pt2jUMHDgQNjY20NHRgZWVFYA3SbYiTk5OkMlkkMlkcHd3F9cPHjwYiYmJOHfuHI4dOwZbW1t88sknePbsWYE6hg0bhh07duD+/fvYsWOH2LNdWgEBAUhPTxeXO3fulKkeIiIiIvrwsAeYqArp1KkTVq1aBTU1NZiZmUFF5X9v4Xd7OyUSCQRBEF8bGxvDw8MDYWFhsLa2xr59+xAXFyduHzFiBFxdXbF3717ExMRgwYIFWLp0qdjD/DYNDY0i4/Tw8IClpSXWrl0LMzMz5OXloX79+uJw7XdFR0fj1atXBerW1dWFra0tAMDW1hbr16+Hqakptm/fjhEjRsjV0aBBA9SrVw8DBw6Eg4MD6tevX6bZnqVSKaRSaan3IyIiIqIPH3uAiaoQLS0t2Nraonbt2nLJb0mNGDEC27dvx5o1a1CnTh04OzvLbbewsICvry8iIyMxefJkrF27VmE9DRs2RGxsrMJtaWlpSEpKwsyZM9GlSxc4ODiIk2MVxtLSEra2trC1tS1y5mZlZWUAwIsXLxRuHzZsGOLi4src+0tEREREHzf2ABNVI66urtDR0UFISIjc/cHAmxmh3d3dYW9vjydPnuDIkSNwcHBQWE9AQAAaNGiA0aNHw9fXF2pqajhy5Aj69esHAwMDGBoaYs2aNTA1NUVKSgr8/f3LFG9WVpY4c/W///6LuXPnQl1dHZ988onC8iNHjkS/fv2gp6dXpvaIiIiI6OPGHmCiakRJSQne3t7Izc3F0KFD5bbl5ubCz88PDg4OcHNzg729vdwkV2+zt7dHTEwMzp07h5YtW6JNmzbYtWsXVFRUoKSkhG3btuGvv/5C/fr1MXHixDI/q3jt2rUwNTWFqakpOnXqhEePHiE6Ohp169ZVWF5FRQU1atQoU+84EREREX38JMLbNwkS0Udv+PDhePjwodzzg6lwGRkZ0NXVRbp/D+hISz+rNBFRtRK4s7IjIKJqSPy+lp4OHR2dIsuym4SomkhPT8eFCxewZcsWJr9EREREVC0xASaqJnr27ImTJ0/C19cX3bp1q+xwqp6ALUAxvygSERER0YeNCTBRNfH2I4+IiIiIiKojToJFRERERERE1QITYCIiIiIiIqoWmAATERERERFRtcAEmIiIiIiIiKoFJsBERERERERULTABJiIiIiIiomqBCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgUmwERERERERFQtqFR2AEREVcKCQYBUtbKjICL6sATurOwIiIhKhT3AREREREREVC0wASYiIiIiIqJqgQkwEVU53t7e+Pzzzys7DCIiIiKqYpgAE5XBw4cP8dVXX6F27dqQSqUwMTGBq6srjh8/DgCwsrKCRCKBRCKBhoYGrKys4OnpicOHDxeoa+fOnWjdujV0dXWhra0NJycnTJgwocj2s7KyEBAQgDp16kBdXR1GRkbo2LEjdu3aJZZxcXERY5BKpahVqxY8PDwQGRlZoL6jR4+ic+fOMDAwgKamJuzs7ODl5YWXL18WGYe3t7fYhqLFysqqyP1dXFyKPdb3UVRsEokEgYGBFdY2EREREX14mAATlUGfPn1w9uxZbNiwAVevXsXu3bvh4uKCtLQ0sUxwcDBSU1ORlJSEjRs3Qk9PD127dsW8efPEMrGxsejfvz/69OmDkydP4q+//sK8efPw6tWrItv39fVFZGQkli9fjitXrmD//v3o27evXPsAMHLkSKSmpuLGjRv49ddf4ejoiAEDBmDUqFFimUuXLsHNzQ3NmzdHfHw8Lly4gOXLl0NNTQ25ublFxvHDDz8gNTVVXAAgLCxMfH3q1KkSn9OK8HZs33//PXR0dOTWTZkypVLjIyIiIqL/FmeBJiqlp0+fIiEhAXFxcejYsSMAwNLSEi1btpQrp62tDRMTEwBA7dq10aFDB5iammL27Nno27cv6tatiz179sDZ2RlTp04V97O3ty92eO/u3bvxww8/oHv37gDe9Dg3a9asQDlNTU0xBnNzc7Ru3Rr16tXDsGHD4Onpia5duyImJgYmJiZYvHixuF+dOnXg5uZW7LnQ1dWFrq6u3Do9PT2xzaNHj2Lq1Kk4d+4cDAwM4OXlhZCQEKioqMDb2xtHjx7F0aNH8cMPPwAAbt26BQsLC4waNQqHDx/G/fv3Ubt2bYwePRrjx48vNp535ceRH6tEIpFbR0RERETVC3uAiUpJJpNBJpPht99+Q05OTqn2HT9+PARBEIcqm5iY4OLFi/j7779LVY+JiQmio6Px7NmzUu0HAF5eXtDX1xeHQpuYmCA1NRXx8fGlrqso//zzD7p3744WLVrg3LlzWLVqFdavX4+QkBAAb3qP27RpI/ZSp6amwsLCAnl5eTA3N8eOHTtw6dIlzJ49GzNmzMDPP/9crvEVJicnBxkZGXILEREREX0cmAATlZKKigrCw8OxYcMG6OnpwdnZGTNmzMD58+eL3dfAwADGxsZITk4GAIwdOxYtWrRAgwYNYGVlhQEDBiA0NLTYxHrNmjU4ceIEDA0N0aJFC0ycOFG8/7g4SkpKsLe3F2Po168fBg4ciI4dO8LU1BS9evXCihUr3jvxW7lyJSwsLLBixQrUq1cPn3/+OYKCgrB06VLk5eVBV1cXampqYi+1iYkJlJWVoaqqiqCgIDRv3hzW1tYYPHgwfHx8/rMEeMGCBWLPtq6uLiwsLP6TdomIiIio4jEBJiqDPn364N69e9i9ezfc3NwQFxeHpk2bIjw8vNh9BUGARCIBAGhpaWHv3r24fv06Zs6cCZlMhsmTJ6Nly5bIyspCSkqK2OMsk8kwf/58AECHDh1w8+ZNxMbGom/fvrh48SLat2+PuXPnlij+t2NQVlZGWFgY7t69i8WLF6NWrVqYP38+nJycxPt6y+Ly5cto06aN2A4AODs7IzMzE3fv3i1y3x9//BHNmjWDkZERZDIZ1qxZg5SUlDLHUhoBAQFIT08Xlzt37vwn7RIRERFRxWMCTFRG6urq6NatG2bNmoUTJ07A29sbc+bMKXKftLQ0PHz4ENbW1nLr69SpgxEjRmDdunU4c+YMLl26hO3bt8PMzAyJiYni4uvrK+6jqqqK9u3bY/r06YiJiUFwcDDmzp1b7MzNubm5uHbtWoEYatWqhS+++AIrVqzAxYsXkZ2djZ9++qmUZ+X9bdu2DVOmTMHw4cMRExODxMRE+Pj4FHtc5UUqlUJHR0duISIiIqKPAyfBIionjo6O+O2334os88MPP0BJSanISa6srKygqamJ58+fQ0VFBba2tiVu//Xr18jOzoaamlqh5TZs2IAnT56gT58+hZbR19eHqakpnj9/XqK2FXFwcMCvv/4q19t8/PhxaGtrw9zcHAAUzjR9/PhxtG3bFqNHjxbX3bhxo8xxEBERERHlK7cE+OnTp9DT0yuv6og+WGlpaejXrx+GDRuGhg0bQltbG6dPn8bixYvRs2dPsdyzZ89w//59vHr1Crdu3cLmzZuxbt06LFiwQExqAwMDkZWVhe7du8PS0hJPnz7FsmXL8OrVK3Tr1q3QGFxcXDBw4EA0b94choaGuHTpEmbMmIFOnTrJ9VhmZWXh/v37eP36Ne7evYudO3fiu+++w1dffYVOnToBAFavXo3ExET06tULderUQXZ2NjZu3IiLFy9i+fLlZT5Po0ePxvfff4+xY8dizJgxSEpKwpw5czBp0iQoKb0ZfGJlZYU///wTycnJkMlkMDAwgJ2dHTZu3IgDBw7A2toamzZtwqlTpwr0WBMRERERlVaZhkAvWrQI27dvF197enrC0NAQtWrVwrlz58otOKIPkUwmQ6tWrfDdd9+hQ4cOqF+/PmbNmoWRI0dixYoVYrnZs2fD1NQUtra2+OKLL5Ceno7Y2FhMnz5dLNOxY0fcvHkTQ4cORb169eDu7o779+8jJiYGdevWLTQGV1dXbNiwAZ988gkcHBwwduxYuLq6Fpgoau3atTA1NUWdOnXQu3dvcWj1ypUrxTItW7ZEZmYmfH194eTkhI4dO+KPP/7Ab7/9Jj7mqSxq1aqF6OhonDx5Eo0aNYKvry+GDx+OmTNnimWmTJkCZWVlODo6wsjICCkpKfjyyy/Ru3dv9O/fH61atUJaWppcbzARERERUVlJBEEQSruTtbU1IiIi0LZtWxw8eBCenp7Yvn07fv75Z6SkpCAmJqYiYiUi+s9lZGRAV1cX6f49oCNVrexwiIg+LIE7KzsCIqL/fV9LTy92/pYyDYG+f/+++GiQqKgoeHp64pNPPoGVlRVatWpVliqJiIiIiIiIKlSZEmB9fX3cuXMHFhYW2L9/P0JCQgC8ebTKuxPaEFHV5u7ujoSEBIXbZsyYgRkzZvzHEf1PSkoKHB0dC91+6dIl1K5du3waC9gCcEZoIiIioiqtTAlw7969MWjQINjZ2SEtLQ3u7u4AgLNnz5Z4xloiqhrWrVuHFy9eKNxmYGDwH0cjL/8xUUVtJyIiIiLKV6YE+LvvvoOVlRXu3LmDxYsXQyaTAQBSU1M5WQ3RR6ZWrVqVHUKhSvOYKCIiIiKiMk2CRURUXZRmUgUiIiIi+u+V5vtamR6DBACbNm1Cu3btYGZmhtu3bwMAvv/+e+zatausVRIRERERERFVmDIlwKtWrcKkSZPg7u6Op0+fihNf6enp4fvvvy/P+IiIiIiIiIjKRZkS4OXLl2Pt2rX4+uuvoaysLK5v3rw5Lly4UG7BEREREREREZWXMiXAt27dQpMmTQqsl0qleP78+XsHRURERERERFTeypQAW1tbK3z0yP79++Hg4PC+MRERERERERGVuzI9BmnSpEnw8/NDdnY2BEHAyZMnsXXrVixYsADr1q0r7xiJiIiIiIiI3luZEuARI0ZAQ0MDM2fORFZWFgYNGgQzMzP88MMPGDBgQHnHSERERERERPTeSp0Av379Glu2bIGrqysGDx6MrKwsZGZmwtjYuCLiIyIiIiIiIioXpb4HWEVFBb6+vsjOzgYAaGpqMvklIiIiIiKiD16ZJsFq2bIlzp49W96xEBEREREREVWYMt0DPHr0aEyePBl3795Fs2bNoKWlJbe9YcOG5RIcERERERERUXmRCIIglHYnJaWCHccSiQSCIEAikSA3N7dcgiMiqmwZGRnQ1dVFun8P6EhVKzscIvoYBO6s7AiIiD4q4ve19HTo6OgUWbZMPcC3bt0qU2BERERERERElaVMCbClpWV5x0FERERERERUocqUAG/cuLHI7UOHDi1TMEREREREREQVpUyzQI8fP15uGT16NLy9vTFq1ChMmDChnEMkIkW8vb0hkUjExdDQEG5ubjh//rxYRiKR4Lfffiuw75dffgllZWXs2LGj2HbCw8Pl2pHJZGjWrBkiIyPlyrm4uCh8/2/duhXKysrw8/Mr1fHFxcXJtauhoQEnJyesWbNGrlz+efD19S1Qh5+fHyQSCby9veXKf/7556WKhYiIiIg+DmVKgJ88eSK3ZGZmIikpCe3atcPWrVvLO0YiKoSbmxtSU1ORmpqK2NhYqKio4NNPPy1yn6ysLGzbtg3Tpk1DaGhoidrR0dER2zl79ixcXV3h6emJpKSkYvddv349pk2bhq1bt4rPDy+NpKQkpKam4tKlS/jyyy/x1VdfITY2Vq6MhYUFtm3bhhcvXojrsrOzsWXLFtSuXbvUbRIRERHRx6lMCbAidnZ2WLhwIcaPH19eVRJRMaRSKUxMTGBiYoLGjRvD398fd+7cwcOHDwvdZ8eOHXB0dIS/vz/i4+Nx586dYtuRSCRiO3Z2dggJCYGSkpJcb7Mit27dwokTJ+Dv7w97e/sCvcYlYWxsDBMTE1hbW2PcuHGwtrbGmTNn5Mo0bdoUFhYWcvVHRkaidu3aaNKkSanbJCIiIqKPU7klwACgoqKCe/fulWeVRFRCmZmZ2Lx5M2xtbWFoaFhoufXr12PIkCHQ1dWFu7s7wsPDS9VObm4uNmzYAOBN4lmUsLAw9OjRA7q6uhgyZAjWr19fqrbeJggC9u/fj5SUFLRq1arA9mHDhiEsLEx8HRoaCh8fn1K3k5OTg4yMDLmFiIiIiD4OZZoEa/fu3XKvBUFAamoqVqxYAWdn53IJjIiKFxUVBZlMBgB4/vw5TE1NERUVpfBZ3QBw7do1/PHHH2JP6ZAhQzBp0iTMnDkTEomk0HbS09PFdl68eAFVVVWsWbMGderUKXSfvLw8hIeHY/ny5QCAAQMGYPLkybh16xasra1LfIzm5uYA3iSmeXl5CA4ORocOHQqUGzJkCAICAnD79m0AwPHjx7Ft2zbExcWVuC0AWLBgAYKCgkq1DxERERFVDWVKgN+dQEYikcDIyAidO3fG0qVLyyMuIiqBTp06YdWqVQDe3Ju/cuVKuLu74+TJkwofVxYaGgpXV1fUqFEDANC9e3cMHz4chw8fRpcuXTB//nzMnz9fLH/p0iUAgLa2tjjsOCsrC4cOHYKvry8MDQ3h4eGhMLaDBw/i+fPn6N69OwCgRo0a6NatG0JDQzF37twSH2NCQgK0tbWRk5ODkydPYsyYMTAwMMBXX30lV87IyAg9evRAeHg4BEFAjx49xOMsjYCAAEyaNEl8nZGRAQsLi1LXQ0REREQfnjIlwHl5eeUdBxGVgZaWFmxtbcXX69atg66uLtauXYuQkBC5svlDl+/fvw8VFRW59aGhoejSpQt8fX3h6ekpbjMzMwMAKCkpybXTsGFDxMTEYNGiRYUmwOvXr8fjx4+hoaEhrsvLy8P58+cRFBRUaC/1u6ytraGnpwcAcHJywp9//ol58+YVSICBN8Ogx4wZAwD48ccfS1T/u6RSKaRSaZn2JSIiIqIPW5kS4ODgYEyZMgWamppy61+8eIFvvvkGs2fPLpfgiKh0JBIJlJSU5GZDzhcdHY1nz57h7NmzUFZWFtf//fff8PHxwdOnT2FgYAADA4MStaWsrKywHQBIS0vDrl27sG3bNjg5OYnrc3Nz0a5dO8TExMDNza2UR1d8u25ubnj58iUkEglcXV3LVD8RERERfbzKlAAHBQXB19e3QAKclZWFoKAgJsBE/5GcnBzcv38fwJsh0CtWrEBmZqbCXtn169ejR48eaNSokdx6R0dHTJw4EREREYU+q1cQBLGdFy9e4ODBgzhw4ECh7/VNmzbB0NAQnp6eBe4t7t69O9avX1/iBPjBgwfIzs4Wh0Bv2rQJffv2VVhWWVkZly9fFv9NRERERPS2MiXAgiAonDDn3LlzJe49IqL3t3//fpiamgJ4c59uvXr1sGPHDri4uMiV+/fff7F3715s2bKlQB1KSkro1asX1q9fX2gCnJGRIbYjlUphaWmJ4OBgTJ8+XWH50NBQ9OrVS+HnRJ8+ffDFF1/g0aNHJbpHt27dugDezDJvYWGBL7/8EoGBgYWW19HRKbZOIiIiIqqeJIIgCCUtrK+vD4lEgvT0dOjo6Mh9uc3NzUVmZiZ8fX3LfO8dEdGHJiMjA7q6ukj37wEdqWplh0NEH4PAnZUdARHRR0X8vvb/eWpRStUD/P3330MQBAwbNgxBQUHQ1dUVt6mpqcHKygpt2rQpW9RERB+ygC0Ae5eJiIiIqrRSJcBeXl4A3szK2rZtW6iqsjeEiMrG3d0dCQkJCrfNmDEDM2bM+I8jIiIiIqKPXamGQCuSnZ2Nly9fyq3jPXhEVJx//vmn0NmcSzMbdUUrzZAaIiIiIvrvVdgQ6HxZWVmYNm0afv75Z6SlpRXYnpubW5ZqiagaqVWrVmWHQERERETVjFJZdpo6dSoOHz6MVatWQSqVYt26dQgKCoKZmRk2btxY3jESERERERERvbcy9QDv2bMHGzduhIuLC3x8fNC+fXvY2trC0tISERERGDx4cHnHSURERERERPReytQD/PjxY9jY2AB4c7/v48ePAQDt2rVDfHx8+UVHREREREREVE7KlADb2Njg1q1bAIB69erh559/BvCmZ1hPT6/cgiMiIiIiIiIqL2VKgH18fHDu3DkAgL+/P3788Ueoq6tj4sSJmDp1arkGSERERERERFQe3vsxSABw+/Zt/PXXX7C1tUXDhg3LIy4iog8CH4NERERE9GGr8McgvS07OxuWlpawtLR836qIiIiIiIiIKkyZhkDn5uZi7ty5qFWrFmQyGW7evAkAmDVrFtavX1+uARIRERERERGVhzIlwPPmzUN4eDgWL14MNTU1cX39+vWxbt26cguOiIiIiIiIqLyUKQHeuHEj1qxZg8GDB0NZWVlc36hRI1y5cqXcgiMiIiIiIiIqL2VKgP/55x/Y2toWWJ+Xl4dXr169d1BERERERERE5a1MCbCjoyMSEhIKrP/ll1/QpEmT9w6KiIiIiIiIqLyVaRbo2bNnw8vLC//88w/y8vIQGRmJpKQkbNy4EVFRUeUdIxFR5VswCJCqVnYURPS2wJ2VHQEREVUxpeoBvnnzJgRBQM+ePbFnzx4cOnQIWlpamD17Ni5fvow9e/agW7duFRUrERERERERUZmVqgfYzs4OqampMDY2Rvv27WFgYIALFy6gZs2aFRUfERERERERUbkoVQ+wIAhyr/ft24fnz5+Xa0BEREREREREFaFMk2DlezchJvqQeHt7QyKRiIuhoSHc3Nxw/vx5sYxEIsFvv/1WYN8vv/wSysrK2LFjR7HthIeHy7Ujk8nQrFkzREZGypVzcXHBhAkTCuy/detWKCsrw8/Pr1THFxcXJ9du/jJz5sxS1UNEREREVF2UKgHO/4L97jqiD5WbmxtSU1ORmpqK2NhYqKio4NNPPy1yn6ysLGzbtg3Tpk1DaGhoidrR0dER2zl79ixcXV3h6emJpKSkYvddv349pk2bhq1btyI7O7tE7b0tKSlJbDs1NRX+/v4FyuTm5iIvL6/UdRMRERERfUxKPQTa29sbvXv3Ru/evZGdnQ1fX1/xdf5C9KGQSqUwMTGBiYkJGjduDH9/f9y5cwcPHz4sdJ8dO3bA0dER/v7+iI+Px507d4ptRyKRiO3Y2dkhJCQESkpKcr3Nity6dQsnTpyAv78/7O3tC/Qal4SxsbHYtomJCWQyGcLDw6Gnp4fdu3fD0dERUqkUKSkpOHXqFLp164YaNWpAV1cXHTt2xJkzZwocy+rVq/Hpp59CU1MTDg4O+P3333H9+nW4uLhAS0sLbdu2xY0bN+T227VrF5o2bQp1dXXY2NggKCgIr1+/LtExSCQSrFu3Dr169YKmpibs7Oywe/ducXv+8bztt99+k/sBLjAwEI0bN0ZoaChq164NmUyG0aNHIzc3F4sXL4aJiQmMjY0xb968Up5hIiIiIvpYlCoB9vLygrGxMXR1daGrq4shQ4bAzMxMfJ2/EH2IMjMzsXnzZtja2sLQ0LDQcuvXr8eQIUOgq6sLd3d3hIeHl6qd3NxcbNiwAQDQtGnTIsuGhYWhR48e4vtp/fr1pWqrKFlZWVi0aBHWrVuHixcvwtjYGM+ePYOXlxeOHTuGP/74A3Z2dujevTuePXsmt+/cuXMxdOhQJCYmol69ehg0aBC+/PJLBAQE4PTp0xAEAWPGjBHLJyQkYOjQoRg/fjwuXbqE1atXIzw8vFTJZlBQEDw9PXH+/Hl0794dgwcPxuPHj0t1zDdu3MC+ffuwf/9+bN26FevXr0ePHj1w9+5dHD16FIsWLcLMmTPx559/FlpHTk4OMjIy5BYiIiIi+jiUahbosLCwioqDqEJERUVBJpMBAJ4/fw5TU1NERUVBSUnxbz/Xrl3DH3/8IfbEDhkyBJMmTcLMmTOLHO6fnp4utvPixQuoqqpizZo1qFOnTqH75OXlITw8HMuXLwcADBgwAJMnT8atW7dgbW1d4mM0NzeXe3379m0AwKtXr7By5Uo0atRI3Na5c2e5smvWrIGenh6OHj0qNzTcx8cHnp6eAIDp06ejTZs2mDVrFlxdXQEA48ePh4+Pj1g+KCgI/v7+8PLyAgDY2Nhg7ty5mDZtGubMmVOi4/D29sbAgQMBAPPnz8eyZctw8uRJuLm5lWh/4M05DQ0Nhba2NhwdHdGpUyckJSUhOjoaSkpKqFu3LhYtWoQjR46gVatWCutYsGABgoKCStwmEREREVUd7zUJFtGHrlOnTkhMTERiYiJOnjwJV1dXuLu7i0niu0JDQ+Hq6ooaNWoAALp374709HQcPnwYwJvETCaTiUtKSgoAQFtbW2zn7NmzmD9/Pnx9fbFnz55CYzt48CCeP3+O7t27AwBq1KiBbt26lfi+43wJCQli24mJidDX1wcAqKmpoWHDhnJl//33X4wcORJ2dnbQ1dWFjo4OMjMzxePI9/Z++Y85a9Cggdy67OxssXf03LlzCA4Oljs3I0eORGpqKrKyskp0HG+3qaWlBR0dHTx48KAUZwKwsrKCtra2XJyOjo5yP3jUrFmzyHoDAgKQnp4uLiUZAk9EREREVUOpeoCJqhotLS3Y2tqKr9etWwddXV2sXbsWISEhcmXzhy7fv38fKioqcutDQ0PRpUsX+Pr6ij2jAGBmZgYAUFJSkmunYcOGiImJwaJFi+Dh4aEwtvXr1+Px48fQ0NAQ1+Xl5eH8+fMICgoqtJf6XdbW1gXujwUADQ2NAr3WXl5eSEtLww8//ABLS0tIpVK0adMGL1++lCunqqoq/ju/DkXr8ifWyszMRFBQkMI5ANTV1Ut0HG/Xn99Gfv1KSkoFZp1/9epVieooql5FpFIppFJpiWImIiIioqqFCTBVKxKJBEpKSnjx4kWBbdHR0Xj27BnOnj0LZWVlcf3ff/8NHx8fPH36FAYGBjAwMChRW8rKygrbAYC0tDTs2rUL27Ztg5OTk7g+NzcX7dq1Q0xMTKmG/pbU8ePHsXLlSrHX+c6dO3j06NF719u0aVMkJSXJ/QhQnoyMjPDs2TM8f/4cWlpaAIDExMQKaYuIiIiIPl5MgOmjlpOTg/v37wMAnjx5ghUrViAzM1Nhr2z+hElv3zMLAI6Ojpg4cSIiIiIKfVavIAhiOy9evMDBgwdx4MABzJ49W2H5TZs2wdDQEJ6engV6abt3747169dXSAJsZ2eHTZs2oXnz5sjIyMDUqVPleqDLavbs2fj0009Ru3Zt9O3bF0pKSjh37hz+/vvvAj3tZdGqVStoampixowZGDduHP78889ST05GRERERMR7gOmjtn//fpiamsLU1BStWrXCqVOnsGPHDri4uMiV+/fff7F371706dOnQB1KSkro1atXkTM0Z2RkiO04ODhg6dKlCA4Oxtdff62wfGhoKHr16qVwYq0+ffpg9+7d5dIz+67169fjyZMnaNq0Kb744guMGzcOxsbG712vq6sroqKiEBMTgxYtWqB169b47rvvYGlpWQ5RAwYGBti8eTOio6PRoEEDbN26FYGBgeVSNxERERFVHxLh3RvriIhIlJGRAV1dXaT794COVLX4HYjovxO4s7IjICKiD4D4fS09HTo6OkWW5RBoIqKSCNgCFPOBSkREREQfNg6BJvpAubu7yz1W6O1l/vz5lR1eiUVERBR6HG9PAEZEREREVNE4BJroA/XPP/8UOot0aWajrmzPnj3Dv//+q3Cbqqpqud0nXFFKM6SGiIiIiP57HAJN9BGoVatWZYdQLrS1taGtrV3ZYRARERERcQg0ERERERERVQ9MgImIiIiIiKhaYAJMRERERERE1QITYCIiIiIiIqoWmAATERERERFRtcAEmIiIiIiIiKoFJsBERERERERULTABJiIiIiIiomqBCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhZUKjsAIqIqYcEgQKpa2VEQVS2BOys7AiIiIjnsASYiIiIiIqJqgQkwERERERERVQtMgImIiIiIiKhaYAJMVAV4e3tD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RERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBa2GDoCIqFEImQBItRs6CqLX27LdDR0BERFRtTgCTERERERERGqBCTARERERERGpBSbApHbCw8NhbGxcb/XHxcVBIpEgNze3TurLzMyERCKBQqGok/pepWf7or77noiIiIioOkyAqUny8/ODRCKBRCKBjo4O5HI5VqxYgZKSknpvu1evXsjOzoaRkVG9t/W00NBQdO7cGQYGBjA2NoarqytCQkLqpO66SurHjh2L1NTUOompf//+4mcskUhgYWEBX19f3LhxQyxT8ceDis3U1BSDBg3CpUuX6iQGIiIiImpcmABTk+Xj44Ps7GykpaVh3rx5WLZsGdatW1fv7ero6MDS0hISiaTe26rw448/Yu7cuZg9ezYUCgVOnjyJgIAAFBQUvLIYakJXVxfm5uZ1Vt/06dORnZ2N27dvY8+ePbh58yb+/e9/Vyp3+PBhZGdn49ChQygoKMCQIUPqbISeiIiIiBoPJsDUZEmlUlhaWsLW1hYffPABvL29sXfvXvH4oUOH4OzsDAMDAzFZBoBjx45BW1sbOTk5SvXNnTsXffr0AQDcuHEDw4YNg4mJCfT19eHi4oLo6GgAqkdLT548if79+0NPTw8mJiYYPHgwHj58CAA4ePAgevfuDWNjY5iamuLNN99ERkZGra517969GDNmDKZOnQq5XA4XFxeMHz8eK1eufOlryszMhKenJwDAxMQEEokEfn5+AICioiLMnj0b5ubmkMlk6N27N86dO1dlnKqmQP/3v/9Ft27dIJPJ0KJFC4wcObLG162npwdLS0tYWVmhZ8+emDVrFi5evFipnKmpKSwtLeHm5ob169fjzp07OHv2bI3bISIiIqKmgQkwqQ1dXV38888/AIDCwkKsX78eO3bswLFjx5CVlYX58+cDAPr27Qt7e3vs2LFDPLe4uBg7d+7Eu+++CwDw9/dHUVERjh07hoSEBKxZswYGBgYq21UoFPDy8kL79u1x+vRpnDhxAsOGDUNpaSkA4PHjx/j4449x/vx5xMbGQkNDAyNHjkRZWVmNr83S0hJnzpxRmv77tJe5JhsbG/z2228AgJSUFGRnZ+Orr74CAAQEBOC3337Dtm3bcPHiRcjlcgwePBgPHjyoUdz79+/HyJEjMXToUFy6dAmxsbHo3r17ja/7aQ8ePMAvv/yCHj16VFtOV1cXAMR74VlFRUXIz89X2oiIiIioaeB7gKnJEwQBsbGxOHToED788EMA5cnft99+CwcHBwDArFmzsGLFCvGcqVOnIiwsDJ988gmA8lHKv//+G2PGjAEAZGVlYdSoUejYsSMAwN7evsr2165dCzc3N2zevFnc5+LiIv571KhRSuV//PFHmJmZITExER06dKjRNQYFBeHtt9+GnZ0dnJyc4O7ujqFDh2L06NHQ0NB46Wtq3rw5AMDc3FwcwX38+DG2bNmC8PBwDBkyBED5c8h//PEHfvjhB7Gd6qxcuRLjxo3D8uXLxX2dO3eu0TUDwObNm7F161YIgoDCwkI4OTnh0KFDVZbPzc3FZ599BgMDgyoT7ZCQEKV4iIiIiKjp4AgwNVn79u2DgYEBZDIZhgwZgrFjx2LZsmUAyqfOViS/AGBlZYW7d++KP/v5+SE9PR1nzpwBUD51d8yYMdDX1wcAzJ49G8HBwfDw8EBQUBCuXLlSZRwVI8BVSUtLw/jx42Fvbw9DQ0PY2dkBKE9IVXFxcYGBgQEMDAzExNPKygqnT59GQkIC5syZg5KSEkyZMgU+Pj7iSHJdXhMAZGRkoLi4GB4eHuI+bW1tdO/eHUlJSdWeW9O+eZ6JEydCoVDg8uXLOHHiBORyOQYNGoRHjx4plevVqxcMDAxgYmKCy5cvIzIyEhYWFirrDAwMRF5enrjdvHnzheMjIiIiotcLE2Bqsjw9PaFQKJCWloYnT55g27ZtYrKnra2tVFYikUAQBPFnc3NzDBs2DGFhYbhz5w4OHDggThUGgGnTpuHatWuYNGkSEhIS4Obmhk2bNqmMo2LKbVWGDRuGBw8eIDQ0FGfPnhWfTa1qim50dDQUCgUUCgW2bt2qdKxDhw6YOXMmfvrpJ/zxxx/4448/cPTo0Tq/prryvL55HiMjI8jlcsjlcnh4eOCHH35AWloaIiMjlcpFRkbi8uXLePjwITIyMjB06NAq65RKpTA0NFTaiIiIiKhpYAJMTZa+vj7kcjlat24NLa3az/afNm0aIiMj8f3338PBwUFppBMAbGxsMGPGDERFRWHevHkIDQ1VWU+nTp0QGxur8tj9+/eRkpKCxYsXw8vLC87OzuLiWFWxtbUVkz5ra+sqy7Vv3x5A+VTll70mHR0dABCfWwYABwcH6Ojo4OTJk+K+4uJinDt3Tmz7earrmxehqakJAHjy5InSfhsbGzg4OPAdxERERERqjs8AE1Vh8ODBMDQ0RHBwsNLzwUD56slDhgyBk5MTHj58iCNHjsDZ2VllPYGBgejYsSNmzpyJGTNmQEdHB0eOHIGvry+aN28OU1NTfP/997CyskJWVhYWLlxY61g/+OADtGzZEgMGDECrVq2QnZ2N4OBgmJmZwd3d/aWvydbWFhKJBPv27cPQoUOhq6sLAwMDfPDBB/jkk0/QvHlztG7dGmvXrkVhYSGmTp1ao7iDgoLg5eUFBwcHjBs3DiUlJYiOjsaCBQtqdH5hYaG4svWdO3fw2WefQSaTYdCgQTU6n4iIiIjUC0eAiaqgoaEBPz8/lJaWYvLkyUrHSktL4e/vD2dnZ/j4+MDJyUlpkaunOTk5ISYmBpcvX0b37t3h7u6OPXv2QEtLCxoaGoiIiMCFCxfQoUMHfPTRRy/0rmJvb2+cOXMGvr6+cHJywqhRoyCTyRAbGwtTU9OXviZra2ssX74cCxcuhIWFBWbNmgUAWL16NUaNGoVJkyaha9euSE9Px6FDh2BiYlKjuPv3749ff/0Ve/fuRZcuXTBgwADEx8fX+LpDQ0NhZWUFKysreHp64t69e4iOjkbbtm1rXAcRERERqQ+J8PSDj0SkZOrUqfjrr7+U3h/c2DXFa6pP+fn5MDIyQt7Cf8FQqv38E4jU2bLdDR0BERGpIfH3tby8567fwinQRCrk5eUhISEBP//8c5NJFJviNRERERER1QYTYCIVRowYgfj4eMyYMQMDBw5s6HDqRGO6puPHj4uveFKloKDgFUbz/wv8GeCK0ERERESNGqdAE9Fr58mTJ/h//+//VXlcLpe/slhqM6WGiIiIiF49ToEmokZNV1f3lSa5RERERKQeuAo0ERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBSbAREREREREpBaYABMREREREZFaYAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqQauhAyAiahRCJgBS7YaOguj1sWx3Q0dARERUaxwBJiIiIiIiIrXABJiIiIiIiIjU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Ug9MgIleEQcHB1y6dAmrVq1CYGAgbt26BalUivbt22P+/PmYOXOmWHbEiBE4deoUQkJCMGHCBOTn58PGxgYDBgxQeldvbUkkEkRGRiI0NBRhYWFYu3YtiouL0apVK3h5eeHzzz8XyzZv3hxnzpzB6tWrERwcjBs3bsDExAQdO3bEunXrYGRk9Nz2evbsiQsXLmDVqlXw9/dHTk4O9PX10blzZ3zxxRd49913AQDdu3fHiRMnMGPGDNy+fRsGBgZwcXHB77//jn79+lVZ/4ABAzBgwADExMRUOrZ06VIsXboUOjo6sLS0RM+ePREbGwtPT88X6DkiIiIiagokQn2tdkNE1ATk5+fDyMgIeQv/BUOpdkOHQ/T6WLb7+WWIiIheAfH3tbw8GBoaVluWzwATERERERGRWuAUaCJ6IcePH6/0+qWnVbxSqckI/Bl4zl8UiYiIiOj1xgSYiF6Im5sbFApFQ4dBRERERFRjTICJ6IXo6upyNWUiIiIialT4DDARERERERGpBSbAREREREREpBaYABMREREREZFaYAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGpBq6EDICJqFEImAFLtho6C6PWwbHdDR0BERPRCOAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAEzUQPz8/SCSSSlt6ejoAICcnB3PmzIFcLodMJoOFhQU8PDywZcsWFBYWKtV16dIl+Pr6wsLCAjKZDI6Ojpg+fTpSU1OrbD8uLk5l+4sXLxbLCIKA0NBQuLu7w9DQEAYGBnBxccGcOXPEOCvk5+dj0aJFaNeuHWQyGSwtLeHt7Y2oqCgIglCjPklPT8e7776L1q1bQyqVwtraGl5eXti5cydKSkrEckePHsWAAQPQvHlz6OnpwdHREVOmTME///xT6do0NDRgZGQEV1dXBAQEIDs7u0axEBEREVHTwwSYqAH5+PggOztbaWvTpg2uXbsGV1dXxMTEYNWqVbh06RJOnz6NgIAA7Nu3D4cPHxbr2LdvH3r27ImioiLs3LkTSUlJ+Omnn2BkZIQlS5Y8N4aUlBSl9hcuXAigPPmdMGECZs+ejaFDhyImJgaJiYn44YcfIJPJEBwcLNaRm5uLXr16Yfv27QgMDMTFixdx7NgxjB07FgEBAcjLy3tuHPHx8ejatSuSkpLwzTff4M8//0RcXBymTZuGLVu24OrVqwCAxMRE+Pj4wM3NDceOHUNCQgI2bdoEHR0dlJaWVrq227dv49y5c1iwYAEOHz6MDh06ICEhoUafDxERERE1LRKhpkMzRFSn/Pz8kJubi99//73SMR8fH1y9ehXJycnQ19evdFwQBEgkEhQWFsLW1ha9e/fG7t2VV2XNzc2FsbGxyvbj4uLg6emJhw8fqiwTERGB8ePHY8+ePRg+fHiVMQDAzJkzsX37dqSmpqJly5ZK5QoKCiCTyaClVfWi84IgwMXFBXp6eoiPj4eGRuW/zVW09+WXX+Krr77C9evXq6yvqmt78uQJXF1d0aJFC5w4caLK85+Wn58PIyMj5C38Fwy5CjRROa4CTURErxHx97W8PBgaGlZbliPARK+Z+/fvIyYmBv7+/iqTXwBi4nno0CHcu3cPAQEBKstVlfzWxK5du9C2bVuVye/TMZSVlSEiIgITJ06slPwCgIGBQbXJLwAoFAokJSVh/vz5KpPfp9uztLREdnY2jh07VpvLAQDo6upixowZOHnyJO7evauyTFFREfLz85U2IiIiImoamAATNaB9+/bBwMBA3Hx9fZGeng5BENC2bVulsi1atBDLLViwAACQlpYGAGjXrt0Lx9CqVSulGO7fvw8ASE1NrRTD3LlzxXKtWrUCANy7dw8PHz58qRgqnlV+ur27d+8qxbV582YAgK+vL8aPH49+/frBysoKI0eOxNdff13jRLUizszMTJXHQ0JCYGRkJG42NjYvfF1ERERE9HphAkzUgDw9PaFQKMRt48aNVZaNj4+HQqGAi4sLioqKAKDGi0u5uLiIieSQIUOUjh0/flwpBhMTkyrrWbRoERQKBZYuXYqCgoJaxVBbpqamYkzGxsbiAleampoICwvDrVu3sHbtWlhbW2PVqlVwcXGp0QJXFfFWjCg/KzAwEHl5eeJ28+bNursoIiIiImpQ1c9LJKJ6pa+vD7lcrrRPR0cHEokEKSkpSvvt7e0BlE/jreDk5AQASE5Ohru7e5XtREdHo7i4uNL5ANCmTRuVU6UdHR0rxWBmZgYzMzOYm5sr7TM2NkZycnKV7T+Po6MjgPJFq1xdXQGUJ7oVfaNqCrW1tTUmTZqESZMm4bPPPoOTkxO+/fZbLF++vNq2kpKSAAB2dnYqj0ulUkil0he9FCIiIiJ6jXEEmOg1Y2pqioEDB+Lrr7/G48ePqy07aNAgtGjRAmvXrlV5PDc3FwBga2sLuVwOuVwOa2vrGsUxfvx4pKSkYM+ePdWW09DQwLhx47Bz507cvn270vGCggKlVxip4urqinbt2mH9+vUoKyurUXxPMzExgZWV1XP768mTJ/j+++/Rt29fmJmZ1bodIiIiImrcmAATvYY2b96MkpISuLm5ITIyEklJSUhJScFPP/2E5ORkaGpqAigfQd66dSv279+P4cOH4/Dhw8jMzMT58+cREBCAGTNmvHAM48aNw+jRozFu3DisWLECZ8+eRWZmJo4ePYrIyEgxBgBYuXIlbGxs0KNHD2zfvh2JiYlIS0vDjz/+CFdXV3G6dFUkEgnCwsKQkpICDw8P7N27F2lpaUhMTMS3336Lv/76S2zvu+++wwcffICYmBhkZGTg6tWrWLBgAa5evYphw4Yp1Xv37l3k5OQgLS0NERER8PDwwL1797Bly5YX7hciIiIiarw4BZroNeTg4IBLly5h1apVCAwMxK1btyCVStG+fXvMnz8fM2fOFMuOGDECp06dQkhICCZMmID8/HzY2NhgwIABSu/qrS2JRILIyEiEhoYiLCwMa9euRXFxMVq1agUvLy98/vnnYtnmzZvjzJkzWL16NYKDg3Hjxg2YmJigY8eOWLduHYyMjJ7bXs+ePXHhwgWsWrUK/v7+yMnJgb6+Pjp37owvvvgC7777LgCge/fuOHHiBGbMmIHbt2/DwMAALi4u+P3339GvXz+lOtu2bQuJRAIDAwPY29tj0KBB+Pjjj2FpafnC/UJEREREjRffA0xEVA2+B5hIBb4HmIiIXiO1eQ8wR4CJiGoi8GfgOV+oRERERPR64zPARFTvjh8/rvRO32c3IiIiIqJXgSPARFTv3NzcoFAoGjoMIiIiIlJzTICJqN7p6upWet8xEREREdGrxinQREREREREpBaYABMREREREZFaYAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBa2GDoCIqFEI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REREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBa2GDoCIqFEImQBItRs6CiJg2e6GjoCIiKjR4ggwERERERERqQUmwERERERERKQWmAATERERERGRWmACTNTI+Pn5QSKRVNrS09MBADk5OZgzZw7kcjlkMhksLCzg4eGBLVu2oLCwUKmuS5cuwdfXFxYWFpDJZHB0dMT06dORmppaZftxcXEq21+8eLFYRhAEhIaGwt3dHYaGhjAwMICLiwvmzJkjxlkhPz8fixYtQrt27SCTyWBpaQlvb29ERUVBEIQq48jMzFQZx9NbeHi4GG9ubu4L9DYRERERNSVcBIuoEfLx8UFYWJjSPjMzM1y7dg0eHh4wNjbGqlWr0LFjR0ilUiQkJOD777+HtbU1hg8fDgDYt28fRo0ahcGDB2Pnzp1wcHDA3bt38euvv2LJkiWIjIysNoaUlBQYGhqKPxsYGAAoT34nTJiA33//HZ9++im++OILtGzZErdv38bu3bsRHByM8PBwAEBubi569+6NvLw8BAcHo1u3btDS0sLRo0cREBCAAQMGwNjYWGX7NjY2yM7OFn9ev349Dh48iMOHD4v7jIyMcPbs2Rr3KxERERE1bUyAiRohqVQKS0vLSvtnzpwJLS0tnD9/Hvr6+uJ+e3t7jBgxQhxRLSwsxDvvvIOhQ4di9+7/W1G2TZs26NGjR41GS83NzVUmp5GRkYiIiMCePXvEZBsAWrdujZ49eyqN6n766afIzMxEamoqWrZsKe53cnLC+PHjIZPJqmxfU1NTqQ8MDAygpaWlsl9qo6ioCEVFReLP+fn5L1UfEREREb0+OAWaqIm4f/8+YmJi4O/vr5T8Pk0ikQAADh06hHv37iEgIEBluapGXWti165daNu2rVLyqyqGsrIyREREYOLEiUrJb4WKhPZVCwkJgZGRkbjZ2Ni88hiIiIiIqH4wASZqhPbt2wcDAwNx8/X1RXp6OgRBQNu2bZXKtmjRQiy3YMECAEBaWhoAoF27di8cQ6tWrZRiuH//PgAgNTW1Ugxz584Vy7Vq1QoAcO/ePTx8+PClYqgPgYGByMvLE7ebN282dEhEREREVEc4BZqoEfL0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"},"metadata":{}}],"execution_count":64},{"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-11-13T02:22:05.733292Z","iopub.execute_input":"2024-11-13T02:22:05.733782Z","iopub.status.idle":"2024-11-13T02:22:05.740422Z","shell.execute_reply.started":"2024-11-13T02:22:05.733736Z","shell.execute_reply":"2024-11-13T02:22:05.739354Z"}},"outputs":[],"execution_count":65},{"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\ntrain_ts_noID = train_ts.drop('id', axis=1)\ntest_ts_noID = test_ts.drop('id', axis=1)\n\ntrain_ts_encoded = perform_autoencoder(train_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\ntest_ts_encoded = perform_autoencoder(test_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\n\ntime_series_cols = train_ts_encoded.columns.tolist()\ntrain_ts_encoded[\"id\"]=train_ts[\"id\"]\ntest_ts_encoded['id']=test_ts[\"id\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:05.741580Z","iopub.execute_input":"2024-11-13T02:22:05.741901Z","iopub.status.idle":"2024-11-13T02:23:38.856087Z","shell.execute_reply.started":"2024-11-13T02:22:05.741859Z","shell.execute_reply":"2024-11-13T02:23:38.854982Z"}},"outputs":[{"name":"stderr","text":"100%|██████████| 996/996 [01:21<00:00, 12.17it/s]\n100%|██████████| 2/2 [00:00<00:00, 12.84it/s]\n","output_type":"stream"},{"name":"stdout","text":"Epoch [10/100], Loss: 1.6832]\nEpoch [20/100], Loss: 1.6234]\nEpoch [30/100], Loss: 1.5770]\nEpoch [40/100], Loss: 1.5321]\nEpoch [50/100], Loss: 1.5061]\nEpoch [60/100], Loss: 1.4970]\nEpoch [70/100], Loss: 1.4968]\nEpoch [80/100], Loss: 1.4973]\nEpoch [90/100], Loss: 1.4980]\nEpoch [100/100], Loss: 1.4942]\nEpoch [10/100], Loss: 1.0089]\nEpoch [20/100], Loss: 0.6029]\nEpoch [30/100], Loss: 0.4271]\nEpoch [40/100], Loss: 0.4271]\nEpoch [50/100], Loss: 0.4271]\nEpoch [60/100], Loss: 0.4271]\nEpoch [70/100], Loss: 0.4271]\nEpoch [80/100], Loss: 0.4271]\nEpoch [90/100], Loss: 0.4271]\nEpoch [100/100], Loss: 0.4271]\n","output_type":"stream"}],"execution_count":66},{"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-11-13T02:23:38.857383Z","iopub.execute_input":"2024-11-13T02:23:38.857842Z","iopub.status.idle":"2024-11-13T02:23:38.865202Z","shell.execute_reply.started":"2024-11-13T02:23:38.857796Z","shell.execute_reply":"2024-11-13T02:23:38.864156Z"}},"outputs":[],"execution_count":67},{"cell_type":"code","source":"train_df = pd.merge(train_df, train_ts_encoded, how=\"left\", on='id')\ntest_df = pd.merge(test_df, test_ts_encoded, how=\"left\", on='id')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.866265Z","iopub.execute_input":"2024-11-13T02:23:38.868218Z","iopub.status.idle":"2024-11-13T02:23:38.883489Z","shell.execute_reply.started":"2024-11-13T02:23:38.868167Z","shell.execute_reply":"2024-11-13T02:23:38.882540Z"}},"outputs":[],"execution_count":68},{"cell_type":"code","source":"imputer = KNNImputer(n_neighbors=5)\nnumeric_cols = train_df.select_dtypes(include=['float64', 'int64']).columns\nimputed_data = imputer.fit_transform(train_df[numeric_cols])\ntrain_imputed = pd.DataFrame(imputed_data, columns=numeric_cols)\ntrain_imputed['sii'] = train_imputed['sii'].round().astype(int)\nfor col in train_df.columns:\n if col not in numeric_cols:\n train_imputed[col] = train_df[col]\n \ntrain_df = train_imputed\n\ntrain_df = feature_engineering(train_df)\ntrain_df = train_df.dropna(thresh=10, axis=0)\ntest_df = feature_engineering(test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:12.742036Z","iopub.execute_input":"2024-11-13T02:24:12.742440Z","iopub.status.idle":"2024-11-13T02:24:12.781294Z","shell.execute_reply.started":"2024-11-13T02:24:12.742402Z","shell.execute_reply":"2024-11-13T02:24:12.780552Z"}},"outputs":[],"execution_count":70},{"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-11-13T02:24:20.242224Z","iopub.execute_input":"2024-11-13T02:24:20.242990Z","iopub.status.idle":"2024-11-13T02:24:20.251667Z","shell.execute_reply.started":"2024-11-13T02:24:20.242953Z","shell.execute_reply":"2024-11-13T02:24:20.250623Z"}},"outputs":[],"execution_count":71},{"cell_type":"code","source":"print(f'Train Shape : {train_df.shape} || Test Shape : {test_df.shape}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:38.120201Z","iopub.execute_input":"2024-11-13T02:24:38.120612Z","iopub.status.idle":"2024-11-13T02:24:38.125743Z","shell.execute_reply.started":"2024-11-13T02:24:38.120573Z","shell.execute_reply":"2024-11-13T02:24:38.124709Z"}},"outputs":[{"name":"stdout","text":"Train Shape : (2718, 94) || Test Shape : (20, 93)\n","output_type":"stream"}],"execution_count":72},{"cell_type":"code","source":"train_df = train_df.fillna(0)\ntest_df = test_df.fillna(0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:40.311830Z","iopub.execute_input":"2024-11-13T02:24:40.312189Z","iopub.status.idle":"2024-11-13T02:24:40.324866Z","shell.execute_reply.started":"2024-11-13T02:24:40.312158Z","shell.execute_reply":"2024-11-13T02:24:40.323701Z"}},"outputs":[],"execution_count":73},{"cell_type":"code","source":"from imblearn.over_sampling import SMOTE\nX_train = train_df.drop(columns=['sii']) # 假設 'sii' 是目標欄位\ny_train = train_df['sii']\n\n# 使用 SMOTE 進行過採樣\nsmote = SMOTE(random_state=42)\nX_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:44.236575Z","iopub.execute_input":"2024-11-13T02:24:44.237416Z","iopub.status.idle":"2024-11-13T02:24:44.424853Z","shell.execute_reply.started":"2024-11-13T02:24:44.237377Z","shell.execute_reply":"2024-11-13T02:24:44.424033Z"}},"outputs":[],"execution_count":74},{"cell_type":"code","source":"X_train_resampled","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.940428Z","iopub.status.idle":"2024-11-13T02:23:38.940868Z","shell.execute_reply.started":"2024-11-13T02:23:38.940653Z","shell.execute_reply":"2024-11-13T02:23:38.940675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_train_resampled","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.941742Z","iopub.status.idle":"2024-11-13T02:23:38.942147Z","shell.execute_reply.started":"2024-11-13T02:23:38.941936Z","shell.execute_reply":"2024-11-13T02:23:38.941957Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train = X_train_resampled\ny_train = y_train_resampled\nX_test = test_df\n\nmodel = RandomForestClassifier(random_state=0)\nmodel.fit(X_train, y_train)\n\n# model = TabNetRegressor(\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# max_epochs=500, \n# patience=50, \n# batch_size=1024,\n# virtual_batch_size=128,\n# num_workers=0,\n# drop_last=False,\n# )\n\n\ntest_df['sii'] = model.predict(X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:25:29.517412Z","iopub.execute_input":"2024-11-13T02:25:29.517806Z","iopub.status.idle":"2024-11-13T02:25:31.709993Z","shell.execute_reply.started":"2024-11-13T02:25:29.517772Z","shell.execute_reply":"2024-11-13T02:25:31.709168Z"}},"outputs":[],"execution_count":75},{"cell_type":"code","source":"submit_df = pd.concat([test_id, test_df['sii']], axis=1)\nsubmit_df['sii'] = submit_df['sii'].astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:25:35.292463Z","iopub.execute_input":"2024-11-13T02:25:35.292856Z","iopub.status.idle":"2024-11-13T02:25:35.298737Z","shell.execute_reply.started":"2024-11-13T02:25:35.292821Z","shell.execute_reply":"2024-11-13T02:25:35.297751Z"}},"outputs":[],"execution_count":76},{"cell_type":"code","source":"submit_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:25:50.497175Z","iopub.execute_input":"2024-11-13T02:25:50.497961Z","iopub.status.idle":"2024-11-13T02:25:50.508569Z","shell.execute_reply.started":"2024-11-13T02:25:50.497921Z","shell.execute_reply":"2024-11-13T02:25:50.507323Z"}},"outputs":[{"execution_count":77,"output_type":"execute_result","data":{"text/plain":" id sii\n0 00008ff9 2\n1 000fd460 0\n2 00105258 0\n3 00115b9f 0\n4 0016bb22 2\n5 001f3379 0\n6 0038ba98 0\n7 0068a485 0\n8 0069fbed 0\n9 0083e397 0\n10 0087dd65 0\n11 00abe655 0\n12 00ae59c9 1\n13 00af6387 1\n14 00bd4359 0\n15 00c0cd71 2\n16 00d56d4b 0\n17 00d9913d 0\n18 00e6167c 0\n19 00ebc35d 0","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idsii
000008ff92
1000fd4600
2001052580
300115b9f0
40016bb222
5001f33790
60038ba980
70068a4850
80069fbed0
90083e3970
100087dd650
1100abe6550
1200ae59c91
1300af63871
1400bd43590
1500c0cd712
1600d56d4b0
1700d9913d0
1800e6167c0
1900ebc35d0
\n
"},"metadata":{}}],"execution_count":77},{"cell_type":"code","source":"submit_df.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.950333Z","iopub.status.idle":"2024-11-13T02:23:38.951086Z","shell.execute_reply.started":"2024-11-13T02:23:38.950858Z","shell.execute_reply":"2024-11-13T02:23:38.950883Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]} \ No newline at end of file From 7a7a6ddd200df98fe75b723fdbed659f5167d8fa Mon Sep 17 00:00:00 2001 From: Billy152op <84769275+Billy152op@users.noreply.github.com> Date: Wed, 13 Nov 2024 15:51:50 +0800 Subject: [PATCH 2/3] Add files via upload ADD some new models, processing time-series data --- preprocessing.ipynb | 1059 +------------------------------------------ 1 file changed, 1 insertion(+), 1058 deletions(-) diff --git a/preprocessing.ipynb b/preprocessing.ipynb index 1dc4dac..6fdf93d 100644 --- a/preprocessing.ipynb +++ b/preprocessing.ipynb @@ -1,1058 +1 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "id": "e4e0cc2a", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import os\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.impute import SimpleImputer\n", - "from sklearn.ensemble import RandomForestClassifier\n", - "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n", - "from concurrent.futures import ThreadPoolExecutor\n", - "from tqdm import tqdm" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "5b0aa12f", - "metadata": {}, - "outputs": [], - "source": [ - "train_df = pd.read_csv(\"child-mind-institute-problematic-internet-use/train.csv\")\n", - "test_df = pd.read_csv(\"child-mind-institute-problematic-internet-use/test.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eab58219", - "metadata": {}, - "outputs": [], - "source": [ - "conflict_rows = train_df[(train_df['PAQ_A-PAQ_A_Total'].notna()) & (train_df['PAQ_C-PAQ_C_Total'].notna())]\n", - "\n", - "# 判斷是否存在衝突行\n", - "if not conflict_rows.empty:\n", - " train_df = train_df.drop(conflict_rows.index)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "e4d6f5f0", - "metadata": {}, - "outputs": [], - "source": [ - "# 將合併結果存回 column1\n", - "train_df['PAQ_A-PAQ_A_Total'] = train_df['PAQ_A-PAQ_A_Total'].fillna(train_df['PAQ_C-PAQ_C_Total'])\n", - "train_df['PAQ_A-Season'] = train_df['PAQ_A-Season'].fillna(train_df['PAQ_C-Season'])\n", - "test_df['PAQ_A-PAQ_A_Total'] = test_df['PAQ_A-PAQ_A_Total'].fillna(test_df['PAQ_C-PAQ_C_Total'])\n", - "test_df['PAQ_A-Season'] = test_df['PAQ_A-Season'].fillna(test_df['PAQ_C-Season'])\n", - "\n", - "# 刪除 column2\n", - "train_df = train_df.drop(columns=['PAQ_C-PAQ_C_Total', 'PAQ_C-Season'])\n", - "test_df = test_df.drop(columns=['PAQ_C-PAQ_C_Total', 'PAQ_C-Season'])\n", - "\n", - "train_df = train_df.rename(columns={'PAQ_A-Season': 'PAQ-Season'})\n", - "train_df = train_df.rename(columns={'PAQ_A-PAQ_A_Total': 'PAQ-PAQ_Total'})\n", - "test_df = test_df.rename(columns={'PAQ_A-Season': 'PAQ-Season'})\n", - "test_df = test_df.rename(columns={'PAQ_A-PAQ_A_Total': 'PAQ-PAQ_Total'})\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "f178f013", - "metadata": {}, - "outputs": [], - "source": [ - "df = train_df.dropna(axis=1, thresh=len(train_df) - 3000)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "dd247f1d", - "metadata": {}, - "outputs": [], - "source": [ - "def process_file(filename, dirname):\n", - " df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n", - " df.drop('step', axis=1, inplace=True)\n", - " return df.describe().values.reshape(-1), filename.split('=')[1]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "28ab11be", - "metadata": {}, - "outputs": [], - "source": [ - "def load_time_series(dirname) -> pd.DataFrame:\n", - " ids = os.listdir(dirname)\n", - " \n", - " with ThreadPoolExecutor() as executor:\n", - " results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n", - " \n", - " stats, indexes = zip(*results)\n", - " \n", - " df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))])\n", - " df['id'] = indexes\n", - " \n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "7f168bce", - "metadata": {}, - "outputs": [], - "source": [ - "# 把SII是空的column刪除\n", - "train_df = train_df.dropna(subset=['sii'])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "484016f4", - "metadata": {}, - "outputs": [], - "source": [ - "# PCIAT 有些欄位是空的,會影響最後SII結果,把若填滿PCIAT有可能改變SII的column刪除\n", - "PCIAT_cols = [f'PCIAT-PCIAT_{i+1:02d}' for i in range(20)]\n", - "def 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", - "\n", - "train_df['recal_sii'] = train_df.apply(IncorrectRows, axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "a0858571", - "metadata": {}, - "outputs": [], - "source": [ - "mismatch_rows = train_df[\n", - " (train_df['recal_sii'] != train_df['sii']) & train_df['sii'].notna()\n", - "]\n", - "mismatch_indexes = mismatch_rows.index\n", - "train_df = train_df.drop(mismatch_indexes)\n", - "train_df = train_df.drop(['recal_sii'], axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "bc52dc24", - "metadata": {}, - "outputs": [], - "source": [ - "# 把有關Season的column做mapping \n", - "SEASON_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", - " ]\n", - "def update(df):\n", - " for c in SEASON_COLS: \n", - " df[c] = df[c].fillna('Missing')\n", - " df[c] = df[c].astype('category')\n", - " return df\n", - "train_df = update(train_df)\n", - "test_df = update(test_df)\n", - "season_mapping = {'Spring': 0, 'Summer': 1, 'Fall': 2, 'Winter': 3, 'Missing': 4}\n", - "for col in SEASON_COLS:\n", - " train_df[col] = train_df[col].map(season_mapping)\n", - " test_df[col] = test_df[col].map(season_mapping)\n", - "train_df['PCIAT-Season'] = train_df['PCIAT-Season'].map(season_mapping)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "05c95e2d", - "metadata": {}, - "outputs": [], - "source": [ - "# 做Imputer\n", - "train_id = train_df['id']\n", - "test_id = test_df['id']\n", - "train_features = train_df.drop(columns=['id'])\n", - "test_features = test_df.drop(columns=['id'])\n", - "\n", - "imputer = SimpleImputer(strategy='median')\n", - "train_features_imputed = pd.DataFrame(imputer.fit_transform(train_features), columns=train_features.columns, index=train_features.index)\n", - "test_features_imputed = pd.DataFrame(imputer.fit_transform(test_features), columns=test_features.columns, index=test_features.index)\n", - "\n", - "train_df = pd.concat([train_id, train_features_imputed], axis=1)\n", - "test_df = pd.concat([test_id, test_features_imputed], axis=1)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f4ab2aab", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Basic_Demos-Sex -0.094312\n", - "Physical-Diastolic_BP 0.066374\n", - "Physical-HeartRate -0.035771\n", - "PAQ-PAQ_Total -0.042217\n", - "Fitness_Endurance-Max_Stage -0.020330\n", - "Fitness_Endurance-Time_Mins -0.038346\n", - "Fitness_Endurance-Time_Sec 0.001800\n", - "FGC-FGC_SRL -0.073663\n", - "FGC-FGC_SRR -0.064219\n", - "BIA-BIA_Activity_Level_num 0.075633\n", - "BIA-BIA_BMC -0.007859\n", - "BIA-BIA_BMR 0.028779\n", - "BIA-BIA_DEE 0.041886\n", - "BIA-BIA_ECW 0.027491\n", - "BIA-BIA_FFM 0.028779\n", - "BIA-BIA_FFMI 0.085982\n", - "BIA-BIA_FMI 0.066753\n", - "BIA-BIA_Fat 0.031164\n", - "BIA-BIA_ICW 0.041286\n", - "BIA-BIA_LDM 0.019975\n", - "BIA-BIA_LST 0.059496\n", - "BIA-BIA_SMM 0.041344\n", - "BIA-BIA_TBW 0.033559\n", - "Name: PCIAT-PCIAT_Total, dtype: float64\n" - ] - } - ], - "source": [ - "# 尋找和PCIAT_Total相關性低的column並刪除 \n", - "train_cor = train_df.drop('id', axis=1)\n", - "test_cor = test_df.drop('id', axis=1)\n", - "corr_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',\n", - " 'PAQ-PAQ_Total', '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()\n", - "sii_corr = corr_matrix['PCIAT-PCIAT_Total'].drop('PCIAT-PCIAT_Total')\n", - "filtered_corr = sii_corr[(sii_corr > 0.1) | (sii_corr < -0.1)]\n", - "other_corr = sii_corr[(sii_corr <= 0.1) & (sii_corr >= -0.1)]\n", - "other_corr_columns = other_corr.index.tolist()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "68ee6785", - "metadata": {}, - "outputs": [], - "source": [ - "train_df = train_df.drop(columns=other_corr_columns)\n", - "test_df = test_df.drop(columns=other_corr_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "b652c300", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 0%| | 0/996 [00:00\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Basic_Demos-Enroll_SeasonBasic_Demos-AgeCGAS-SeasonCGAS-CGAS_ScorePhysical-SeasonPhysical-BMIPhysical-HeightPhysical-WeightPhysical-Waist_CircumferencePhysical-Systolic_BP...Stat_86Stat_87Stat_88Stat_89Stat_90Stat_91Stat_92Stat_93Stat_94Stat_95
02.0000005.0000003.00000051.0000002.00000016.87731646.00000050.80000026.000000114.000000...0.0000000.0000000.0000000.00.0000000.0000000.000000e+000.00.00.000000
11.0000009.0000004.00000065.0000002.00000014.03559048.00000046.00000022.000000122.000000...0.0000000.0000000.0000000.00.0000000.0000000.000000e+000.00.00.000000
21.00000010.0000002.00000071.0000002.00000016.64869656.50000075.60000026.000000117.000000...0.0000000.0000000.0000000.00.0000000.0000000.000000e+000.00.00.000000
33.0000009.0000002.00000071.0000001.00000018.29234756.00000081.60000026.000000117.000000...1.5469794.00427689.7516560.02633.2500004188.5000008.611000e+137.03.085.000000
40.00000013.0000003.00000050.0000001.00000022.27995259.500000112.20000026.000000102.000000...1.1462842.95288889.4760361.02597.8000494175.0000008.639500e+137.03.091.000000
..................................................................
63391.29980112.2998010.89940277.0019952.29980127.99459365.599601171.10259326.000000130.303790...1.0303421.38206388.7211791.02209.4896874190.6015968.639500e+137.01.070.213165
63400.35354114.2929171.00000045.0000001.70708328.67697766.918187182.72532826.000000144.495192...0.0000000.0000000.0000000.00.0000000.0000000.000000e+000.00.00.000000
63410.97419414.0000003.94838965.0774171.07741720.30535761.332264108.72777226.000000127.638722...0.0000000.0000000.0000000.00.0000000.0000000.000000e+000.00.00.000000
63421.84706117.0000003.00000053.0587832.00000022.44585066.464713141.15533126.000000128.847061...0.0000000.0000000.0000000.00.0000000.0000000.000000e+000.00.00.000000
63432.02359515.9056203.90562064.7640501.95281045.73784867.558987296.78735048.457316156.150581...0.0000000.0000000.0000000.00.0000000.0000000.000000e+000.00.00.000000
\n", - "

6344 rows × 129 columns

\n", - "" - ], - "text/plain": [ - " Basic_Demos-Enroll_Season Basic_Demos-Age CGAS-Season \\\n", - "0 2.000000 5.000000 3.000000 \n", - "1 1.000000 9.000000 4.000000 \n", - "2 1.000000 10.000000 2.000000 \n", - "3 3.000000 9.000000 2.000000 \n", - "4 0.000000 13.000000 3.000000 \n", - "... ... ... ... \n", - "6339 1.299801 12.299801 0.899402 \n", - "6340 0.353541 14.292917 1.000000 \n", - "6341 0.974194 14.000000 3.948389 \n", - "6342 1.847061 17.000000 3.000000 \n", - "6343 2.023595 15.905620 3.905620 \n", - "\n", - " CGAS-CGAS_Score Physical-Season Physical-BMI Physical-Height \\\n", - "0 51.000000 2.000000 16.877316 46.000000 \n", - "1 65.000000 2.000000 14.035590 48.000000 \n", - "2 71.000000 2.000000 16.648696 56.500000 \n", - "3 71.000000 1.000000 18.292347 56.000000 \n", - "4 50.000000 1.000000 22.279952 59.500000 \n", - "... ... ... ... ... \n", - "6339 77.001995 2.299801 27.994593 65.599601 \n", - "6340 45.000000 1.707083 28.676977 66.918187 \n", - "6341 65.077417 1.077417 20.305357 61.332264 \n", - "6342 53.058783 2.000000 22.445850 66.464713 \n", - "6343 64.764050 1.952810 45.737848 67.558987 \n", - "\n", - " Physical-Weight Physical-Waist_Circumference Physical-Systolic_BP \\\n", - "0 50.800000 26.000000 114.000000 \n", - "1 46.000000 22.000000 122.000000 \n", - "2 75.600000 26.000000 117.000000 \n", - "3 81.600000 26.000000 117.000000 \n", - "4 112.200000 26.000000 102.000000 \n", - "... ... ... ... \n", - "6339 171.102593 26.000000 130.303790 \n", - "6340 182.725328 26.000000 144.495192 \n", - "6341 108.727772 26.000000 127.638722 \n", - "6342 141.155331 26.000000 128.847061 \n", - "6343 296.787350 48.457316 156.150581 \n", - "\n", - " ... Stat_86 Stat_87 Stat_88 Stat_89 Stat_90 Stat_91 \\\n", - "0 ... 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", - "1 ... 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", - "2 ... 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", - "3 ... 1.546979 4.004276 89.751656 0.0 2633.250000 4188.500000 \n", - "4 ... 1.146284 2.952888 89.476036 1.0 2597.800049 4175.000000 \n", - "... ... ... ... ... ... ... ... \n", - "6339 ... 1.030342 1.382063 88.721179 1.0 2209.489687 4190.601596 \n", - "6340 ... 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", - "6341 ... 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", - "6342 ... 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", - "6343 ... 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 \n", - "\n", - " Stat_92 Stat_93 Stat_94 Stat_95 \n", - "0 0.000000e+00 0.0 0.0 0.000000 \n", - "1 0.000000e+00 0.0 0.0 0.000000 \n", - "2 0.000000e+00 0.0 0.0 0.000000 \n", - "3 8.611000e+13 7.0 3.0 85.000000 \n", - "4 8.639500e+13 7.0 3.0 91.000000 \n", - "... ... ... ... ... \n", - "6339 8.639500e+13 7.0 1.0 70.213165 \n", - "6340 0.000000e+00 0.0 0.0 0.000000 \n", - "6341 0.000000e+00 0.0 0.0 0.000000 \n", - "6342 0.000000e+00 0.0 0.0 0.000000 \n", - "6343 0.000000e+00 0.0 0.0 0.000000 \n", - "\n", - "[6344 rows x 129 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "X_train_resampled" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "7a006722", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 2.0\n", - "1 0.0\n", - "2 0.0\n", - "3 1.0\n", - "4 1.0\n", - " ... \n", - "6339 3.0\n", - "6340 3.0\n", - "6341 3.0\n", - "6342 3.0\n", - "6343 3.0\n", - "Name: sii, Length: 6344, dtype: float64" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_train_resampled" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "ac081d5c", - "metadata": {}, - "outputs": [], - "source": [ - "X_train = X_train_resampled\n", - "y_train = y_train_resampled\n", - "X_test = test_df\n", - "\n", - "model = RandomForestClassifier(random_state=0)\n", - "model.fit(X_train, y_train)\n", - "\n", - "test_df['sii'] = model.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "f77e9cff", - "metadata": {}, - "outputs": [], - "source": [ - "submit_df = pd.concat([test_id, test_df['sii']], axis=1)\n", - "submit_df['sii'] = submit_df['sii'].astype(int)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "fb35c244", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsii
000008ff92
1000fd4600
2001052580
300115b9f1
40016bb222
5001f33791
60038ba980
70068a4850
80069fbed0
90083e3970
100087dd650
1100abe6550
1200ae59c91
1300af63870
1400bd43590
1500c0cd712
1600d56d4b0
1700d9913d0
1800e6167c0
1900ebc35d0
\n", - "
" - ], - "text/plain": [ - " id sii\n", - "0 00008ff9 2\n", - "1 000fd460 0\n", - "2 00105258 0\n", - "3 00115b9f 1\n", - "4 0016bb22 2\n", - "5 001f3379 1\n", - "6 0038ba98 0\n", - "7 0068a485 0\n", - "8 0069fbed 0\n", - "9 0083e397 0\n", - "10 0087dd65 0\n", - "11 00abe655 0\n", - "12 00ae59c9 1\n", - "13 00af6387 0\n", - "14 00bd4359 0\n", - "15 00c0cd71 2\n", - "16 00d56d4b 0\n", - "17 00d9913d 0\n", - "18 00e6167c 0\n", - "19 00ebc35d 0" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "submit_df" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "57edb940", - "metadata": {}, - "outputs": [], - "source": [ - "submit_df.to_csv('submission.csv', index=False)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} +{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":7453542,"sourceType":"datasetVersion","datasetId":921302}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:46:49.144324Z","iopub.execute_input":"2024-11-13T05:46:49.144713Z","iopub.status.idle":"2024-11-13T05:47:21.520893Z","shell.execute_reply.started":"2024-11-13T05:46:49.144668Z","shell.execute_reply":"2024-11-13T05:47:21.519659Z"}},"outputs":[],"execution_count":1},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nfrom pytorch_tabnet.tab_model import TabNetClassifier, TabNetRegressor\nfrom xgboost import XGBRegressor\nfrom pytorch_tabnet.callbacks import Callback\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom sklearn.preprocessing import StandardScaler","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:47:21.523344Z","iopub.execute_input":"2024-11-13T05:47:21.523650Z","iopub.status.idle":"2024-11-13T05:47:26.360140Z","shell.execute_reply.started":"2024-11-13T05:47:21.523617Z","shell.execute_reply":"2024-11-13T05:47:26.359348Z"}},"outputs":[],"execution_count":2},{"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-11-13T05:47:26.361302Z","iopub.execute_input":"2024-11-13T05:47:26.361700Z","iopub.status.idle":"2024-11-13T05:47:26.436436Z","shell.execute_reply.started":"2024-11-13T05:47:26.361667Z","shell.execute_reply":"2024-11-13T05:47:26.435657Z"}},"outputs":[],"execution_count":3},{"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-11-13T05:47:26.438470Z","iopub.execute_input":"2024-11-13T05:47:26.438816Z","iopub.status.idle":"2024-11-13T05:47:26.456364Z","shell.execute_reply.started":"2024-11-13T05:47:26.438782Z","shell.execute_reply":"2024-11-13T05:47:26.455598Z"}},"outputs":[],"execution_count":4},{"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-11-13T05:47:26.457373Z","iopub.execute_input":"2024-11-13T05:47:26.457643Z","iopub.status.idle":"2024-11-13T05:47:26.586129Z","shell.execute_reply.started":"2024-11-13T05:47:26.457614Z","shell.execute_reply":"2024-11-13T05:47:26.585245Z"}},"outputs":[],"execution_count":5},{"cell_type":"code","source":"df = train_df.dropna(axis=1, thresh=len(train_df) - 3000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:47:26.587254Z","iopub.execute_input":"2024-11-13T05:47:26.587547Z","iopub.status.idle":"2024-11-13T05:47:26.599714Z","shell.execute_reply.started":"2024-11-13T05:47:26.587515Z","shell.execute_reply":"2024-11-13T05:47:26.598996Z"}},"outputs":[],"execution_count":6},{"cell_type":"code","source":"def process_file(filename, dirname):\n df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n df.drop('step', axis=1, inplace=True)\n return df.describe().values.reshape(-1), filename.split('=')[1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:47:26.600700Z","iopub.execute_input":"2024-11-13T05:47:26.600978Z","iopub.status.idle":"2024-11-13T05:47:26.606093Z","shell.execute_reply.started":"2024-11-13T05:47:26.600948Z","shell.execute_reply":"2024-11-13T05:47:26.605265Z"}},"outputs":[],"execution_count":7},{"cell_type":"code","source":"def load_time_series(dirname) -> pd.DataFrame:\n ids = os.listdir(dirname)\n \n with ThreadPoolExecutor() as executor:\n results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n \n stats, indexes = zip(*results)\n \n df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))])\n df['id'] = indexes\n \n return df\n\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\n\ndef feature_engineering(df):\n season_cols = [col for col in df.columns if 'Season' in col]\n df = df.drop(season_cols, axis=1) \n df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age']\n df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n df['BMI_Internet_Hours'] = df['Physical-BMI'] * df['PreInt_EduHx-computerinternet_hoursday']\n df['BFP_BMI'] = df['BIA-BIA_Fat'] / df['BIA-BIA_BMI']\n df['FFMI_BFP'] = df['BIA-BIA_FFMI'] / df['BIA-BIA_Fat']\n df['FMI_BFP'] = df['BIA-BIA_FMI'] / df['BIA-BIA_Fat']\n df['LST_TBW'] = df['BIA-BIA_LST'] / df['BIA-BIA_TBW']\n df['BFP_BMR'] = df['BIA-BIA_Fat'] * df['BIA-BIA_BMR']\n df['BFP_DEE'] = df['BIA-BIA_Fat'] * df['BIA-BIA_DEE']\n # df['BMR_Weight'] = df['BIA-BIA_BMR'] / df['Physical-Weight']\n # df['DEE_Weight'] = df['BIA-BIA_DEE'] / df['Physical-Weight']\n df['SMM_Height'] = df['BIA-BIA_SMM'] / df['Physical-Height']\n df['Muscle_to_Fat'] = df['BIA-BIA_SMM'] / df['BIA-BIA_FMI']\n # df['Hydration_Status'] = df['BIA-BIA_TBW'] / df['Physical-Weight']\n df['ICW_TBW'] = df['BIA-BIA_ICW'] / df['BIA-BIA_TBW']\n \n return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:47:26.607577Z","iopub.execute_input":"2024-11-13T05:47:26.607928Z","iopub.status.idle":"2024-11-13T05:47:26.627323Z","shell.execute_reply.started":"2024-11-13T05:47:26.607889Z","shell.execute_reply":"2024-11-13T05:47:26.626499Z"}},"outputs":[],"execution_count":8},{"cell_type":"code","source":"# 把SII是空的column刪除\ntrain_df = train_df.dropna(subset=['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:47:26.628552Z","iopub.execute_input":"2024-11-13T05:47:26.628895Z","iopub.status.idle":"2024-11-13T05:47:26.643958Z","shell.execute_reply.started":"2024-11-13T05:47:26.628855Z","shell.execute_reply":"2024-11-13T05:47:26.643000Z"}},"outputs":[],"execution_count":9},{"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-11-13T05:47:26.647652Z","iopub.execute_input":"2024-11-13T05:47:26.648313Z","iopub.status.idle":"2024-11-13T05:47:28.056316Z","shell.execute_reply.started":"2024-11-13T05:47:26.648280Z","shell.execute_reply":"2024-11-13T05:47:28.055050Z"}},"outputs":[],"execution_count":10},{"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-11-13T05:47:28.057357Z","iopub.execute_input":"2024-11-13T05:47:28.057658Z","iopub.status.idle":"2024-11-13T05:47:28.069454Z","shell.execute_reply.started":"2024-11-13T05:47:28.057620Z","shell.execute_reply":"2024-11-13T05:47:28.068574Z"}},"outputs":[],"execution_count":11},{"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 df[c] = df[c].fillna('Missing')\n df[c] = df[c].astype('category')\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-11-13T05:47:28.070494Z","iopub.execute_input":"2024-11-13T05:47:28.070811Z","iopub.status.idle":"2024-11-13T05:47:28.112556Z","shell.execute_reply.started":"2024-11-13T05:47:28.070781Z","shell.execute_reply":"2024-11-13T05:47:28.111870Z"}},"outputs":[],"execution_count":12},{"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-11-13T05:47:28.113660Z","iopub.execute_input":"2024-11-13T05:47:28.114017Z","iopub.status.idle":"2024-11-13T05:47:28.161128Z","shell.execute_reply.started":"2024-11-13T05:47:28.113975Z","shell.execute_reply":"2024-11-13T05:47:28.160436Z"}},"outputs":[],"execution_count":13},{"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-11-13T05:47:28.162106Z","iopub.execute_input":"2024-11-13T05:47:28.162408Z","iopub.status.idle":"2024-11-13T05:47:28.167753Z","shell.execute_reply.started":"2024-11-13T05:47:28.162368Z","shell.execute_reply":"2024-11-13T05:47:28.166856Z"}},"outputs":[],"execution_count":14},{"cell_type":"code","source":"# # 尋找和PCIAT_Total相關性低的column並刪除 \n# corr_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()\n# sii_corr = corr_matrix['PCIAT-PCIAT_Total'].drop('PCIAT-PCIAT_Total')\n# filtered_corr = sii_corr[(sii_corr > 0.1) | (sii_corr < -0.1)]\n# other_corr = sii_corr[(sii_corr <= 0.1) & (sii_corr >= -0.1)]\n# other_corr_columns = other_corr.index.tolist()\n# print(other_corr)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:47:28.168816Z","iopub.execute_input":"2024-11-13T05:47:28.169127Z","iopub.status.idle":"2024-11-13T05:47:28.177548Z","shell.execute_reply.started":"2024-11-13T05:47:28.169095Z","shell.execute_reply":"2024-11-13T05:47:28.176522Z"}},"outputs":[],"execution_count":15},{"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-11-13T05:47:28.178568Z","iopub.execute_input":"2024-11-13T05:47:28.178889Z","iopub.status.idle":"2024-11-13T05:47:28.186015Z","shell.execute_reply.started":"2024-11-13T05:47:28.178859Z","shell.execute_reply":"2024-11-13T05:47:28.185274Z"}},"outputs":[],"execution_count":16},{"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\ntrain_ts_noID = train_ts.drop('id', axis=1)\ntest_ts_noID = test_ts.drop('id', axis=1)\n\ntrain_ts_encoded = perform_autoencoder(train_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\ntest_ts_encoded = perform_autoencoder(test_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\n\ntime_series_cols = train_ts_encoded.columns.tolist()\ntrain_ts_encoded[\"id\"]=train_ts[\"id\"]\ntest_ts_encoded['id']=test_ts[\"id\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:47:28.187115Z","iopub.execute_input":"2024-11-13T05:47:28.188948Z","iopub.status.idle":"2024-11-13T05:49:01.937083Z","shell.execute_reply.started":"2024-11-13T05:47:28.188917Z","shell.execute_reply":"2024-11-13T05:49:01.936140Z"}},"outputs":[{"name":"stderr","text":"100%|██████████| 996/996 [01:21<00:00, 12.24it/s]\n100%|██████████| 2/2 [00:00<00:00, 10.34it/s]\n","output_type":"stream"},{"name":"stdout","text":"Epoch [10/100], Loss: 1.6444]\nEpoch [20/100], Loss: 1.5530]\nEpoch [30/100], Loss: 1.5247]\nEpoch [40/100], Loss: 1.5126]\nEpoch [50/100], Loss: 1.5120]\nEpoch [60/100], Loss: 1.5064]\nEpoch [70/100], Loss: 1.5068]\nEpoch [80/100], Loss: 1.5042]\nEpoch [90/100], Loss: 1.4803]\nEpoch [100/100], Loss: 1.4700]\nEpoch [10/100], Loss: 0.9721]\nEpoch [20/100], Loss: 0.4846]\nEpoch [30/100], Loss: 0.4271]\nEpoch [40/100], Loss: 0.4271]\nEpoch [50/100], Loss: 0.4271]\nEpoch [60/100], Loss: 0.4271]\nEpoch [70/100], Loss: 0.4271]\nEpoch [80/100], Loss: 0.4271]\nEpoch [90/100], Loss: 0.4271]\nEpoch [100/100], Loss: 0.4271]\n","output_type":"stream"}],"execution_count":17},{"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-11-13T05:49:01.938394Z","iopub.execute_input":"2024-11-13T05:49:01.938891Z","iopub.status.idle":"2024-11-13T05:49:01.945395Z","shell.execute_reply.started":"2024-11-13T05:49:01.938856Z","shell.execute_reply":"2024-11-13T05:49:01.944474Z"}},"outputs":[],"execution_count":18},{"cell_type":"code","source":"train_df = pd.merge(train_df, train_ts_encoded, how=\"left\", on='id')\ntest_df = pd.merge(test_df, test_ts_encoded, how=\"left\", on='id')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:01.946900Z","iopub.execute_input":"2024-11-13T05:49:01.947195Z","iopub.status.idle":"2024-11-13T05:49:01.980265Z","shell.execute_reply.started":"2024-11-13T05:49:01.947164Z","shell.execute_reply":"2024-11-13T05:49:01.979392Z"}},"outputs":[],"execution_count":19},{"cell_type":"code","source":"imputer = KNNImputer(n_neighbors=5)\nnumeric_cols = train_df.select_dtypes(include=['float64', 'int64','float32', 'int32']).columns\nimputed_data = imputer.fit_transform(train_df[numeric_cols])\ntrain_imputed = pd.DataFrame(imputed_data, columns=numeric_cols)\ntrain_imputed['sii'] = train_imputed['sii'].round().astype(int)\nfor col in train_df.columns:\n if col not in numeric_cols:\n train_imputed[col] = train_df[col]\n \ntrain_df = train_imputed\n\ntrain_df = feature_engineering(train_df)\ntrain_df = train_df.dropna(thresh=10, axis=0)\ntest_df = feature_engineering(test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:01.981365Z","iopub.execute_input":"2024-11-13T05:49:01.981932Z","iopub.status.idle":"2024-11-13T05:49:05.215521Z","shell.execute_reply.started":"2024-11-13T05:49:01.981898Z","shell.execute_reply":"2024-11-13T05:49:05.214702Z"}},"outputs":[],"execution_count":20},{"cell_type":"code","source":"# train_df = train_df.drop(columns=other_corr_columns)\n# test_df = test_df.drop(columns=other_corr_columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.216628Z","iopub.execute_input":"2024-11-13T05:49:05.216938Z","iopub.status.idle":"2024-11-13T05:49:05.221191Z","shell.execute_reply.started":"2024-11-13T05:49:05.216906Z","shell.execute_reply":"2024-11-13T05:49:05.220002Z"}},"outputs":[],"execution_count":21},{"cell_type":"code","source":"featuresCols = ['Basic_Demos-Age', 'Basic_Demos-Sex',\n 'CGAS-CGAS_Score', 'Physical-BMI',\n 'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n 'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n 'Fitness_Endurance-Max_Stage',\n 'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n 'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n 'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n 'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n 'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone',\n 'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n 'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n 'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n 'BIA-BIA_TBW', 'PAQ-PAQ_Total',\n 'SDS-SDS_Total_Raw','SDS-SDS_Total_T',\n 'PreInt_EduHx-computerinternet_hoursday', 'sii', 'BMI_Age','Internet_Hours_Age','BMI_Internet_Hours',\n 'BFP_BMI', 'FFMI_BFP', 'FMI_BFP', 'LST_TBW', 'BFP_BMR', 'BFP_DEE','SMM_Height', 'Muscle_to_Fat', 'ICW_TBW']\n\nfeaturesCols += time_series_cols\n\ntrain_df = train_df[featuresCols]\ntrain_df = train_df.dropna(subset='sii')\n\nfeaturesCols = ['Basic_Demos-Age', 'Basic_Demos-Sex',\n 'CGAS-CGAS_Score', 'Physical-BMI',\n 'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n 'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n 'Fitness_Endurance-Max_Stage',\n 'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n 'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n 'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n 'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n 'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone',\n 'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n 'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n 'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n 'BIA-BIA_TBW', 'PAQ-PAQ_Total',\n 'SDS-SDS_Total_Raw',\n 'SDS-SDS_Total_T',\n 'PreInt_EduHx-computerinternet_hoursday', 'BMI_Age','Internet_Hours_Age','BMI_Internet_Hours',\n 'BFP_BMI', 'FFMI_BFP', 'FMI_BFP', 'LST_TBW', 'BFP_BMR', 'BFP_DEE',\n 'SMM_Height', 'Muscle_to_Fat', 'ICW_TBW']\n\nfeaturesCols += time_series_cols\ntest_df = test_df[featuresCols]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.222607Z","iopub.execute_input":"2024-11-13T05:49:05.222907Z","iopub.status.idle":"2024-11-13T05:49:05.237028Z","shell.execute_reply.started":"2024-11-13T05:49:05.222876Z","shell.execute_reply":"2024-11-13T05:49:05.235986Z"}},"outputs":[],"execution_count":22},{"cell_type":"code","source":"# train_df = train_df.drop('id', axis=1)\n# test_df = test_df.drop('id', axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.238314Z","iopub.execute_input":"2024-11-13T05:49:05.238602Z","iopub.status.idle":"2024-11-13T05:49:05.245472Z","shell.execute_reply.started":"2024-11-13T05:49:05.238571Z","shell.execute_reply":"2024-11-13T05:49:05.244643Z"}},"outputs":[],"execution_count":23},{"cell_type":"code","source":"print(f'Train Shape : {train_df.shape} || Test Shape : {test_df.shape}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.246391Z","iopub.execute_input":"2024-11-13T05:49:05.246936Z","iopub.status.idle":"2024-11-13T05:49:05.254552Z","shell.execute_reply.started":"2024-11-13T05:49:05.246905Z","shell.execute_reply":"2024-11-13T05:49:05.253669Z"}},"outputs":[{"name":"stdout","text":"Train Shape : (2718, 120) || Test Shape : (20, 119)\n","output_type":"stream"}],"execution_count":24},{"cell_type":"code","source":"train_df = train_df.fillna(0)\ntest_df = test_df.fillna(0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.255633Z","iopub.execute_input":"2024-11-13T05:49:05.255975Z","iopub.status.idle":"2024-11-13T05:49:05.262661Z","shell.execute_reply.started":"2024-11-13T05:49:05.255931Z","shell.execute_reply":"2024-11-13T05:49:05.261725Z"}},"outputs":[],"execution_count":25},{"cell_type":"code","source":"from imblearn.over_sampling import SMOTE\nX_train = train_df.drop(columns=['sii']) # 假設 'sii' 是目標欄位\ny_train = train_df['sii']\n\n# 使用 SMOTE 進行過採樣\nsmote = SMOTE(random_state=42)\nX_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.263929Z","iopub.execute_input":"2024-11-13T05:49:05.264314Z","iopub.status.idle":"2024-11-13T05:49:05.491792Z","shell.execute_reply.started":"2024-11-13T05:49:05.264275Z","shell.execute_reply":"2024-11-13T05:49:05.490934Z"}},"outputs":[],"execution_count":26},{"cell_type":"code","source":"X_train_resampled","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.493068Z","iopub.execute_input":"2024-11-13T05:49:05.493638Z","iopub.status.idle":"2024-11-13T05:49:05.530858Z","shell.execute_reply.started":"2024-11-13T05:49:05.493589Z","shell.execute_reply":"2024-11-13T05:49:05.529929Z"}},"outputs":[{"execution_count":27,"output_type":"execute_result","data":{"text/plain":" Basic_Demos-Age Basic_Demos-Sex CGAS-CGAS_Score Physical-BMI \\\n0 5.000000 0.000000 51.000000 16.877316 \n1 9.000000 0.000000 65.000000 14.035590 \n2 10.000000 1.000000 71.000000 16.648696 \n3 9.000000 0.000000 71.000000 18.292347 \n4 13.000000 1.000000 50.000000 22.279952 \n... ... ... ... ... \n6339 12.599601 0.000000 71.005984 28.680067 \n6340 13.646459 0.646459 57.929175 22.659126 \n6341 14.000000 0.974194 65.077417 18.905577 \n6342 17.000000 0.152939 53.058783 22.445850 \n6343 15.905620 0.000000 64.764050 45.737848 \n\n Physical-Height Physical-Weight Physical-Waist_Circumference \\\n0 46.000000 50.800000 26.000000 \n1 48.000000 46.000000 22.000000 \n2 56.500000 75.600000 26.000000 \n3 56.000000 81.600000 26.000000 \n4 59.500000 112.200000 26.000000 \n... ... ... ... \n6339 65.599601 175.479681 26.000000 \n6340 63.136403 131.784379 26.000000 \n6341 60.601618 98.790989 26.000000 \n6342 66.464713 141.155331 26.000000 \n6343 67.558987 296.787350 48.457316 \n\n Physical-Diastolic_BP Physical-HeartRate Physical-Systolic_BP ... \\\n0 68.000000 81.000000 114.000000 ... \n1 75.000000 70.000000 122.000000 ... \n2 65.000000 94.000000 117.000000 ... \n3 60.000000 97.000000 117.000000 ... \n4 60.000000 73.000000 102.000000 ... \n... ... ... ... ... \n6339 74.897407 86.599601 134.201197 ... \n6340 97.929175 87.363743 154.192073 ... \n6341 104.045194 81.000000 144.200028 ... \n6342 79.694122 79.529392 128.847061 ... \n6343 71.480911 92.669670 156.150581 ... \n\n Enc_51 Enc_52 Enc_53 Enc_54 Enc_55 Enc_56 Enc_57 \\\n0 1.261670 3.364906 1.822499 3.199418 1.867914 0.601543 1.124913 \n1 0.877661 2.240514 2.114751 1.985586 2.209620 0.819748 2.199565 \n2 1.659091 0.704123 1.858778 1.130553 1.789839 1.242414 6.432002 \n3 1.258142 2.517515 0.000000 2.423617 2.779365 0.000000 0.000000 \n4 2.321296 0.205333 3.107339 0.000000 3.114447 1.274335 3.261590 \n... ... ... ... ... ... ... ... \n6339 0.525903 0.324441 3.958662 0.538026 1.577378 1.804936 2.348030 \n6340 0.722748 0.678223 3.279521 0.606808 2.857975 2.727269 1.942552 \n6341 0.100740 0.387067 3.715885 0.029209 3.591292 3.906484 1.904498 \n6342 1.780591 0.936604 2.920789 0.641967 2.601398 1.152416 3.379448 \n6343 2.631158 0.894702 2.344437 2.090473 2.944876 1.378858 1.562434 \n\n Enc_58 Enc_59 Enc_60 \n0 1.397312 2.965155 1.810345 \n1 1.322297 1.787001 1.673745 \n2 1.905194 0.867131 2.600431 \n3 0.000000 2.142169 0.294263 \n4 2.929590 1.146064 0.000000 \n... ... ... ... \n6339 3.283607 2.516716 2.757017 \n6340 1.797713 1.541758 3.451328 \n6341 1.364211 1.504025 4.319537 \n6342 2.633135 0.877951 1.667096 \n6343 2.606388 2.460010 1.192702 \n\n[6344 rows x 119 columns]","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Basic_Demos-AgeBasic_Demos-SexCGAS-CGAS_ScorePhysical-BMIPhysical-HeightPhysical-WeightPhysical-Waist_CircumferencePhysical-Diastolic_BPPhysical-HeartRatePhysical-Systolic_BP...Enc_51Enc_52Enc_53Enc_54Enc_55Enc_56Enc_57Enc_58Enc_59Enc_60
05.0000000.00000051.00000016.87731646.00000050.80000026.00000068.00000081.000000114.000000...1.2616703.3649061.8224993.1994181.8679140.6015431.1249131.3973122.9651551.810345
19.0000000.00000065.00000014.03559048.00000046.00000022.00000075.00000070.000000122.000000...0.8776612.2405142.1147511.9855862.2096200.8197482.1995651.3222971.7870011.673745
210.0000001.00000071.00000016.64869656.50000075.60000026.00000065.00000094.000000117.000000...1.6590910.7041231.8587781.1305531.7898391.2424146.4320021.9051940.8671312.600431
39.0000000.00000071.00000018.29234756.00000081.60000026.00000060.00000097.000000117.000000...1.2581422.5175150.0000002.4236172.7793650.0000000.0000000.0000002.1421690.294263
413.0000001.00000050.00000022.27995259.500000112.20000026.00000060.00000073.000000102.000000...2.3212960.2053333.1073390.0000003.1144471.2743353.2615902.9295901.1460640.000000
..................................................................
633912.5996010.00000071.00598428.68006765.599601175.47968126.00000074.89740786.599601134.201197...0.5259030.3244413.9586620.5380261.5773781.8049362.3480303.2836072.5167162.757017
634013.6464590.64645957.92917522.65912663.136403131.78437926.00000097.92917587.363743154.192073...0.7227480.6782233.2795210.6068082.8579752.7272691.9425521.7977131.5417583.451328
634114.0000000.97419465.07741718.90557760.60161898.79098926.000000104.04519481.000000144.200028...0.1007400.3870673.7158850.0292093.5912923.9064841.9044981.3642111.5040254.319537
634217.0000000.15293953.05878322.44585066.464713141.15533126.00000079.69412279.529392128.847061...1.7805910.9366042.9207890.6419672.6013981.1524163.3794482.6331350.8779511.667096
634315.9056200.00000064.76405045.73784867.558987296.78735048.45731671.48091192.669670156.150581...2.6311580.8947022.3444372.0904732.9448761.3788581.5624342.6063882.4600101.192702
\n

6344 rows × 119 columns

\n
"},"metadata":{}}],"execution_count":27},{"cell_type":"code","source":"y_train_resampled","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.535501Z","iopub.execute_input":"2024-11-13T05:49:05.535824Z","iopub.status.idle":"2024-11-13T05:49:05.543279Z","shell.execute_reply.started":"2024-11-13T05:49:05.535790Z","shell.execute_reply":"2024-11-13T05:49:05.542154Z"}},"outputs":[{"execution_count":28,"output_type":"execute_result","data":{"text/plain":"0 2\n1 0\n2 0\n3 1\n4 1\n ..\n6339 3\n6340 3\n6341 3\n6342 3\n6343 3\nName: sii, Length: 6344, dtype: int64"},"metadata":{}}],"execution_count":28},{"cell_type":"code","source":"X_train = X_train_resampled.values\ny_train = y_train_resampled.values.reshape(-1, 1)\nX_test = test_df.values\n\n# model = MLPClassifier(hidden_layer_sizes=(128, 64, 32), max_iter=500, random_state=42)\n# model.fit(X_train, y_train)\n\n# model = RandomForestClassifier(random_state=0)\n# model.fit(X_train, y_train)\n\nX_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)\n\nmodel = TabNetRegressor(\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 模型\nmodel.fit(\n X_train, y_train,\n eval_set=[(X_val, y_val)], # 指定驗證集\n eval_name=['val'], # 命名驗證集\n eval_metric=['mae'], # 設定評估指標,例如 MAE\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)\n\n# model = XGBRegressor(\n# n_estimators=200, # 設置樹的數量\n# learning_rate=0.05, # 設置學習率\n# max_depth=6, # 最大樹深\n# subsample=0.8, # 隨機採樣比例\n# colsample_bytree=0.8, # 每棵樹的列采樣率\n# reg_alpha=1, # Increased from 0.1\n# reg_lambda=5, # Increased from 1\n# random_state=42\n# )\n\n# # 訓練 XGBRegressor,並設置早停\n# model.fit(\n# X_train, y_train,\n# eval_set=[(X_val, y_val)], # 指定驗證集\n# early_stopping_rounds=50, # 如果在 50 個 rounds 中,驗證集上的結果不再改善則停止訓練\n# verbose=True # 顯示訓練過程\n# )\n\n\ntest_df['sii'] = model.predict(X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:49:05.544770Z","iopub.execute_input":"2024-11-13T05:49:05.545171Z","iopub.status.idle":"2024-11-13T05:52:23.712861Z","shell.execute_reply.started":"2024-11-13T05:49:05.545137Z","shell.execute_reply":"2024-11-13T05:52:23.711861Z"}},"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/pytorch_tabnet/abstract_model.py:82: UserWarning: Device used : cuda\n warnings.warn(f\"Device used : {self.device}\")\n","output_type":"stream"},{"name":"stdout","text":"epoch 0 | loss: 6.48088 | val_mae: 11.4224 | 0:00:01s\nepoch 1 | loss: 3.0014 | val_mae: 5.97052 | 0:00:01s\nepoch 2 | loss: 2.18413 | val_mae: 4.40949 | 0:00:02s\nepoch 3 | loss: 1.87663 | val_mae: 3.81592 | 0:00:02s\nepoch 4 | loss: 1.22423 | val_mae: 3.40053 | 0:00:02s\nepoch 5 | loss: 1.08828 | val_mae: 2.61743 | 0:00:03s\nepoch 6 | loss: 0.97629 | val_mae: 3.78685 | 0:00:03s\nepoch 7 | loss: 0.89271 | val_mae: 5.3196 | 0:00:04s\nepoch 8 | loss: 0.85532 | val_mae: 5.82879 | 0:00:04s\nepoch 9 | loss: 0.74888 | val_mae: 2.86027 | 0:00:04s\nepoch 10 | loss: 0.6972 | val_mae: 1.41034 | 0:00:05s\nepoch 11 | loss: 0.69719 | val_mae: 1.28311 | 0:00:05s\nepoch 12 | loss: 0.69969 | val_mae: 1.14508 | 0:00:06s\nepoch 13 | loss: 0.59078 | val_mae: 1.08213 | 0:00:06s\nepoch 14 | loss: 0.60524 | val_mae: 1.15833 | 0:00:07s\nepoch 15 | loss: 0.61787 | val_mae: 0.88686 | 0:00:07s\nepoch 16 | loss: 0.62558 | val_mae: 0.93153 | 0:00:07s\nepoch 17 | loss: 0.57334 | val_mae: 0.93411 | 0:00:08s\nepoch 18 | loss: 0.58509 | val_mae: 0.93036 | 0:00:08s\nepoch 19 | loss: 0.52418 | val_mae: 0.91495 | 0:00:08s\nepoch 20 | loss: 0.51392 | val_mae: 0.86802 | 0:00:09s\nepoch 21 | loss: 0.52913 | val_mae: 0.87921 | 0:00:09s\nepoch 22 | loss: 0.54695 | val_mae: 0.79027 | 0:00:10s\nepoch 23 | loss: 0.52668 | val_mae: 0.73901 | 0:00:10s\nepoch 24 | loss: 0.5011 | val_mae: 0.75841 | 0:00:10s\nepoch 25 | loss: 0.47266 | val_mae: 0.7547 | 0:00:11s\nepoch 26 | loss: 0.45865 | val_mae: 0.76172 | 0:00:11s\nepoch 27 | loss: 0.46872 | val_mae: 0.79685 | 0:00:12s\nepoch 28 | loss: 0.44856 | val_mae: 0.76449 | 0:00:12s\nepoch 29 | loss: 0.46872 | val_mae: 0.71646 | 0:00:12s\nepoch 30 | loss: 0.44068 | val_mae: 0.72265 | 0:00:13s\nepoch 31 | loss: 0.42659 | val_mae: 0.69917 | 0:00:13s\nepoch 32 | loss: 0.4546 | val_mae: 0.6914 | 0:00:14s\nepoch 33 | loss: 0.44429 | val_mae: 0.70442 | 0:00:14s\nepoch 34 | loss: 0.4369 | val_mae: 0.70166 | 0:00:14s\nepoch 35 | loss: 0.40845 | val_mae: 0.67789 | 0:00:15s\nepoch 36 | loss: 0.3948 | val_mae: 0.66101 | 0:00:15s\nepoch 37 | loss: 0.38659 | val_mae: 0.63114 | 0:00:15s\nepoch 38 | loss: 0.39296 | val_mae: 0.62454 | 0:00:16s\nepoch 39 | loss: 0.39577 | val_mae: 0.57916 | 0:00:16s\nepoch 40 | loss: 0.39311 | val_mae: 0.57471 | 0:00:17s\nepoch 41 | loss: 0.38526 | val_mae: 0.56525 | 0:00:17s\nepoch 42 | loss: 0.37192 | val_mae: 0.54737 | 0:00:18s\nepoch 43 | loss: 0.3588 | val_mae: 0.55591 | 0:00:18s\nepoch 44 | loss: 0.35507 | val_mae: 0.54695 | 0:00:18s\nepoch 45 | loss: 0.35904 | val_mae: 0.56725 | 0:00:19s\nepoch 46 | loss: 0.353 | val_mae: 0.56555 | 0:00:19s\nepoch 47 | loss: 0.33853 | val_mae: 0.55043 | 0:00:19s\nepoch 48 | loss: 0.33528 | val_mae: 0.53158 | 0:00:20s\nepoch 49 | loss: 0.33009 | val_mae: 0.53298 | 0:00:20s\nepoch 50 | loss: 0.322 | val_mae: 0.53689 | 0:00:21s\nepoch 51 | loss: 0.31595 | val_mae: 0.51777 | 0:00:21s\nepoch 52 | loss: 0.3147 | val_mae: 0.52906 | 0:00:22s\nepoch 53 | loss: 0.30779 | val_mae: 0.51697 | 0:00:22s\nepoch 54 | loss: 0.30978 | val_mae: 0.5383 | 0:00:22s\nepoch 55 | loss: 0.31289 | val_mae: 0.52325 | 0:00:23s\nepoch 56 | loss: 0.32303 | val_mae: 0.5209 | 0:00:23s\nepoch 57 | loss: 0.31037 | val_mae: 0.50058 | 0:00:24s\nepoch 58 | loss: 0.29908 | val_mae: 0.49511 | 0:00:24s\nepoch 59 | loss: 0.30051 | val_mae: 0.4947 | 0:00:24s\nepoch 60 | loss: 0.30248 | val_mae: 0.49454 | 0:00:25s\nepoch 61 | loss: 0.28474 | val_mae: 0.47484 | 0:00:25s\nepoch 62 | loss: 0.27101 | val_mae: 0.46047 | 0:00:26s\nepoch 63 | loss: 0.26703 | val_mae: 0.48885 | 0:00:26s\nepoch 64 | loss: 0.27625 | val_mae: 0.46967 | 0:00:27s\nepoch 65 | loss: 0.26972 | val_mae: 0.45922 | 0:00:27s\nepoch 66 | loss: 0.27568 | val_mae: 0.4646 | 0:00:27s\nepoch 67 | loss: 0.28902 | val_mae: 0.45984 | 0:00:28s\nepoch 68 | loss: 0.28289 | val_mae: 0.47522 | 0:00:28s\nepoch 69 | loss: 0.29235 | val_mae: 0.45521 | 0:00:28s\nepoch 70 | loss: 0.28482 | val_mae: 0.47567 | 0:00:29s\nepoch 71 | loss: 0.28862 | val_mae: 0.45885 | 0:00:29s\nepoch 72 | loss: 0.27421 | val_mae: 0.44701 | 0:00:30s\nepoch 73 | loss: 0.2607 | val_mae: 0.43948 | 0:00:30s\nepoch 74 | loss: 0.25798 | val_mae: 0.45778 | 0:00:30s\nepoch 75 | loss: 0.25439 | val_mae: 0.43334 | 0:00:31s\nepoch 76 | loss: 0.24477 | val_mae: 0.43692 | 0:00:31s\nepoch 77 | loss: 0.23369 | val_mae: 0.41563 | 0:00:32s\nepoch 78 | loss: 0.22097 | val_mae: 0.42804 | 0:00:32s\nepoch 79 | loss: 0.22463 | val_mae: 0.41656 | 0:00:32s\nepoch 80 | loss: 0.21311 | val_mae: 0.43018 | 0:00:33s\nepoch 81 | loss: 0.22251 | val_mae: 0.42096 | 0:00:33s\nepoch 82 | loss: 0.23856 | val_mae: 0.4346 | 0:00:34s\nepoch 83 | loss: 0.22806 | val_mae: 0.45499 | 0:00:34s\nepoch 84 | loss: 0.2249 | val_mae: 0.41676 | 0:00:34s\nepoch 85 | loss: 0.20735 | val_mae: 0.42195 | 0:00:35s\nepoch 86 | loss: 0.19801 | val_mae: 0.40718 | 0:00:35s\nepoch 87 | loss: 0.18962 | val_mae: 0.41033 | 0:00:36s\nepoch 88 | loss: 0.18901 | val_mae: 0.38627 | 0:00:36s\nepoch 89 | loss: 0.18984 | val_mae: 0.39282 | 0:00:36s\nepoch 90 | loss: 0.18969 | val_mae: 0.3895 | 0:00:37s\nepoch 91 | loss: 0.18186 | val_mae: 0.40511 | 0:00:37s\nepoch 92 | loss: 0.19037 | val_mae: 0.40054 | 0:00:38s\nepoch 93 | loss: 0.18903 | val_mae: 0.39453 | 0:00:38s\nepoch 94 | loss: 0.18476 | val_mae: 0.39046 | 0:00:38s\nepoch 95 | loss: 0.17165 | val_mae: 0.38591 | 0:00:39s\nepoch 96 | loss: 0.16755 | val_mae: 0.38735 | 0:00:39s\nepoch 97 | loss: 0.16491 | val_mae: 0.3851 | 0:00:39s\nepoch 98 | loss: 0.1659 | val_mae: 0.37832 | 0:00:40s\nepoch 99 | loss: 0.15661 | val_mae: 0.37687 | 0:00:40s\nepoch 100| loss: 0.15818 | val_mae: 0.38168 | 0:00:41s\nepoch 101| loss: 0.15682 | val_mae: 0.38221 | 0:00:41s\nepoch 102| loss: 0.15139 | val_mae: 0.36793 | 0:00:41s\nepoch 103| loss: 0.14553 | val_mae: 0.37494 | 0:00:42s\nepoch 104| loss: 0.14443 | val_mae: 0.37052 | 0:00:42s\nepoch 105| loss: 0.13828 | val_mae: 0.37553 | 0:00:43s\nepoch 106| loss: 0.14546 | val_mae: 0.3655 | 0:00:43s\nepoch 107| loss: 0.13861 | val_mae: 0.36527 | 0:00:43s\nepoch 108| loss: 0.13595 | val_mae: 0.37287 | 0:00:44s\nepoch 109| loss: 0.13018 | val_mae: 0.37096 | 0:00:44s\nepoch 110| loss: 0.12787 | val_mae: 0.36449 | 0:00:45s\nepoch 111| loss: 0.13244 | val_mae: 0.37788 | 0:00:45s\nepoch 112| loss: 0.14916 | val_mae: 0.38248 | 0:00:45s\nepoch 113| loss: 0.16093 | val_mae: 0.3897 | 0:00:46s\nepoch 114| loss: 0.16199 | val_mae: 0.39899 | 0:00:46s\nepoch 115| loss: 0.16366 | val_mae: 0.38225 | 0:00:47s\nepoch 116| loss: 0.16124 | val_mae: 0.3761 | 0:00:47s\nepoch 117| loss: 0.15309 | val_mae: 0.37511 | 0:00:47s\nepoch 118| loss: 0.15655 | val_mae: 0.38381 | 0:00:48s\nepoch 119| loss: 0.15274 | val_mae: 0.38961 | 0:00:48s\nepoch 120| loss: 0.15683 | val_mae: 0.369 | 0:00:48s\nepoch 121| loss: 0.1511 | val_mae: 0.39378 | 0:00:49s\nepoch 122| loss: 0.14418 | val_mae: 0.39161 | 0:00:49s\nepoch 123| loss: 0.13844 | val_mae: 0.37324 | 0:00:50s\nepoch 124| loss: 0.13275 | val_mae: 0.35898 | 0:00:50s\nepoch 125| loss: 0.12284 | val_mae: 0.35898 | 0:00:50s\nepoch 126| loss: 0.11983 | val_mae: 0.35964 | 0:00:51s\nepoch 127| loss: 0.11664 | val_mae: 0.34983 | 0:00:51s\nepoch 128| loss: 0.11573 | val_mae: 0.34319 | 0:00:52s\nepoch 129| loss: 0.11149 | val_mae: 0.34795 | 0:00:52s\nepoch 130| loss: 0.11477 | val_mae: 0.34277 | 0:00:52s\nepoch 131| loss: 0.10572 | val_mae: 0.3419 | 0:00:53s\nepoch 132| loss: 0.10359 | val_mae: 0.33799 | 0:00:53s\nepoch 133| loss: 0.09949 | val_mae: 0.34125 | 0:00:54s\nepoch 134| loss: 0.10497 | val_mae: 0.33852 | 0:00:54s\nepoch 135| loss: 0.0997 | val_mae: 0.34089 | 0:00:55s\nepoch 136| loss: 0.09739 | val_mae: 0.33332 | 0:00:55s\nepoch 137| loss: 0.09458 | val_mae: 0.33695 | 0:00:55s\nepoch 138| loss: 0.09471 | val_mae: 0.33592 | 0:00:56s\nepoch 139| loss: 0.09454 | val_mae: 0.33795 | 0:00:56s\nepoch 140| loss: 0.09362 | val_mae: 0.33736 | 0:00:57s\nepoch 141| loss: 0.09201 | val_mae: 0.34156 | 0:00:57s\nepoch 142| loss: 0.10164 | val_mae: 0.33414 | 0:00:57s\nepoch 143| loss: 0.09523 | val_mae: 0.33537 | 0:00:58s\nepoch 144| loss: 0.0903 | val_mae: 0.3345 | 0:00:58s\nepoch 145| loss: 0.09123 | val_mae: 0.329 | 0:00:59s\nepoch 146| loss: 0.09036 | val_mae: 0.33208 | 0:00:59s\nepoch 147| loss: 0.08732 | val_mae: 0.32531 | 0:00:59s\nepoch 148| loss: 0.08969 | val_mae: 0.32206 | 0:01:00s\nepoch 149| loss: 0.08871 | val_mae: 0.32377 | 0:01:00s\nepoch 150| loss: 0.08823 | val_mae: 0.31975 | 0:01:00s\nepoch 151| loss: 0.08112 | val_mae: 0.31621 | 0:01:01s\nepoch 152| loss: 0.08145 | val_mae: 0.3287 | 0:01:01s\nepoch 153| loss: 0.08241 | val_mae: 0.32463 | 0:01:02s\nepoch 154| loss: 0.07735 | val_mae: 0.32352 | 0:01:02s\nepoch 155| loss: 0.07764 | val_mae: 0.32413 | 0:01:03s\nepoch 156| loss: 0.08354 | val_mae: 0.32483 | 0:01:03s\nepoch 157| loss: 0.08031 | val_mae: 0.32112 | 0:01:03s\nepoch 158| loss: 0.07694 | val_mae: 0.32268 | 0:01:04s\nepoch 159| loss: 0.07843 | val_mae: 0.32354 | 0:01:04s\nepoch 160| loss: 0.07475 | val_mae: 0.31299 | 0:01:04s\nepoch 161| loss: 0.07048 | val_mae: 0.31245 | 0:01:05s\nepoch 162| loss: 0.07815 | val_mae: 0.31995 | 0:01:05s\nepoch 163| loss: 0.08051 | val_mae: 0.32467 | 0:01:06s\nepoch 164| loss: 0.08253 | val_mae: 0.31931 | 0:01:06s\nepoch 165| loss: 0.07915 | val_mae: 0.31159 | 0:01:07s\nepoch 166| loss: 0.07401 | val_mae: 0.31821 | 0:01:07s\nepoch 167| loss: 0.0715 | val_mae: 0.3107 | 0:01:07s\nepoch 168| loss: 0.07332 | val_mae: 0.31703 | 0:01:08s\nepoch 169| loss: 0.07948 | val_mae: 0.3217 | 0:01:08s\nepoch 170| loss: 0.08399 | val_mae: 0.32094 | 0:01:08s\nepoch 171| loss: 0.07646 | val_mae: 0.33298 | 0:01:09s\nepoch 172| loss: 0.07377 | val_mae: 0.31219 | 0:01:09s\nepoch 173| loss: 0.06844 | val_mae: 0.31301 | 0:01:10s\nepoch 174| loss: 0.07071 | val_mae: 0.3111 | 0:01:10s\nepoch 175| loss: 0.06722 | val_mae: 0.31464 | 0:01:10s\nepoch 176| loss: 0.0657 | val_mae: 0.30792 | 0:01:11s\nepoch 177| loss: 0.06514 | val_mae: 0.3219 | 0:01:11s\nepoch 178| loss: 0.0656 | val_mae: 0.3148 | 0:01:12s\nepoch 179| loss: 0.06385 | val_mae: 0.30718 | 0:01:12s\nepoch 180| loss: 0.06551 | val_mae: 0.31059 | 0:01:12s\nepoch 181| loss: 0.06243 | val_mae: 0.30552 | 0:01:13s\nepoch 182| loss: 0.05909 | val_mae: 0.31088 | 0:01:13s\nepoch 183| loss: 0.05926 | val_mae: 0.30634 | 0:01:14s\nepoch 184| loss: 0.05498 | val_mae: 0.30431 | 0:01:14s\nepoch 185| loss: 0.0567 | val_mae: 0.30047 | 0:01:14s\nepoch 186| loss: 0.05317 | val_mae: 0.29815 | 0:01:15s\nepoch 187| loss: 0.05156 | val_mae: 0.30129 | 0:01:15s\nepoch 188| loss: 0.05506 | val_mae: 0.29738 | 0:01:15s\nepoch 189| loss: 0.0545 | val_mae: 0.29256 | 0:01:16s\nepoch 190| loss: 0.0492 | val_mae: 0.29233 | 0:01:16s\nepoch 191| loss: 0.04835 | val_mae: 0.31109 | 0:01:17s\nepoch 192| loss: 0.05484 | val_mae: 0.2929 | 0:01:17s\nepoch 193| loss: 0.04864 | val_mae: 0.29071 | 0:01:17s\nepoch 194| loss: 0.04966 | val_mae: 0.29721 | 0:01:18s\nepoch 195| loss: 0.04741 | val_mae: 0.29565 | 0:01:18s\nepoch 196| loss: 0.04409 | val_mae: 0.29069 | 0:01:19s\nepoch 197| loss: 0.04661 | val_mae: 0.29113 | 0:01:19s\nepoch 198| loss: 0.04292 | val_mae: 0.29111 | 0:01:19s\nepoch 199| loss: 0.04267 | val_mae: 0.29373 | 0:01:20s\nepoch 200| loss: 0.04457 | val_mae: 0.28697 | 0:01:20s\nepoch 201| loss: 0.04033 | val_mae: 0.28897 | 0:01:21s\nepoch 202| loss: 0.04443 | val_mae: 0.2995 | 0:01:21s\nepoch 203| loss: 0.04422 | val_mae: 0.29514 | 0:01:21s\nepoch 204| loss: 0.04595 | val_mae: 0.29696 | 0:01:22s\nepoch 205| loss: 0.04591 | val_mae: 0.29156 | 0:01:22s\nepoch 206| loss: 0.04603 | val_mae: 0.29039 | 0:01:23s\nepoch 207| loss: 0.0478 | val_mae: 0.28577 | 0:01:23s\nepoch 208| loss: 0.04331 | val_mae: 0.28226 | 0:01:23s\nepoch 209| loss: 0.04061 | val_mae: 0.2838 | 0:01:24s\nepoch 210| loss: 0.03885 | val_mae: 0.27524 | 0:01:24s\nepoch 211| loss: 0.04033 | val_mae: 0.27871 | 0:01:25s\nepoch 212| loss: 0.03702 | val_mae: 0.27508 | 0:01:25s\nepoch 213| loss: 0.03761 | val_mae: 0.27015 | 0:01:26s\nepoch 214| loss: 0.03627 | val_mae: 0.276 | 0:01:26s\nepoch 215| loss: 0.03595 | val_mae: 0.27179 | 0:01:26s\nepoch 216| loss: 0.03348 | val_mae: 0.26921 | 0:01:27s\nepoch 217| loss: 0.03641 | val_mae: 0.27974 | 0:01:27s\nepoch 218| loss: 0.03771 | val_mae: 0.2777 | 0:01:28s\nepoch 219| loss: 0.03705 | val_mae: 0.26746 | 0:01:28s\nepoch 220| loss: 0.03151 | val_mae: 0.27308 | 0:01:28s\nepoch 221| loss: 0.03456 | val_mae: 0.27159 | 0:01:29s\nepoch 222| loss: 0.03258 | val_mae: 0.27376 | 0:01:29s\nepoch 223| loss: 0.03368 | val_mae: 0.27243 | 0:01:30s\nepoch 224| loss: 0.03005 | val_mae: 0.26911 | 0:01:30s\nepoch 225| loss: 0.03335 | val_mae: 0.26408 | 0:01:30s\nepoch 226| loss: 0.03271 | val_mae: 0.27387 | 0:01:31s\nepoch 227| loss: 0.03436 | val_mae: 0.26946 | 0:01:31s\nepoch 228| loss: 0.03145 | val_mae: 0.26807 | 0:01:32s\nepoch 229| loss: 0.02826 | val_mae: 0.26407 | 0:01:32s\nepoch 230| loss: 0.02924 | val_mae: 0.26663 | 0:01:33s\nepoch 231| loss: 0.02924 | val_mae: 0.26137 | 0:01:33s\nepoch 232| loss: 0.02976 | val_mae: 0.26726 | 0:01:34s\nepoch 233| loss: 0.02795 | val_mae: 0.26878 | 0:01:34s\nepoch 234| loss: 0.02723 | val_mae: 0.25983 | 0:01:34s\nepoch 235| loss: 0.02601 | val_mae: 0.26364 | 0:01:35s\nepoch 236| loss: 0.02506 | val_mae: 0.27109 | 0:01:35s\nepoch 237| loss: 0.02352 | val_mae: 0.25968 | 0:01:36s\nepoch 238| loss: 0.02833 | val_mae: 0.26282 | 0:01:36s\nepoch 239| loss: 0.02536 | val_mae: 0.26077 | 0:01:36s\nepoch 240| loss: 0.0264 | val_mae: 0.26619 | 0:01:37s\nepoch 241| loss: 0.03178 | val_mae: 0.28542 | 0:01:37s\nepoch 242| loss: 0.02852 | val_mae: 0.27186 | 0:01:38s\nepoch 243| loss: 0.0332 | val_mae: 0.27562 | 0:01:38s\nepoch 244| loss: 0.02824 | val_mae: 0.27803 | 0:01:38s\nepoch 245| loss: 0.02788 | val_mae: 0.26828 | 0:01:39s\nepoch 246| loss: 0.02456 | val_mae: 0.26329 | 0:01:39s\nepoch 247| loss: 0.02478 | val_mae: 0.26422 | 0:01:40s\nepoch 248| loss: 0.02591 | val_mae: 0.2629 | 0:01:40s\nepoch 249| loss: 0.0236 | val_mae: 0.26416 | 0:01:40s\nepoch 250| loss: 0.02225 | val_mae: 0.25688 | 0:01:41s\nepoch 251| loss: 0.02363 | val_mae: 0.26074 | 0:01:41s\nepoch 252| loss: 0.02326 | val_mae: 0.25867 | 0:01:41s\nepoch 253| loss: 0.02177 | val_mae: 0.25618 | 0:01:42s\nepoch 254| loss: 0.02011 | val_mae: 0.26251 | 0:01:42s\nepoch 255| loss: 0.02092 | val_mae: 0.25696 | 0:01:43s\nepoch 256| loss: 0.02187 | val_mae: 0.26532 | 0:01:43s\nepoch 257| loss: 0.02092 | val_mae: 0.2562 | 0:01:43s\nepoch 258| loss: 0.0212 | val_mae: 0.26377 | 0:01:44s\nepoch 259| loss: 0.02127 | val_mae: 0.25465 | 0:01:44s\nepoch 260| loss: 0.01991 | val_mae: 0.26485 | 0:01:45s\nepoch 261| loss: 0.01881 | val_mae: 0.25565 | 0:01:45s\nepoch 262| loss: 0.0201 | val_mae: 0.26203 | 0:01:45s\nepoch 263| loss: 0.01757 | val_mae: 0.25431 | 0:01:46s\nepoch 264| loss: 0.01781 | val_mae: 0.25519 | 0:01:46s\nepoch 265| loss: 0.02158 | val_mae: 0.25456 | 0:01:47s\nepoch 266| loss: 0.01944 | val_mae: 0.25477 | 0:01:47s\nepoch 267| loss: 0.01776 | val_mae: 0.25359 | 0:01:47s\nepoch 268| loss: 0.01894 | val_mae: 0.25991 | 0:01:48s\nepoch 269| loss: 0.01676 | val_mae: 0.25183 | 0:01:48s\nepoch 270| loss: 0.01739 | val_mae: 0.25645 | 0:01:48s\nepoch 271| loss: 0.01729 | val_mae: 0.25526 | 0:01:49s\nepoch 272| loss: 0.01606 | val_mae: 0.25172 | 0:01:49s\nepoch 273| loss: 0.0174 | val_mae: 0.25336 | 0:01:50s\nepoch 274| loss: 0.01596 | val_mae: 0.2507 | 0:01:50s\nepoch 275| loss: 0.01818 | val_mae: 0.25323 | 0:01:50s\nepoch 276| loss: 0.01563 | val_mae: 0.25342 | 0:01:51s\nepoch 277| loss: 0.01736 | val_mae: 0.25319 | 0:01:51s\nepoch 278| loss: 0.0165 | val_mae: 0.25224 | 0:01:52s\nepoch 279| loss: 0.01725 | val_mae: 0.25216 | 0:01:52s\nepoch 280| loss: 0.01883 | val_mae: 0.25905 | 0:01:52s\nepoch 281| loss: 0.01695 | val_mae: 0.24956 | 0:01:53s\nepoch 282| loss: 0.0155 | val_mae: 0.25363 | 0:01:53s\nepoch 283| loss: 0.01619 | val_mae: 0.24633 | 0:01:53s\nepoch 284| loss: 0.01479 | val_mae: 0.24688 | 0:01:54s\nepoch 285| loss: 0.016 | val_mae: 0.25018 | 0:01:54s\nepoch 286| loss: 0.01815 | val_mae: 0.25087 | 0:01:55s\nepoch 287| loss: 0.01778 | val_mae: 0.25068 | 0:01:55s\nepoch 288| loss: 0.01582 | val_mae: 0.24758 | 0:01:55s\nepoch 289| loss: 0.01415 | val_mae: 0.24894 | 0:01:56s\nepoch 290| loss: 0.01544 | val_mae: 0.25109 | 0:01:56s\nepoch 291| loss: 0.01563 | val_mae: 0.25023 | 0:01:57s\nepoch 292| loss: 0.0141 | val_mae: 0.25286 | 0:01:57s\nepoch 293| loss: 0.01345 | val_mae: 0.24635 | 0:01:58s\nepoch 294| loss: 0.01345 | val_mae: 0.24745 | 0:01:58s\nepoch 295| loss: 0.01286 | val_mae: 0.24596 | 0:01:59s\nepoch 296| loss: 0.01353 | val_mae: 0.24833 | 0:01:59s\nepoch 297| loss: 0.01323 | val_mae: 0.24714 | 0:01:59s\nepoch 298| loss: 0.01406 | val_mae: 0.24753 | 0:02:00s\nepoch 299| loss: 0.01252 | val_mae: 0.24481 | 0:02:00s\nepoch 300| loss: 0.01258 | val_mae: 0.24544 | 0:02:01s\nepoch 301| loss: 0.01243 | val_mae: 0.24218 | 0:02:01s\nepoch 302| loss: 0.01355 | val_mae: 0.24593 | 0:02:02s\nepoch 303| loss: 0.01468 | val_mae: 0.24579 | 0:02:02s\nepoch 304| loss: 0.01237 | val_mae: 0.24665 | 0:02:02s\nepoch 305| loss: 0.01206 | val_mae: 0.24304 | 0:02:03s\nepoch 306| loss: 0.01203 | val_mae: 0.2462 | 0:02:03s\nepoch 307| loss: 0.01281 | val_mae: 0.24459 | 0:02:04s\nepoch 308| loss: 0.01251 | val_mae: 0.24603 | 0:02:04s\nepoch 309| loss: 0.01191 | val_mae: 0.24828 | 0:02:04s\nepoch 310| loss: 0.01292 | val_mae: 0.2472 | 0:02:05s\nepoch 311| loss: 0.01109 | val_mae: 0.24642 | 0:02:05s\nepoch 312| loss: 0.01257 | val_mae: 0.24212 | 0:02:06s\nepoch 313| loss: 0.01379 | val_mae: 0.24634 | 0:02:06s\nepoch 314| loss: 0.0113 | val_mae: 0.24361 | 0:02:06s\nepoch 315| loss: 0.01379 | val_mae: 0.24842 | 0:02:07s\nepoch 316| loss: 0.0128 | val_mae: 0.24189 | 0:02:07s\nepoch 317| loss: 0.01164 | val_mae: 0.24365 | 0:02:08s\nepoch 318| loss: 0.01258 | val_mae: 0.24117 | 0:02:08s\nepoch 319| loss: 0.01191 | val_mae: 0.24089 | 0:02:08s\nepoch 320| loss: 0.01174 | val_mae: 0.24633 | 0:02:09s\nepoch 321| loss: 0.01162 | val_mae: 0.24518 | 0:02:09s\nepoch 322| loss: 0.01091 | val_mae: 0.24653 | 0:02:10s\nepoch 323| loss: 0.01207 | val_mae: 0.24608 | 0:02:10s\nepoch 324| loss: 0.01232 | val_mae: 0.24668 | 0:02:10s\nepoch 325| loss: 0.01416 | val_mae: 0.24462 | 0:02:11s\nepoch 326| loss: 0.01051 | val_mae: 0.24604 | 0:02:11s\nepoch 327| loss: 0.01187 | val_mae: 0.24369 | 0:02:12s\nepoch 328| loss: 0.01014 | val_mae: 0.24478 | 0:02:12s\nepoch 329| loss: 0.01284 | val_mae: 0.24228 | 0:02:12s\nepoch 330| loss: 0.01135 | val_mae: 0.24266 | 0:02:13s\nepoch 331| loss: 0.01078 | val_mae: 0.23864 | 0:02:13s\nepoch 332| loss: 0.01019 | val_mae: 0.23905 | 0:02:13s\nepoch 333| loss: 0.01029 | val_mae: 0.23965 | 0:02:14s\nepoch 334| loss: 0.00989 | val_mae: 0.23992 | 0:02:14s\nepoch 335| loss: 0.01099 | val_mae: 0.23843 | 0:02:15s\nepoch 336| loss: 0.01161 | val_mae: 0.24128 | 0:02:15s\nepoch 337| loss: 0.01031 | val_mae: 0.23989 | 0:02:15s\nepoch 338| loss: 0.01056 | val_mae: 0.24146 | 0:02:16s\nepoch 339| loss: 0.01027 | val_mae: 0.23808 | 0:02:16s\nepoch 340| loss: 0.00998 | val_mae: 0.23982 | 0:02:17s\nepoch 341| loss: 0.01053 | val_mae: 0.23861 | 0:02:17s\nepoch 342| loss: 0.00998 | val_mae: 0.2386 | 0:02:18s\nepoch 343| loss: 0.00978 | val_mae: 0.23828 | 0:02:18s\nepoch 344| loss: 0.01084 | val_mae: 0.23856 | 0:02:18s\nepoch 345| loss: 0.01058 | val_mae: 0.23884 | 0:02:19s\nepoch 346| loss: 0.00977 | val_mae: 0.23747 | 0:02:19s\nepoch 347| loss: 0.00914 | val_mae: 0.23715 | 0:02:20s\nepoch 348| loss: 0.01036 | val_mae: 0.23986 | 0:02:20s\nepoch 349| loss: 0.00963 | val_mae: 0.23694 | 0:02:20s\nepoch 350| loss: 0.00912 | val_mae: 0.23927 | 0:02:21s\nepoch 351| loss: 0.01024 | val_mae: 0.23782 | 0:02:21s\nepoch 352| loss: 0.00985 | val_mae: 0.23817 | 0:02:22s\nepoch 353| loss: 0.00918 | val_mae: 0.23642 | 0:02:22s\nepoch 354| loss: 0.00921 | val_mae: 0.23894 | 0:02:23s\nepoch 355| loss: 0.00857 | val_mae: 0.23502 | 0:02:23s\nepoch 356| loss: 0.00961 | val_mae: 0.23848 | 0:02:23s\nepoch 357| loss: 0.01006 | val_mae: 0.2352 | 0:02:24s\nepoch 358| loss: 0.00912 | val_mae: 0.23588 | 0:02:24s\nepoch 359| loss: 0.00878 | val_mae: 0.2366 | 0:02:25s\nepoch 360| loss: 0.00939 | val_mae: 0.23839 | 0:02:25s\nepoch 361| loss: 0.00829 | val_mae: 0.23657 | 0:02:26s\nepoch 362| loss: 0.00841 | val_mae: 0.23641 | 0:02:26s\nepoch 363| loss: 0.01028 | val_mae: 0.23858 | 0:02:26s\nepoch 364| loss: 0.01078 | val_mae: 0.24012 | 0:02:27s\nepoch 365| loss: 0.01015 | val_mae: 0.24296 | 0:02:27s\nepoch 366| loss: 0.01027 | val_mae: 0.24033 | 0:02:27s\nepoch 367| loss: 0.01198 | val_mae: 0.23822 | 0:02:28s\nepoch 368| loss: 0.01089 | val_mae: 0.23902 | 0:02:28s\nepoch 369| loss: 0.01139 | val_mae: 0.23662 | 0:02:29s\nepoch 370| loss: 0.00922 | val_mae: 0.23744 | 0:02:29s\nepoch 371| loss: 0.0107 | val_mae: 0.23816 | 0:02:30s\nepoch 372| loss: 0.00999 | val_mae: 0.23747 | 0:02:30s\nepoch 373| loss: 0.01083 | val_mae: 0.23821 | 0:02:30s\nepoch 374| loss: 0.00971 | val_mae: 0.23634 | 0:02:31s\nepoch 375| loss: 0.00901 | val_mae: 0.23642 | 0:02:31s\nepoch 376| loss: 0.00942 | val_mae: 0.23613 | 0:02:31s\nepoch 377| loss: 0.00946 | val_mae: 0.23654 | 0:02:32s\nepoch 378| loss: 0.01004 | val_mae: 0.23643 | 0:02:32s\nepoch 379| loss: 0.0091 | val_mae: 0.23541 | 0:02:33s\nepoch 380| loss: 0.01235 | val_mae: 0.23549 | 0:02:33s\nepoch 381| loss: 0.00885 | val_mae: 0.23527 | 0:02:34s\nepoch 382| loss: 0.00853 | val_mae: 0.2347 | 0:02:34s\nepoch 383| loss: 0.00901 | val_mae: 0.23525 | 0:02:34s\nepoch 384| loss: 0.00949 | val_mae: 0.23606 | 0:02:35s\nepoch 385| loss: 0.00914 | val_mae: 0.23582 | 0:02:35s\nepoch 386| loss: 0.00822 | val_mae: 0.23477 | 0:02:35s\nepoch 387| loss: 0.00902 | val_mae: 0.2352 | 0:02:36s\nepoch 388| loss: 0.00931 | val_mae: 0.23527 | 0:02:36s\nepoch 389| loss: 0.00878 | val_mae: 0.23438 | 0:02:37s\nepoch 390| loss: 0.0097 | val_mae: 0.23414 | 0:02:37s\nepoch 391| loss: 0.00838 | val_mae: 0.23466 | 0:02:37s\nepoch 392| loss: 0.00898 | val_mae: 0.23448 | 0:02:38s\nepoch 393| loss: 0.00934 | val_mae: 0.23371 | 0:02:38s\nepoch 394| loss: 0.00853 | val_mae: 0.23357 | 0:02:39s\nepoch 395| loss: 0.00998 | val_mae: 0.23429 | 0:02:39s\nepoch 396| loss: 0.01049 | val_mae: 0.23408 | 0:02:39s\nepoch 397| loss: 0.00791 | val_mae: 0.23593 | 0:02:40s\nepoch 398| loss: 0.00916 | val_mae: 0.23495 | 0:02:40s\nepoch 399| loss: 0.00894 | val_mae: 0.23429 | 0:02:41s\nepoch 400| loss: 0.00876 | val_mae: 0.23504 | 0:02:41s\nepoch 401| loss: 0.00902 | val_mae: 0.23512 | 0:02:41s\nepoch 402| loss: 0.00911 | val_mae: 0.23465 | 0:02:42s\nepoch 403| loss: 0.00875 | val_mae: 0.23515 | 0:02:42s\nepoch 404| loss: 0.00944 | val_mae: 0.23458 | 0:02:42s\nepoch 405| loss: 0.00802 | val_mae: 0.23431 | 0:02:43s\nepoch 406| loss: 0.00833 | val_mae: 0.23471 | 0:02:43s\nepoch 407| loss: 0.00936 | val_mae: 0.23471 | 0:02:44s\nepoch 408| loss: 0.0087 | val_mae: 0.23465 | 0:02:44s\nepoch 409| loss: 0.00872 | val_mae: 0.23507 | 0:02:44s\nepoch 410| loss: 0.0084 | val_mae: 0.23488 | 0:02:45s\nepoch 411| loss: 0.00864 | val_mae: 0.23439 | 0:02:45s\nepoch 412| loss: 0.00942 | val_mae: 0.23437 | 0:02:45s\nepoch 413| loss: 0.00984 | val_mae: 0.23468 | 0:02:46s\nepoch 414| loss: 0.00963 | val_mae: 0.23472 | 0:02:46s\nepoch 415| loss: 0.00934 | val_mae: 0.23458 | 0:02:47s\nepoch 416| loss: 0.00925 | val_mae: 0.23432 | 0:02:47s\nepoch 417| loss: 0.00852 | val_mae: 0.23441 | 0:02:47s\nepoch 418| loss: 0.0091 | val_mae: 0.23418 | 0:02:48s\nepoch 419| loss: 0.00903 | val_mae: 0.23436 | 0:02:48s\nepoch 420| loss: 0.0085 | val_mae: 0.23409 | 0:02:49s\nepoch 421| loss: 0.00919 | val_mae: 0.23434 | 0:02:49s\nepoch 422| loss: 0.00875 | val_mae: 0.23446 | 0:02:49s\nepoch 423| loss: 0.00932 | val_mae: 0.23462 | 0:02:50s\nepoch 424| loss: 0.00897 | val_mae: 0.2342 | 0:02:50s\nepoch 425| loss: 0.00854 | val_mae: 0.23425 | 0:02:51s\nepoch 426| loss: 0.01033 | val_mae: 0.23436 | 0:02:51s\nepoch 427| loss: 0.00844 | val_mae: 0.2338 | 0:02:51s\nepoch 428| loss: 0.00814 | val_mae: 0.23379 | 0:02:52s\nepoch 429| loss: 0.00809 | val_mae: 0.23376 | 0:02:52s\nepoch 430| loss: 0.00881 | val_mae: 0.23365 | 0:02:52s\nepoch 431| loss: 0.00885 | val_mae: 0.23397 | 0:02:53s\nepoch 432| loss: 0.00794 | val_mae: 0.23395 | 0:02:53s\nepoch 433| loss: 0.00778 | val_mae: 0.23377 | 0:02:54s\nepoch 434| loss: 0.00896 | val_mae: 0.234 | 0:02:54s\nepoch 435| loss: 0.00811 | val_mae: 0.23425 | 0:02:54s\nepoch 436| loss: 0.0079 | val_mae: 0.23397 | 0:02:55s\nepoch 437| loss: 0.00795 | val_mae: 0.23364 | 0:02:55s\nepoch 438| loss: 0.00846 | val_mae: 0.23377 | 0:02:56s\nepoch 439| loss: 0.00898 | val_mae: 0.234 | 0:02:56s\nepoch 440| loss: 0.00786 | val_mae: 0.2339 | 0:02:56s\nepoch 441| loss: 0.00735 | val_mae: 0.23309 | 0:02:57s\nepoch 442| loss: 0.00752 | val_mae: 0.23327 | 0:02:57s\nepoch 443| loss: 0.00893 | val_mae: 0.23388 | 0:02:58s\nepoch 444| loss: 0.00921 | val_mae: 0.23382 | 0:02:58s\nepoch 445| loss: 0.00812 | val_mae: 0.23365 | 0:02:58s\nepoch 446| loss: 0.00849 | val_mae: 0.23379 | 0:02:59s\nepoch 447| loss: 0.00887 | val_mae: 0.23409 | 0:02:59s\nepoch 448| loss: 0.0091 | val_mae: 0.23326 | 0:03:00s\nepoch 449| loss: 0.00874 | val_mae: 0.23316 | 0:03:00s\nepoch 450| loss: 0.00946 | val_mae: 0.23382 | 0:03:01s\nepoch 451| loss: 0.0082 | val_mae: 0.2339 | 0:03:01s\nepoch 452| loss: 0.00902 | val_mae: 0.23358 | 0:03:02s\nepoch 453| loss: 0.00853 | val_mae: 0.23354 | 0:03:02s\nepoch 454| loss: 0.00852 | val_mae: 0.23396 | 0:03:02s\nepoch 455| loss: 0.00875 | val_mae: 0.23354 | 0:03:03s\nepoch 456| loss: 0.00936 | val_mae: 0.23343 | 0:03:03s\nepoch 457| loss: 0.00868 | val_mae: 0.23341 | 0:03:03s\nepoch 458| loss: 0.00882 | val_mae: 0.23344 | 0:03:04s\nepoch 459| loss: 0.00808 | val_mae: 0.23381 | 0:03:04s\nepoch 460| loss: 0.00913 | val_mae: 0.23353 | 0:03:05s\nepoch 461| loss: 0.0086 | val_mae: 0.23383 | 0:03:05s\nepoch 462| loss: 0.00826 | val_mae: 0.23373 | 0:03:06s\nepoch 463| loss: 0.00825 | val_mae: 0.23371 | 0:03:06s\nepoch 464| loss: 0.00837 | val_mae: 0.23389 | 0:03:06s\nepoch 465| loss: 0.00761 | val_mae: 0.2334 | 0:03:07s\nepoch 466| loss: 0.00823 | val_mae: 0.23397 | 0:03:07s\nepoch 467| loss: 0.00866 | val_mae: 0.23413 | 0:03:08s\nepoch 468| loss: 0.00806 | val_mae: 0.23432 | 0:03:08s\nepoch 469| loss: 0.01046 | val_mae: 0.23399 | 0:03:08s\nepoch 470| loss: 0.00811 | val_mae: 0.23377 | 0:03:09s\nepoch 471| loss: 0.00784 | val_mae: 0.23394 | 0:03:09s\nepoch 472| loss: 0.00817 | val_mae: 0.23416 | 0:03:10s\nepoch 473| loss: 0.00964 | val_mae: 0.23382 | 0:03:10s\nepoch 474| loss: 0.00785 | val_mae: 0.23383 | 0:03:10s\nepoch 475| loss: 0.00887 | val_mae: 0.23364 | 0:03:11s\nepoch 476| loss: 0.00937 | val_mae: 0.23392 | 0:03:11s\nepoch 477| loss: 0.00838 | val_mae: 0.23379 | 0:03:12s\nepoch 478| loss: 0.0082 | val_mae: 0.23388 | 0:03:12s\nepoch 479| loss: 0.00876 | val_mae: 0.23384 | 0:03:13s\nepoch 480| loss: 0.00892 | val_mae: 0.23384 | 0:03:13s\nepoch 481| loss: 0.00805 | val_mae: 0.23389 | 0:03:13s\nepoch 482| loss: 0.00819 | val_mae: 0.23438 | 0:03:14s\nepoch 483| loss: 0.0081 | val_mae: 0.23367 | 0:03:14s\nepoch 484| loss: 0.00798 | val_mae: 0.23421 | 0:03:14s\nepoch 485| loss: 0.00833 | val_mae: 0.23362 | 0:03:15s\nepoch 486| loss: 0.00819 | val_mae: 0.23385 | 0:03:15s\nepoch 487| loss: 0.00973 | val_mae: 0.23377 | 0:03:16s\nepoch 488| loss: 0.00804 | val_mae: 0.23398 | 0:03:16s\nepoch 489| loss: 0.00817 | val_mae: 0.23406 | 0:03:16s\nepoch 490| loss: 0.00813 | val_mae: 0.23352 | 0:03:17s\nepoch 491| loss: 0.00815 | val_mae: 0.23351 | 0:03:17s\n\nEarly stopping occurred at epoch 491 with best_epoch = 441 and best_val_mae = 0.23309\n","output_type":"stream"},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/pytorch_tabnet/callbacks.py:172: UserWarning: Best weights from best epoch are automatically used!\n warnings.warn(wrn_msg)\n","output_type":"stream"}],"execution_count":29},{"cell_type":"code","source":"submit_df = pd.concat([test_id, test_df['sii']], axis=1)\nsubmit_df['sii'] = submit_df['sii'].astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:52:23.714054Z","iopub.execute_input":"2024-11-13T05:52:23.714382Z","iopub.status.idle":"2024-11-13T05:52:23.720325Z","shell.execute_reply.started":"2024-11-13T05:52:23.714349Z","shell.execute_reply":"2024-11-13T05:52:23.719273Z"}},"outputs":[],"execution_count":30},{"cell_type":"code","source":"submit_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:52:23.721517Z","iopub.execute_input":"2024-11-13T05:52:23.721836Z","iopub.status.idle":"2024-11-13T05:52:23.736980Z","shell.execute_reply.started":"2024-11-13T05:52:23.721797Z","shell.execute_reply":"2024-11-13T05:52:23.736124Z"}},"outputs":[{"execution_count":31,"output_type":"execute_result","data":{"text/plain":" id sii\n0 00008ff9 0\n1 000fd460 0\n2 00105258 0\n3 00115b9f 1\n4 0016bb22 0\n5 001f3379 1\n6 0038ba98 0\n7 0068a485 0\n8 0069fbed 0\n9 0083e397 0\n10 0087dd65 0\n11 00abe655 0\n12 00ae59c9 1\n13 00af6387 0\n14 00bd4359 0\n15 00c0cd71 0\n16 00d56d4b 0\n17 00d9913d 0\n18 00e6167c 0\n19 00ebc35d 0","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idsii
000008ff90
1000fd4600
2001052580
300115b9f1
40016bb220
5001f33791
60038ba980
70068a4850
80069fbed0
90083e3970
100087dd650
1100abe6550
1200ae59c91
1300af63870
1400bd43590
1500c0cd710
1600d56d4b0
1700d9913d0
1800e6167c0
1900ebc35d0
\n
"},"metadata":{}}],"execution_count":31},{"cell_type":"code","source":"submit_df.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T05:52:23.738164Z","iopub.execute_input":"2024-11-13T05:52:23.738495Z","iopub.status.idle":"2024-11-13T05:52:23.746544Z","shell.execute_reply.started":"2024-11-13T05:52:23.738461Z","shell.execute_reply":"2024-11-13T05:52:23.745722Z"}},"outputs":[],"execution_count":32},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]} \ No newline at end of file From 28a8d6d44d956dca73559e9579440d0db67b6d0e Mon Sep 17 00:00:00 2001 From: Billy152op <84769275+Billy152op@users.noreply.github.com> Date: Wed, 13 Nov 2024 15:59:20 +0800 Subject: [PATCH 3/3] Update DM_FinalProject.ipynb --- DM_FinalProject.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DM_FinalProject.ipynb b/DM_FinalProject.ipynb index 1629ff3..8b13789 100644 --- a/DM_FinalProject.ipynb +++ b/DM_FinalProject.ipynb @@ -1 +1 @@ -{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":7453542,"sourceType":"datasetVersion","datasetId":921302}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:21:31.777954Z","iopub.execute_input":"2024-11-13T02:21:31.778382Z","iopub.status.idle":"2024-11-13T02:22:03.498711Z","shell.execute_reply.started":"2024-11-13T02:21:31.778345Z","shell.execute_reply":"2024-11-13T02:22:03.497290Z"}},"outputs":[],"execution_count":49},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nfrom pytorch_tabnet.tab_model import TabNetClassifier, TabNetRegressor\nfrom pytorch_tabnet.callbacks import Callback\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom sklearn.preprocessing import StandardScaler","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.501829Z","iopub.execute_input":"2024-11-13T02:22:03.502726Z","iopub.status.idle":"2024-11-13T02:22:03.509700Z","shell.execute_reply.started":"2024-11-13T02:22:03.502688Z","shell.execute_reply":"2024-11-13T02:22:03.508849Z"}},"outputs":[],"execution_count":50},{"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-11-13T02:22:03.510903Z","iopub.execute_input":"2024-11-13T02:22:03.511158Z","iopub.status.idle":"2024-11-13T02:22:03.583895Z","shell.execute_reply.started":"2024-11-13T02:22:03.511129Z","shell.execute_reply":"2024-11-13T02:22:03.582950Z"}},"outputs":[],"execution_count":51},{"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-11-13T02:22:03.585273Z","iopub.execute_input":"2024-11-13T02:22:03.586795Z","iopub.status.idle":"2024-11-13T02:22:03.598238Z","shell.execute_reply.started":"2024-11-13T02:22:03.586760Z","shell.execute_reply":"2024-11-13T02:22:03.597344Z"}},"outputs":[],"execution_count":52},{"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-11-13T02:22:03.601120Z","iopub.execute_input":"2024-11-13T02:22:03.601575Z","iopub.status.idle":"2024-11-13T02:22:03.623005Z","shell.execute_reply.started":"2024-11-13T02:22:03.601533Z","shell.execute_reply":"2024-11-13T02:22:03.621956Z"}},"outputs":[],"execution_count":53},{"cell_type":"code","source":"df = train_df.dropna(axis=1, thresh=len(train_df) - 3000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.624384Z","iopub.execute_input":"2024-11-13T02:22:03.624731Z","iopub.status.idle":"2024-11-13T02:22:03.637543Z","shell.execute_reply.started":"2024-11-13T02:22:03.624698Z","shell.execute_reply":"2024-11-13T02:22:03.636644Z"}},"outputs":[],"execution_count":54},{"cell_type":"code","source":"def process_file(filename, dirname):\n df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n df.drop('step', axis=1, inplace=True)\n return df.describe().values.reshape(-1), filename.split('=')[1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.638742Z","iopub.execute_input":"2024-11-13T02:22:03.639033Z","iopub.status.idle":"2024-11-13T02:22:03.653571Z","shell.execute_reply.started":"2024-11-13T02:22:03.639000Z","shell.execute_reply":"2024-11-13T02:22:03.652709Z"}},"outputs":[],"execution_count":55},{"cell_type":"code","source":"def load_time_series(dirname) -> pd.DataFrame:\n ids = os.listdir(dirname)\n \n with ThreadPoolExecutor() as executor:\n results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n \n stats, indexes = zip(*results)\n \n df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))])\n df['id'] = indexes\n \n return df\n\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\n\ndef feature_engineering(df):\n season_cols = [col for col in df.columns if 'Season' in col]\n df = df.drop(season_cols, axis=1) \n df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age']\n df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n df['BMI_Internet_Hours'] = df['Physical-BMI'] * df['PreInt_EduHx-computerinternet_hoursday']\n df['BFP_BMI'] = df['BIA-BIA_Fat'] / df['BIA-BIA_BMI']\n df['FFMI_BFP'] = df['BIA-BIA_FFMI'] / df['BIA-BIA_Fat']\n df['FMI_BFP'] = df['BIA-BIA_FMI'] / df['BIA-BIA_Fat']\n df['LST_TBW'] = df['BIA-BIA_LST'] / df['BIA-BIA_TBW']\n df['BFP_BMR'] = df['BIA-BIA_Fat'] * df['BIA-BIA_BMR']\n df['BFP_DEE'] = df['BIA-BIA_Fat'] * df['BIA-BIA_DEE']\n df['BMR_Weight'] = df['BIA-BIA_BMR'] / df['Physical-Weight']\n df['DEE_Weight'] = df['BIA-BIA_DEE'] / df['Physical-Weight']\n df['SMM_Height'] = df['BIA-BIA_SMM'] / df['Physical-Height']\n df['Muscle_to_Fat'] = df['BIA-BIA_SMM'] / df['BIA-BIA_FMI']\n df['Hydration_Status'] = df['BIA-BIA_TBW'] / df['Physical-Weight']\n df['ICW_TBW'] = df['BIA-BIA_ICW'] / df['BIA-BIA_TBW']\n \n return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.654988Z","iopub.execute_input":"2024-11-13T02:22:03.655301Z","iopub.status.idle":"2024-11-13T02:22:03.670953Z","shell.execute_reply.started":"2024-11-13T02:22:03.655269Z","shell.execute_reply":"2024-11-13T02:22:03.670145Z"}},"outputs":[],"execution_count":56},{"cell_type":"code","source":"# 把SII是空的column刪除\ntrain_df = train_df.dropna(subset=['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:03.671812Z","iopub.execute_input":"2024-11-13T02:22:03.672082Z","iopub.status.idle":"2024-11-13T02:22:03.689356Z","shell.execute_reply.started":"2024-11-13T02:22:03.672052Z","shell.execute_reply":"2024-11-13T02:22:03.688536Z"}},"outputs":[],"execution_count":57},{"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-11-13T02:22:03.690459Z","iopub.execute_input":"2024-11-13T02:22:03.690754Z","iopub.status.idle":"2024-11-13T02:22:05.212628Z","shell.execute_reply.started":"2024-11-13T02:22:03.690714Z","shell.execute_reply":"2024-11-13T02:22:05.211733Z"}},"outputs":[],"execution_count":58},{"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-11-13T02:22:05.213705Z","iopub.execute_input":"2024-11-13T02:22:05.213980Z","iopub.status.idle":"2024-11-13T02:22:05.223670Z","shell.execute_reply.started":"2024-11-13T02:22:05.213950Z","shell.execute_reply":"2024-11-13T02:22:05.222698Z"}},"outputs":[],"execution_count":59},{"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 df[c] = df[c].fillna('Missing')\n df[c] = df[c].astype('category')\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-11-13T02:22:05.224804Z","iopub.execute_input":"2024-11-13T02:22:05.225082Z","iopub.status.idle":"2024-11-13T02:22:05.268967Z","shell.execute_reply.started":"2024-11-13T02:22:05.225050Z","shell.execute_reply":"2024-11-13T02:22:05.268264Z"}},"outputs":[],"execution_count":60},{"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-11-13T02:22:05.269975Z","iopub.execute_input":"2024-11-13T02:22:05.270259Z","iopub.status.idle":"2024-11-13T02:22:05.320255Z","shell.execute_reply.started":"2024-11-13T02:22:05.270221Z","shell.execute_reply":"2024-11-13T02:22:05.319329Z"}},"outputs":[],"execution_count":61},{"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-11-13T02:22:05.324201Z","iopub.execute_input":"2024-11-13T02:22:05.324603Z","iopub.status.idle":"2024-11-13T02:22:05.330044Z","shell.execute_reply.started":"2024-11-13T02:22:05.324568Z","shell.execute_reply":"2024-11-13T02:22:05.329145Z"}},"outputs":[],"execution_count":62},{"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-11-13T02:22:05.331055Z","iopub.execute_input":"2024-11-13T02:22:05.331355Z","iopub.status.idle":"2024-11-13T02:22:05.355510Z","shell.execute_reply.started":"2024-11-13T02:22:05.331310Z","shell.execute_reply":"2024-11-13T02:22:05.354710Z"}},"outputs":[{"name":"stdout","text":"Basic_Demos-Sex -0.094312\nPhysical-Diastolic_BP 0.066374\nPhysical-HeartRate -0.035771\nPAQ-PAQ_Total -0.042217\nFitness_Endurance-Max_Stage -0.020330\nFitness_Endurance-Time_Mins -0.038346\nFitness_Endurance-Time_Sec 0.001800\nFGC-FGC_SRL -0.073663\nFGC-FGC_SRR -0.064219\nBIA-BIA_Activity_Level_num 0.075633\nBIA-BIA_BMC -0.007859\nBIA-BIA_BMR 0.028779\nBIA-BIA_DEE 0.041886\nBIA-BIA_ECW 0.027491\nBIA-BIA_FFM 0.028779\nBIA-BIA_FFMI 0.085982\nBIA-BIA_FMI 0.066753\nBIA-BIA_Fat 0.031164\nBIA-BIA_ICW 0.041286\nBIA-BIA_LDM 0.019975\nBIA-BIA_LST 0.059496\nBIA-BIA_SMM 0.041344\nBIA-BIA_TBW 0.033559\nName: PCIAT-PCIAT_Total, dtype: float64\n","output_type":"stream"}],"execution_count":63},{"cell_type":"code","source":"plt.figure(figsize=(8, 6))\nfiltered_corr.sort_values().plot(kind='barh', color='coral')\nplt.title('Features with Correlation > 0.1 or < -0.1 with PCIAT-PCIAT_Total')\nplt.xlabel('Correlation coefficient')\nplt.ylabel('Features')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:05.356620Z","iopub.execute_input":"2024-11-13T02:22:05.356927Z","iopub.status.idle":"2024-11-13T02:22:05.731893Z","shell.execute_reply.started":"2024-11-13T02:22:05.356894Z","shell.execute_reply":"2024-11-13T02:22:05.730934Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAAA8AAAAIjCAYAAADMcXIDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADF5UlEQVR4nOzdeVxN+f8H8Ndtuy23XamUFhWVfSdLtqmYxtiyjso2jexrGUsl6zALhrFVlixjJoOEiBRmBkMYS9bEyCCUpFDn94df5+vqtqpJej0fj/N4uOd8zufzPqdzr/u+n8/5HIkgCAKIiIiIiIiIPnJKlR0AERERERER0X+BCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgUmwERERERERFQtMAEmIiIiIiKiaoEJMBER0XuSSCQIDAwscdkxY8ZUbEAfkOTkZEgkEoSHh5drvVZWVvD29i7XOokqWmmuWysrK3z66acVGxDR/wsPD4dEIkFycnJlh1LhmAATEX2k8v8zU7T4+/tXSJsnTpxAYGAgnj59WiH1VxUVfR4yMjIQFBSERo0aQSaTQUNDA/Xr18f06dNx7969CmmzMlSX62n9+vVwcHCAuro67OzssHz58hLtl5mZiTlz5sDNzQ0GBgYV8kPDh66qn7tLly4hMDCwQpKOtz/zlZSUYGZmhk8++QRxcXEFyubm5iIsLAwuLi4wMDCAVCqFlZUVfHx8cPr0abFc/v8rb69727Rp0yCRSNC/f/9CYylqURQbALi4uMiVMzAwQIsWLRAaGoq8vLwC5ePi4tC7d2+YmJhATU0NxsbG8PDwQGRkpFgm/8e5JUuWKGwzOjoaEokEZmZmcm28G0thS3E/iua3X5KluOsjKysLgYGBhZ4/kqdS2QEQEVHFCg4OhrW1tdy6+vXrV0hbJ06cQFBQELy9vaGnp1chbXyIXrx4ARWV//2XWpHn4ebNm+jatStSUlLQr18/jBo1Cmpqajh//jzWr1+PnTt34urVq+XaZmUp6jwmJSVBSanq/46/evVq+Pr6ok+fPpg0aRISEhIwbtw4ZGVlYfr06UXu++jRIwQHB6N27dpo1KhRtfvyWxXP3bvX7aVLlxAUFAQXFxdYWVmVe3vdunXD0KFDIQgCbt26hZUrV6Jz587Yu3cv3N3dAbz5/Orduzf279+PDh06YMaMGTAwMEBycjJ+/vlnbNiwASkpKTA3Ny+yLUEQsHXrVlhZWWHPnj149uwZtLW1AQCbNm2SK7tx40YcPHiwwHoHB4dC6zc3N8eCBQsAAA8fPsTGjRsxfPhwXL16FQsXLhTLzZkzB8HBwbCzs8OXX34JS0tLpKWlITo6Gn369EFERAQGDRpU7LmLiIiAlZUVkpOTcfjwYXTt2hUA8PXXX2PEiBFiuVOnTmHZsmWYMWOGXPwNGzYssn4jI6MCx7906VLcvXsX3333XYGyRcnKykJQUBCANwk6FUMgIqKPUlhYmABAOHXq1H/W5jfffCMAEG7dulWu9WZmZpZrfRWtqPMAQPDz8ytTva9evRIaNWokaGpqCgkJCQW2p6enCzNmzChT3e8q7Jzn5uYKL168KHE9t27dEgAIYWFhpY6hoq6n9/Hw4UPh3r175VJXVlaWYGhoKPTo0UNu/eDBgwUtLS3h8ePHRe6fnZ0tpKamCoIgCKdOnSrzeS6L8nhPPnjwoMznsiqfu7ft2LFDACAcOXKkwDZLS8sCx1caij5rzp8/LwAQPvnkE3Gdn5+fAED47rvvCtTx+vVr4ZtvvhHu3LkjCELR/68cPnxYACAcPnxYUFVVFcLDwwuNLb/NkurYsaPg5OQkt+758+eCubm5oKWlJbx8+VIQhP+dz759+4rr3rZ//35hz549giD877Ppm2++KVAuMzNT0NLSEpYtWyY0adJE8Pb2LjS2ov6GpdWjRw/B0tKy1Ps9fPhQACDMmTOnzG3n/20/pM/bilL1fzolIqL3sm/fPrRv3x5aWlrQ1tZGjx49cPHiRbky58+fh7e3N2xsbKCurg4TExMMGzYMaWlpYpnAwEBMnToVAGBtbS03dKuo+0DfHSoWGBgIiUSCS5cuYdCgQdDX10e7du3E7Zs3b0azZs2goaEBAwMDDBgwAHfu3JGr89q1a+jTpw9MTEygrq4Oc3NzDBgwAOnp6YWeh2XLlkFZWVluuO3SpUshkUgwadIkcV1ubi60tbXlepjePoaizsPbfvvtN9SvXx9SqRROTk7Yv39/obHl+/XXX3Hu3Dl8/fXXcuckn46ODubNmye3bseOHeL5qlGjBoYMGYJ//vlHroy3tzdkMhlu3LiB7t27Q1tbG4MHDxaPbcyYMYiIiICTkxOkUqkY6z///INhw4ahZs2a4nGEhoYWexzvez0Biu+lvHnzJvr16wcDAwNoamqidevW2Lt3r1yZuLg4SCQS/Pzzz5g3bx7Mzc2hrq6OLl264Pr168XG/vfff6N27dro2bMndu/ejdevXxe7T2GOHDmCtLQ0jB49Wm69n58fnj9/XiD2d0mlUpiYmJS5fQA4fPiw+P7X09NDz549cfnyZbkyxb0nSyMvLw/79+9Hv379YG5ujj///LNM9VTmudu9ezckEgnOnz8vrvv1118hkUjQu3dvubIODg5yw4Hfvm7Dw8PRr18/AECnTp0KHQZ87NgxtGzZEurq6rCxscHGjRvLFDcANGjQADVq1MCtW7cAAHfv3sXq1avRrVs3TJgwoUB5ZWVlTJkypdjeX+BNj6mjoyM6deqErl27IiIiosxxlkT+e/z58+d4+PAhAGDWrFkwMDBAaGgoVFVVC+zj6upaovuqd+7ciRcvXqBfv34YMGAAIiMjkZ2dXe7HUBIPHjzA8OHDUbNmTairq6NRo0bYsGGDuD05OVnsIQ4KCiowBLskn7fVDYdAExF95NLT0/Ho0SO5dTVq1ADwZlial5cXXF1dsWjRImRlZWHVqlVo164dzp49Kw7JO3jwIG7evAkfHx+YmJjg4sWLWLNmDS5evIg//vhD/OJ39epVbN26Fd99953YhpGRkfjlpDT69esHOzs7zJ8/H4IgAADmzZuHWbNmwdPTEyNGjMDDhw+xfPlydOjQAWfPnoWenh5evnwJV1dX5OTkYOzYsTAxMcE///yDqKgoPH36FLq6ugrba9++PfLy8nDs2DHxC1JCQgKUlJSQkJAgljt79iwyMzPRoUMHhfUUdR7yHTt2DJGRkRg9ejS0tbWxbNky9OnTBykpKTA0NCz0nOzevRsA8MUXX5ToHIaHh8PHxwctWrTAggUL8O+//+KHH37A8ePHxfOV7/Xr13B1dUW7du2wZMkSaGpqitsOHz6Mn3/+GWPGjEGNGjVgZWWFf//9F61btxYTZCMjI+zbtw/Dhw9HRkaGwi/T+d73elLk33//Rdu2bZGVlYVx48bB0NAQGzZswGeffYZffvkFvXr1kiu/cOFCKCkpYcqUKUhPT8fixYsxePDgYhOyxo0bY9asWQgPD0fPnj1hamoKLy8vDBs2DHZ2dsX8ReSdPXsWANC8eXO59c2aNYOSkhLOnj2LIUOGlKrO0jh06BDc3d1hY2ODwMBAvHjxAsuXL4ezszPOnDlTYEiuovdkSSUnJyM0NBTh4eG4c+cOLCwsMG3aNDg7O5cp9so8d+3atYNEIkF8fLw4zDX/s+LYsWNiuYcPH+LKlSuFTnrXoUMHjBs3rsDw2beH0V6/fh19+/bF8OHD4eXlhdDQUHh7e6NZs2ZwcnIqdexPnjzBkydPYGtrC+DND6CvX78u8WdKYXJycvDrr79i8uTJAICBAwfCx8cH9+/ff+8faYpy8+ZNKCsrQ09PD9euXcOVK1cwbNgwceh1WUVERKBTp04wMTHBgAED4O/vjz179og/WPxXXrx4ARcXF1y/fh1jxoyBtbU1duzYAW9vbzx9+hTjx4+HkZERVq1aha+++gq9evUSf4TJvzZL8nlb7VR2FzQREVWM/OFMihZBEIRnz54Jenp6wsiRI+X2u3//vqCrqyu3Pisrq0D9W7duFQAI8fHx4rrChqwWNQwW7wzbmjNnjgBAGDhwoFy55ORkQVlZWZg3b57c+gsXLggqKiri+rNnzwoAhB07dhR+chTIzc0VdHR0hGnTpgmCIAh5eXmCoaGh0K9fP0FZWVl49uyZIAiC8O233wpKSkrCkydPCj2G4oZAq6mpCdevXxfXnTt3TgAgLF++vMgYmzRpIujq6pboeF6+fCkYGxsL9evXlxuyHBUVJQAQZs+eLa7z8vISAAj+/v4K41VSUhIuXrwot3748OGCqamp8OjRI7n1AwYMEHR1dcVrRtHf/n2vJ0F4MzzUy8tLfD1hwgQBgNzQ8GfPngnW1taClZWVkJubKwiCIBw5ckQAIDg4OAg5OTli2R9++EEAIFy4cKFAW4rk5eUJhw8fFoYMGSJoaGgIAIQOHToIGzZsUHh8ivj5+QnKysoKtxkZGQkDBgwoUT2CULZhvI0bNxaMjY2FtLQ0cd25c+cEJSUlYejQoeK6wt6TxcnOzha2bt0qdO3aVZBIJIJUKhX69+8vHDhwQPx7lFVlnzsnJyfB09NTfN20aVOhX79+AgDh8uXLgiAIQmRkpABAOHfunFju3eu2uCHQ774nHjx4IEilUmHy5MnFxghAGD58uPDw4UPhwYMHwp9//il06dJFACAsXbpUEARBmDhxogBAOHv2bImOu7Ah0L/88osAQLh27ZogCIKQkZEhqKurKxxWLQhlGwJdr1494eHDh8LDhw+Fy5cvC+PGjRMACB4eHoIgCMKuXbsKHcqtSGFDoP/9919BRUVFWLt2rbiubdu2Qs+ePRXWU5FDoL///nsBgLB582Zx3cuXL4U2bdoIMplMyMjIEASh6CHQJf285RBoIiL6aPz44484ePCg3AK8+VX46dOnGDhwIB49eiQuysrKaNWqFY4cOSLWoaGhIf47Ozsbjx49QuvWrQEAZ86cqZC4fX195V5HRkYiLy8Pnp6ecvGamJjAzs5OjDe/h/fAgQPIysoqcXtKSkpo27Yt4uPjAQCXL19GWloa/P39IQgCfv/9dwBvenrq16//XpNbde3aFXXq1BFfN2zYEDo6Orh582aR+2VkZJS4Z+P06dN48OABRo8eDXV1dXF9jx49UK9ePYVDRL/66iuFdXXs2BGOjo7ia0EQ8Ouvv8LDwwOCIMj9PVxdXZGenl7kdVER11N0dDRatmwpNzRXJpNh1KhRSE5OxqVLl+TK+/j4QE1NTXzdvn17ACj2b5BPIpGgU6dO2LRpE+7fv4+ffvoJOTk58PLygqmpKb766is8efKkyDpevHghF8Pb1NXV8eLFixLFUhapqalITEyEt7c3DAwMxPUNGzZEt27dEB0dXWCfd9+ThXn+/DnGjx8PMzMzDBw4EE+ePMHy5cuRmpqKbdu24ZNPPnnvCcwq89wBb66X/JEhz549w7lz5zBq1CjUqFFDXJ+QkAA9Pb33mnTQ0dFRvDaBNyMg6tatW+LrdP369TAyMoKxsTFatWqF48ePY9KkSeIIjYyMDAAolx7T5s2biz3L+bfTlOcw6CtXrsDIyAhGRkZwcHDA8uXL0aNHD/G2i/I6lm3btkFJSQl9+vQR1w0cOBD79u0r9j1d3qKjo2FiYoKBAweK61RVVTFu3DhkZmbi6NGjxdZRGf9/f+g4BJqI6CPXsmXLAsMEgTf3yQJA586dFe6no6Mj/vvx48cICgrCtm3b8ODBA7lyRd1X+z7enbn62rVrEASh0GGm+fd7WVtbY9KkSfj2228RERGB9u3b47PPPsOQIUMKHf6cr3379uJQ0ISEBJiamqJp06Zo1KgREhIS0K1bNxw7dgyenp7vdWy1a9cusE5fX7/YL1clSZLz3b59GwBQt27dAtvq1asnN1QTAFRUVAq9z+/dv8XDhw/x9OlTrFmzBmvWrFG4z7vXydsq4nq6ffs2WrVqVWB9/nDS27dvyyUi7/4N9PX1AaBMX3B1dHTw5ZdfwsvLC/PmzcO8efPw008/4csvvxTrVURDQwMvX75UuC07O1vui2t5K+r6cHBwwIEDB/D8+XNoaWmJ69+9Dgrz8OFDLFu2DAAwZcoUBAUFyQ2pL42HDx8iNzdXfC2TycRHf1XWuQPefFb89NNPuH79Om7cuAGJRII2bdqIifHIkSORkJAAZ2fn90r2y/pZka9nz54YM2YMJBIJtLW14eTkJPc3zf+cf/bsWZljfPr0KaKjozFmzBi5++idnZ3x66+/4urVq7C3ty+2nszMTGRmZoqvlZWV5W55sLKywtq1ayGRSMTHXhkbG5frsQBv5plo2bIl0tLSxPtkmzRpgpcvX2LHjh0YNWrUe9VfGrdv34adnV2Ba+jtz7XiVMb/3x86JsBERNVU/nMNN23apPAerbcf6+Pp6YkTJ05g6tSpaNy4MWQyGfLy8uDm5qbwGYzvKuweo7e/2L7r3S+weXl5kEgk2LdvH5SVlQuUl8lk4r+XLl0Kb29v7Nq1CzExMRg3bhwWLFiAP/74o8jJXNq1a4dXr17h999/R0JCgtjzkv+l9sqVK3j48KFcj0xZKIofQLH3VdarVw9nz54V76EsT1KptNAv6or+FgAwZMgQeHl5KdynqEeAvO/1VB7K+jdQ5NSpUwgNDcW2bdvw9OlTtGrVCsOHDy/ykS4AYGpqitzcXDx48EDui/zLly+RlpYGMzOzUsdSkUqaVJqbmyM8PBzr16/HkiVLsHr1avTv3x8+Pj5o27Ztqdps0aKF3Jf8OXPmIDAwsNLPXf5Ig/j4eNy8eRNNmzaFlpYW2rdvj2XLliEzMxNnz54tMCldab3vdWpubi4+vkeRevXqAQAuXLiAxo0blzo+4M1Eezk5OVi6dCmWLl1aYHtERIT4iJ6iLFmyRK6cpaWl3OSBWlpaJT6Wsrp27RpOnToFAAp/bI2IiPhPE+Dy8CF83n5omAATEVVT+UNwjY2Ni/xS8eTJE8TGxiIoKAizZ88W1+f3IL+tsEQ3vxfs7RmWgZL9ev12vIIgwNraukS9CQ0aNECDBg0wc+ZMnDhxAs7Ozvjpp58QEhJS6D4tW7aEmpoaEhISkJCQIM5C3KFDB6xduxaxsbHi66JU1KQiHh4e2Lp1KzZv3oyAgIAiy1paWgJ489zRd3v5k5KSxO1lYWRkBG1tbeTm5hZ57ShSHteTIpaWlkhKSiqw/sqVK+L28vTgwQNs2rQJYWFhuHjxIgwNDeHt7Y3hw4eXeMhrfsJx+vRpdO/eXVx/+vRp5OXllTkhKYm3r493XblyBTVq1JDrKSwNFRUVeHl5wcvLC1evXsW6deuwceNGrFu3Dvb29vDx8cHQoUNLlKRGRETIDWe2sbEBULnnDnjTM1u7dm0kJCTg5s2b4o9iHTp0wKRJk7Bjxw7k5uZW2mdFSbm7u0NZWRmbN28u80RYERERqF+/PubMmVNg2+rVq7Fly5YSJcBDhw6Vu4WhtL349vb2qFu3Lnbt2oUffvhB7kfRkoqIiICqqio2bdpU4MeHY8eOYdmyZUhJSVHYM18RLC0tcf78eeTl5cn9QPnu51ph11FpPm+rE94DTERUTbm6ukJHRwfz58/Hq1evCmzPn7k5/0vAuz0O33//fYF98r8wv5vo6ujooEaNGuL9tflWrlxZ4nh79+4NZWVlBAUFFYhFEARxqFpGRkaBR9M0aNAASkpKyMnJKbINdXV1tGjRAlu3bkVKSopcD/CLFy+wbNky1KlTB6ampkXWU9h5eF99+/ZFgwYNMG/ePPGe5Lc9e/YMX3/9NYA3s+MaGxuL96bm27dvHy5fvowePXqUOQ5lZWX06dMHv/76K/7+++8C24ua9bs8ridFunfvjpMnT8qdl+fPn2PNmjWwsrKSu4f5fdy5cweff/45atWqhalTp8LU1BTbtm3DvXv38N1335Xqfs/OnTvDwMAAq1atklu/atUqaGpqyv2NHj16hCtXrpTqvvaimJqaonHjxtiwYYPc+f37778RExMjl1S+D3t7eyxevBh3795FZGQkbG1tMXPmTNSuXRvdu3cv9ou4s7MzunbtKi75CXBlnrt87du3x+HDh3Hy5Enxs6Jx48bQ1tbGwoULoaGhgWbNmhVZR0V9VpSUhYUFRo4ciZiYGCxfvrzA9ry8PCxduhR3795VuP+dO3cQHx8PT09P9O3bt8Di4+OD69evl+hxVzY2NnJ/67LMEB4UFIS0tDSMGDFC4SPKYmJiEBUVVej++bfN9O/fv8Cx5P8gunXr1lLHVVbdu3fH/fv3sX37dnHd69evsXz5cshkMnTs2BEAxFsM3r2OSvN5W52wB5iIqJrS0dHBqlWr8MUXX6Bp06YYMGAAjIyMkJKSgr1798LZ2RkrVqyAjo4OOnTogMWLF+PVq1eoVasWYmJixOdIvi3/y97XX3+NAQMGQFVVFR4eHtDS0sKIESOwcOFCjBgxAs2bN0d8fDyuXr1a4njr1KmDkJAQBAQEIDk5GZ9//jm0tbVx69Yt7Ny5E6NGjcKUKVNw+PBhjBkzBv369YO9vT1ev34t/pr/9qQmhWnfvj0WLlwIXV1dNGjQAMCbXvK6desiKSmpwLNnFSnqPLwPVVVVREZGomvXrujQoQM8PT3h7OwMVVVVXLx4EVu2bIG+vj7mzZsHVVVVLFq0CD4+PujYsSMGDhwoPgbJysoKEydOfK9YFi5ciCNHjqBVq1YYOXIkHB0d8fjxY5w5cwaHDh3C48ePFe5XXtfTu/z9/bF161a4u7tj3LhxMDAwwIYNG3Dr1i38+uuv7z3pUr4bN27gzJkzCAgIwLBhwwo8Kqg0NDQ0MHfuXPj5+aFfv35wdXVFQkICNm/ejHnz5slNTrVixQoEBQXhyJEjcHFxkVv/9OlT3Lt3DwCwZ88eMVkZO3Zskfe9f/PNN3B3d0ebNm0wfPhw8TFIurq6cs/mLg8qKiro1asXevXqhX/++QdhYWEIDQ3FxYsXS/34KKDyzx3w5rMiIiICEolE7LlUVlZG27ZtceDAAbi4uBQ6UVe+xo0bQ1lZGYsWLUJ6ejqkUik6d+4sN6y7oi1duhQ3btzAuHHjEBkZiU8//RT6+vpISUnBjh07cOXKFQwYMEDhvlu2bIEgCPjss88Ubu/evTtUVFQQERGh8B798ta/f39cuHAB8+bNw9mzZzFw4EBYWloiLS0N+/fvR2xsLLZs2aJw3z///FN83JAitWrVQtOmTRERESH3HPiKNGrUKKxevRre3t7466+/YGVlhV9++QXHjx/H999/L074paGhAUdHR2zfvh329vYwMDBA/fr1Ub9+/RJ/3lYrlTH1NBERVbzCHlfxriNHjgiurq6Crq6uoK6uLtSpU0fw9vYWTp8+LZa5e/eu0KtXL0FPT0/Q1dUV+vXrJ9y7d0/hYxfmzp0r1KpVS1BSUpJ7pEJWVpYwfPhwQVdXV9DW1hY8PT2FBw8eFPoYpIcPHyqM99dffxXatWsnaGlpCVpaWkK9evUEPz8/ISkpSRAEQbh586YwbNgwoU6dOoK6urpgYGAgdOrUSTh06FCJztvevXsFAIK7u7vc+hEjRggAhPXr1xfYpzTnAYDg5+dXoI53H49SlCdPngizZ88WGjRoIGhqagrq6upC/fr1hYCAACE1NVWu7Pbt24UmTZoIUqlUMDAwEAYPHizcvXtXroyXl5egpaWlsK3C4hWEN48L8fPzEywsLARVVVXBxMRE6NKli7BmzRqxjKLHIJXH9aTofN24cUPo27evoKenJ6irqwstW7YUoqKi5MrkPwbp3cdkFfWorrdlZWW99yN83rVmzRqhbt26gpqamlCnTh3hu+++E/Ly8uTK5L8v3n3USv6jchQtJXmcyaFDhwRnZ2dBQ0ND0NHRETw8PIRLly4pbLuw92RZ5eXlCc+fP3+vOirz3F28eFF8pNbbQkJCBADCrFmzCuyj6Lpdu3atYGNjIygrK8vFaWlpKfTo0aNAHR07dhQ6duxYbHxFvXff9fr1a2HdunVC+/btBV1dXUFVVVWwtLQUfHx85B6R9O7/Kw0aNBBq165dZN0uLi6CsbGx8OrVK3FdWR6D5OTkVOLysbGxQs+ePQVjY2NBRUVFMDIyEjw8PIRdu3aJZd59DNLYsWMFAMKNGzcKrTcwMLDAo60q8jFIgvDmc9bHx0eoUaOGoKamJjRo0EDh59SJEyeEZs2aCWpqanKfpSX9vK1Oj0GSCEIZZnsgIiIiIiIiqmJ4DzARERERERFVC7wHmIiIiIiIqBylp6fLzWCuiKJHEFLF4xBoIiIiIiKicuTt7Y0NGzYUWYZpWOVgAkxERERERFSOLl26JM4wXpjSPkedygcTYCIiIiIiIqoWOAkWERERERERVQucBIuIqAh5eXm4d+8etLW1IZFIKjscIiIiInqHIAh49uwZzMzMoKRUdB8vE2AioiLcu3cPFhYWlR0GERERERXjzp07MDc3L7IME2AioiJoa2sDePOBqqOjU8nREBEREdG7MjIyYGFhIX5vKwoTYCKiIuQPe9bR0WECTERERPQBK8ntapwEi4iIiIiIiKoFJsBERERERERULTABJiIiIiIiomqBCTARERERERFVC5wEi4ioJBYMAqSqlR0FERER0YcvcGdlR1Ao9gATERERERFRtcAEmIiIiIiIiKoFJsBElSA8PBx6enqVHQYRERERUbXCBJhIAW9vb0gkEnExNDSEm5sbzp8/Xy719+/fH1evXi2XulxcXMQ4pVIpatWqBQ8PD0RGRpZL/ZVp69atUFZWhp+fX2WHQkREREQfASbARIVwc3NDamoqUlNTERsbCxUVFXz66aflUreGhgaMjY3LpS4AGDlyJFJTU3Hjxg38+uuvcHR0xIABAzBq1Khya6MyrF+/HtOmTcPWrVuRnZ1d2eEQERERURXHBJioEFKpFCYmJjAxMUHjxo3h7++PO3fu4OHDhwCA6dOnw97eHpqamrCxscGsWbPw6tUrcf9z586hU6dO0NbWho6ODpo1a4bTp08DUDwEes+ePWjRogXU1dVRo0YN9OrVq8SxampqwsTEBObm5mjdujUWLVqE1atXY+3atTh06JBY7s6dO/D09ISenh4MDAzQs2dPJCcni9u9vb3x+eefY/78+ahZsyb09PQQHByM169fY+rUqTAwMIC5uTnCwsLk2r9w4QI6d+4MDQ0NGBoaYtSoUcjMzBS3x8XFoWXLltDS0oKenh6cnZ1x+/btIo/p1q1bOHHiBPz9/WFvb6+wR3vt2rWwsLCApqYmevXqhW+//bbAed21axeaNm0KdXV12NjYICgoCK9fvy7xuSUiIiKijwcTYKISyMzMxObNm2FrawtDQ0MAgLa2NsLDw3Hp0iX88MMPWLt2Lb777jtxn8GDB8Pc3BynTp3CX3/9BX9/f6iqKn6Mzt69e9GrVy90794dZ8+eRWxsLFq2bPleMXt5eUFfX19MHF+9egVXV1doa2sjISEBx48fh0wmg5ubG16+fCnud/jwYdy7dw/x8fH49ttvMWfOHHz66afQ19fHn3/+CV9fX3z55Ze4e/cuAOD58+dwdXWFvr4+Tp06hR07duDQoUMYM2YMAOD169f4/PPP0bFjR5w/fx6///47Ro0aBYlEUmT8YWFh6NGjB3R1dTFkyBCsX79ebvvx48fh6+uL8ePHIzExEd26dcO8efPkyiQkJGDo0KEYP348Ll26hNWrVyM8PLxAubfl5OQgIyNDbiEiIiKij4NEEAShsoMg+tB4e3tj8+bNUFdXB/AmyTM1NUVUVBSaNm2qcJ8lS5Zg27ZtYi+vjo4Oli9fDi8vrwJlw8PDMWHCBDx9+hQA0LZtW9jY2GDz5s2ljtXFxQWNGzfG999/X2Bb69atYWBggOjoaGzevBkhISG4fPmymHy+fPkSenp6+O233/DJJ5/A29sbcXFxuHnzJpSU3vw+Vq9ePRgbGyM+Ph4AkJubC11dXaxbtw4DBgzA2rVrMX36dNy5cwdaWloAgOjoaHh4eODevXtQVVWFoaEh4uLi0LFjxxIdU15eHqysrLB8+XL07NkTjx49Qq1atXDlyhVYW1sDAAYMGIDMzExERUWJ+w0ZMgRRUVHiee3atSu6dOmCgIAAsczmzZsxbdo03Lt3T2HbgYGBCAoKKrA+3b8HdPgcYCIiIqLi/cfPAc7IyICuri7S09Oho6NTZFn2ABMVolOnTkhMTERiYiJOnjwJV1dXuLu7i0N3t2/fDmdnZ5iYmEAmk2HmzJlISUkR9580aRJGjBiBrl27YuHChbhx40ahbSUmJqJLly7lfgyCIIjJ7rlz53D9+nVoa2tDJpNBJpPBwMAA2dnZcrE5OTmJyS8A1KxZEw0aNBBfKysrw9DQEA8ePAAAXL58GY0aNRKTXwBwdnZGXl4ekpKSYGBgAG9vb7i6usLDwwM//PADUlNTAQApKSliLDKZDPPnzwcAHDx4EM+fP0f37t0BADVq1EC3bt0QGhoqtpGUlFSgl/zd1+fOnUNwcLBcG/n3S2dlZSk8ZwEBAUhPTxeXO3fulPBsExEREdGHTqWyAyD6UGlpacHW1lZ8vW7dOujq6mLt2rXo0aMHBg8ejKCgILi6ukJXVxfbtm3D0qVLxfKBgYEYNGgQ9u7di3379mHOnDnYtm2bwnt7NTQ0yj3+3NxcXLt2DS1atADwZhh3s2bNEBERUaCskZGR+O93h2lLJBKF6/Ly8kocS1hYGMaNG4f9+/dj+/btmDlzJg4ePIjmzZsjMTFRLGdgYADgzeRXjx8/ljsveXl5OH/+PIKCguQS9KJkZmYiKCgIvXv3LrAtv3f/XVKpFFKptMTHRkRERERVBxNgohKSSCRQUlLCixcvcOLECVhaWuLrr78Wtyua1Mne3h729vaYOHEiBg4ciLCwMIUJcMOGDREbGwsfH59yi3fDhg148uQJ+vTpAwBo2rQptm/fDmNj42KHhpSGg4MDwsPD8fz5c7EX+Pjx41BSUkLdunXFck2aNEGTJk0QEBCANm3aYMuWLWjdurXcjwwAkJaWhl27dmHbtm1wcnIS1+fm5qJdu3aIiYmBm5sb6tati1OnTsnt++7rpk2bIikpqUAbRERERFQ9cQg0USFycnJw//593L9/H5cvX8bYsWORmZkJDw8P2NnZISUlBdu2bcONGzewbNky7Nz5v3sdXrx4gTFjxiAuLg63b9/G8ePHcerUKTg4OChsa86cOdi6dSvmzJmDy5cv48KFC1i0aFGJY83KysL9+/dx9+5d/PHHH5g+fTp8fX3x1VdfoVOnTgDeTMpVo0YN9OzZEwkJCbh16xbi4uIwbtw4cUKrshg8eDDU1dXh5eWFv//+G0eOHMHYsWPxxRdfoGbNmrh16xYCAgLw+++/4/bt24iJicG1a9cKPRebNm2CoaEhPD09Ub9+fXFp1KgRunfvLk6GNXbsWERHR+Pbb7/FtWvXsHr1auzbt09ucq3Zs2dj48aNCAoKwsWLF3H58mVs27YNM2fOLPPxEhEREVHVxQSYqBD79++HqakpTE1N0apVK3GGYxcXF3z22WeYOHEixowZg8aNG+PEiROYNWuWuK+ysjLS0tIwdOhQ2Nvbw9PTE+7u7gonVwLeTGS1Y8cO7N69G40bN0bnzp1x8uTJEse6du1amJqaok6dOujduzcuXbqE7du3Y+XKlWIZTU1NxMfHo3bt2ujduzccHBwwfPhwZGdnv1ePsKamJg4cOIDHjx+jRYsW6Nu3L7p06YIVK1aI269cuYI+ffrA3t4eo0aNgp+fH7788kuF9YWGhqJXr14KZ4nu06cPdu/ejUePHsHZ2Rk//fQTvv32WzRq1Aj79+/HxIkT5YY2u7q6IioqCjExMWjRogVat26N7777DpaWlmU+XiIiIiKqujgLNBF9NEaOHIkrV64gISGh3OoUZxXkLNBEREREJfMBzwLNe4CJqMpasmQJunXrBi0tLezbtw8bNmyQ6/UmIiIiInobE2CiD1hCQgLc3d0L3Z6ZmfkfRvPhOXnyJBYvXoxnz57BxsYGy5Ytw4gRIyqmsYAtQDlOHkZERERE/z0mwEQfsHcfE0Tyfv7558oOgYiIiIiqECbARB8wDQ0NPsKHiIiIiKiccBZoIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgUmwERERERERFQtMAEmIiIiIiKiaoEJMBEREREREVULTICJiIiIiIioWmACTERERERERNUCE2AiIiIiIiKqFpgAExERERERUbXABJiIiIiIiIiqBSbAREREREREVC2oVHYARERVwoJBgFS1sqMgIiIi+rAE7qzsCEqFPcBERERERERULTABJiIiIiIiomqBCTDRfyw8PBx6enoVVn9cXBwkEgmePn1aLvUlJydDIpEgMTGxXOorTmBgIBo3blyqfVxcXDBhwoQKiYeIiIiIPh5MgIkqgLe3NyQSCSQSCdTU1GBra4vg4GC8fv26wttu27YtUlNToaurW+Ft5Ssq6bayssL3339f4rqmTJmC2NjY8gvu/0kkEvz222/lXi8RERERVR2cBIuogri5uSEsLAw5OTmIjo6Gn58fVFVVYWpqWqHtqqmpwcTEpELbqEgymQwymayywyAiIiKijxB7gIkqiFQqhYmJCSwtLfHVV1+ha9eu2L17t7j9wIEDcHBwgEwmg5ubG1JTUwEA8fHxUFVVxf379+XqmzBhAtq3bw8AuH37Njw8PKCvrw8tLS04OTkhOjoagOLe2OPHj8PFxQWamprQ19eHq6srnjx5AgDYv38/2rVrBz09PRgaGuLTTz/FjRs3Kuy8PH36FCNGjICRkRF0dHTQuXNnnDt3Ttz+7hDo169fY9y4cWJ806dPh5eXFz7//HO5evPy8jBt2jQYGBjAxMQEgYGB4jYrKysAQK9evSCRSMTXRERERFS9MAEm+o9oaGjg5cuXAICsrCwsWbIEmzZtQnx8PFJSUjBlyhQAQIcOHWBjY4NNmzaJ+7569QoREREYNmwYAMDPzw85OTmIj4/HhQsXsGjRokJ7TRMTE9GlSxc4Ojri999/x7Fjx+Dh4YHc3FwAwPPnzzFp0iScPn0asbGxUFJSQq9evZCXl1ch56Ffv3548OAB9u3bh7/++gtNmzZFly5d8PjxY4XlFy1ahIiICISFheH48ePIyMhQOJR5w4YN0NLSwp9//onFixcjODgYBw8eBACcOnUKABAWFobU1FTxtSI5OTnIyMiQW4iIiIjo48Ah0EQVTBAExMbG4sCBAxg7diyANwntTz/9hDp16gAAxowZg+DgYHGf4cOHIywsDFOnTgUA7NmzB9nZ2fD09AQApKSkoE+fPmjQoAEAwMbGptD2Fy9ejObNm2PlypXiOicnJ/Hfffr0kSsfGhoKIyMjXLp0CfXr1y/VsZqbmxdYl5WVJf772LFjOHnyJB48eACpVAoAWLJkCX777Tf88ssvGDVqVIH9ly9fjoCAAPTq1QsAsGLFCrG3+20NGzbEnDlzAAB2dnZYsWIFYmNj0a1bNxgZGQEA9PT0ih0evmDBAgQFBZXwiImIiIioKmEPMFEFiYqKgkwmg7q6Otzd3dG/f39xWK6mpqaY/AKAqakpHjx4IL729vbG9evX8ccffwB4M3O0p6cntLS0AADjxo1DSEgInJ2dMWfOHJw/f77QOPJ7gAtz7do1DBw4EDY2NtDR0RGHB6ekpCgs7+TkJN6n6+7uLrctISEBiYmJcouZmZm4/dy5c8jMzIShoaFYh0wmw61btxQOu05PT8e///6Lli1biuuUlZXRrFmzAmUbNmwo9/rdc1pSAQEBSE9PF5c7d+6Uug4iIiIi+jCxB5iognTq1AmrVq2CmpoazMzMoKLyv7ebqqqqXFmJRAJBEMTXxsbG8PDwQFhYGKytrbFv3z7ExcWJ20eMGAFXV1fs3bsXMTExWLBgAZYuXSr2ML9NQ0OjyDg9PDxgaWmJtWvXwszMDHl5eahfv744XPtd0dHRePXqlcK6ra2tCzzi6e3jzszMhKmpqdyx5HvfR0MpOqdlGcYtlUrF3mkiIiIi+riwB5iogmhpacHW1ha1a9eWSwJLasSIEdi+fTvWrFmDOnXqwNnZWW67hYUFfH19ERkZicmTJ2Pt2rUK62nYsGGhjxVKS0tDUlISZs6ciS5dusDBwUGcHKswlpaWsLW1ha2tLWrVqlWqY2ratCnu378PFRUVsY78pUaNGgXK6+rqombNmnL37Obm5uLMmTOlahd4kyDn3/dMRERERNUTE2CiD5Srqyt0dHQQEhICHx8fuW0TJkzAgQMHcOvWLZw5cwZHjhyBg4ODwnoCAgJw6tQpjB49GufPn8eVK1ewatUqPHr0CPr6+jA0NMSaNWtw/fp1HD58GJMmTaqwY+ratSvatGmDzz//HDExMUhOTsaJEyfw9ddf4/Tp0wr3GTt2LBYsWIBdu3YhKSkJ48ePx5MnTyCRSErVtpWVFWJjY3H//v1ik3wiIiIi+jgxASb6QCkpKcHb2xu5ubkYOnSo3Lbc3Fz4+fnBwcEBbm5usLe3l5vk6m329vaIiYnBuXPn0LJlS7Rp0wa7du2CiooKlJSUsG3bNvz111+oX78+Jk6ciG+++abCjkkikSA6OhodOnSAj48P7O3tMWDAANy+fRs1a9ZUuM/06dMxcOBADB06FG3atIFMJoOrqyvU1dVL1fbSpUtx8OBBWFhYoEmTJuVxOERERERUxUiEt288JKIPyvDhw/Hw4UO55wdXd3l5eXBwcICnpyfmzp1b4e1lZGRAV1cX6f49oCNVLX4HIiIiouokcGdlR/C/72vp6dDR0SmyLCfBIvoApaen48KFC9iyZUu1T35v376NmJgYdOzYETk5OVixYgVu3bqFQYMGVXZoRERERFTFMAEm+gD17NkTJ0+ehK+vL7p161bZ4VQqJSUlhIeHY8qUKRAEAfXr18ehQ4cKvee5wgRsAYr5RZGIiIiIPmwcAk1EVITSDKkhIiIiov9eab6vcRIsIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgUmwERERERERFQtMAEmIiIiIiKiaoEJMBEREREREVULTICJiIiIiIioWmACTERERERERNUCE2AiIiIiIiKqFpgAExERERERUbXABJiIiIiIiIiqBSbAREREREREVC0wASYiIiIiIqJqQaWyAyAiqhIWDAKkqpUdBREREVUlgTsrOwJ6B3uAiYiIiIiIqFpgAkxERERERETVAhPg/5C3tzc+//zzyg6DFAgMDETjxo0rO4z/XFW7Jl1cXDBhwoTKDoOIiIiIqqhKTYC9vb0hkUggkUigpqYGW1tbBAcH4/Xr12WusyyJjJWVFb7//vsSl4+LixPjfne5f/9+6QIuY2zVNWHLl/83ePr0abnUN2XKFMTGxpZqn9JeNxUtOTkZEokEiYmJlR0KEREREdEHqdInwXJzc0NYWBhycnIQHR0NPz8/qKqqIiAgQK7cy5cvoaamVklRKpaUlAQdHR25dcbGxpUUDZWFIAjIzc2FTCaDTCarlBg+xGu7olXHYyYiIiKiylfpQ6ClUilMTExgaWmJr776Cl27dsXu3bvFoZnz5s2DmZkZ6tatCwC4c+cOPD09oaenBwMDA/Ts2RPJycmF1p9fz5IlS2BqagpDQ0P4+fnh1atXAN4Mqbx9+zYmTpwo9uKWlLGxMUxMTOQWJaU3pzQ3NxeTJk2Cnp4eDA0NMW3aNAiCILe/oh7Exo0bIzAwsMQxAEB2djacnJwwatQocd2NGzegra2N0NDQIvfds2cPWrRoAXV1ddSoUQO9evUStz158gRDhw6Fvr4+NDU14e7ujmvXronbw8PDoaenh6ioKNStWxeampro27cvsrKysGHDBlhZWUFfXx/jxo1Dbm6u3HHPnTsXAwcOhJaWFmrVqoUff/xR3K6oJ/Pp06eQSCSIi4tDcnIyOnXqBADQ19eHRCKBt7c3ACAvLw8LFiyAtbU1NDQ00KhRI/zyyy9iPfk9x/v27UOzZs0glUpx7NixAj3q73PdHDt2DO3bt4eGhgYsLCwwbtw4PH/+vMDxDx06FDo6Ohg1apR4Lg8cOAAHBwfIZDK4ubkhNTVV7u+1bt06ODg4QF1dHfXq1cPKlSvFbdbW1gCAJk2aQCKRwMXFpci//dsKO06g+OtA0WiE77//HlZWVgXO57vv55UrV8LOzg7q6uqoWbMm+vbtK+7z/PlzDB06FDKZDKampli6dGmBuDdt2oTmzZtDW1sbJiYmGDRoEB48eADgzY8btra2WLJkidw+iYmJkEgkuH79eonPDxERERF9HCo9AX6XhoYGXr58CQCIjY1FUlISDh48iKioKLx69Qqurq7Q1tZGQkICjh8/LiYK+fsocuTIEdy4cQNHjhzBhg0bEB4ejvDwcABAZGQkzM3NERwcjNTU1AIJR1ktXboU4eHhCA0NxbFjx/D48WPs3Fkx06Crq6sjIiICGzZswK5du5Cbm4shQ4agW7duGDZsWKH77d27F7169UL37t1x9uxZxMbGomXLluJ2b29vnD59Grt378bvv/8OQRDQvXt3ueQoKysLy5Ytw7Zt27B//37ExcWhV69eiI6ORnR0NDZt2oTVq1fLJaEA8M0336BRo0Y4e/Ys/P39MX78eBw8eLBEx2thYYFff/0VwJte+NTUVPzwww8AgAULFmDjxo346aefcPHiRUycOBFDhgzB0aNH5erw9/fHwoULcfnyZTRs2FBhO2W5bm7cuAE3Nzf06dMH58+fx/bt23Hs2DGMGTNGru4lS5aIxz9r1izxXC5ZsgSbNm1CfHw8UlJSMGXKFHGfiIgIzJ49G/PmzcPly5cxf/58zJo1Cxs2bAAAnDx5EgBw6NAhpKamIjIyskTns6jjBEp2HZTEu+/n06dPY9y4cQgODkZSUhL279+PDh06iOWnTp2Ko0ePYteuXYiJiUFcXBzOnDkjV+erV68wd+5cnDt3Dr/99huSk5PFH0MkEgmGDRuGsLAwuX3CwsLQoUMH2NraKowzJycHGRkZcgsRERERfRwqfQh0PkEQEBsbiwMHDmDs2LF4+PAhtLS0sG7dOnGo5ObNm5GXl4d169aJPW5hYWHQ09NDXFwcPvnkE4V16+vrY8WKFVBWVka9evXQo0cPxMbGYuTIkTAwMICysrLYg1Qa5ubmcq8tLS1x8eJFAG96wAICAtC7d28AwE8//YQDBw6Uqv5806dPx8yZM+XWvXz5Eo6OjuLrxo0bIyQkBCNGjMCAAQNw+/ZtREVFFVnvvHnzMGDAAAQFBYnrGjVqBAC4du0adu/ejePHj6Nt27YA3iRgFhYW+O2339CvXz8AbxKQVatWoU6dOgCAvn37YtOmTfj3338hk8ng6OiITp064ciRI+jfv7/YjrOzM/z9/QEA9vb2OH78OL777jt069at2POhrKwMAwMDAG964fX09AC8SVzmz5+PQ4cOoU2bNgAAGxsbHDt2DKtXr0bHjh3FOoKDg4ttqyzXzYIFCzB48GBxoiY7OzssW7YMHTt2xKpVq6Curg4A6Ny5MyZPnizul5CQgFevXuGnn34Sz+WYMWMQHBwslpkzZw6WLl0qXlPW1ta4dOkSVq9eDS8vLxgZGQEADA0NS3UtF3WcJb0OSuLd93NkZCS0tLTw6aefQltbG5aWlmjSpAkAIDMzE+vXr8fmzZvRpUsXAMCGDRsKvOfe/oHHxsYGy5YtQ4sWLZCZmQmZTAZvb2/Mnj0bJ0+eRMuWLfHq1Sts2bKlQK/w2xYsWCD3niAiIiKij0el9wBHRUVBJpNBXV0d7u7u6N+/vzgEuEGDBnL3CZ47dw7Xr1+Htra2eM+mgYEBsrOzcePGjULbcHJygrKysvja1NRUHCb5PhISEpCYmCgu0dHRAID09HSkpqaiVatWYlkVFRU0b968TO1MnTpVrp3ExET4+voWKDd58mTY29tjxYoVCA0NhaGhobgt/3zJZDJx38TERDG5eNfly5ehoqIidwyGhoaoW7cuLl++LK7T1NQUEzYAqFmzJqysrOTup61Zs2aB852foL79+u16y+L69evIyspCt27d5I5348aNBa6PkvwtynLdnDt3DuHh4XLtu7q6Ii8vD7du3Sqy/XfP5dvtPX/+HDdu3MDw4cPl6g4JCSny2i+Joo6zpNdBSbz7fu7WrRssLS1hY2ODL774AhEREcjKygLwpif95cuXcu0aGBiIQ6fz/fXXX/Dw8EDt2rWhra0t/siRkpICADAzM0OPHj3EWwH27NmDnJycIhP3gIAApKeni8udO3dKdZxERERE9OGq9B7gTp06YdWqVVBTU4OZmRlUVP4XkpaWllzZzMxMNGvWDBEREQXqye/9UkRVVVXutUQiQV5e3ntG/qYHLr/3sSyUlJQK3BesaFhpjRo1CgzXzO8BfduDBw9w9epVKCsr49q1a3BzcxO3vX0/bf7EXRoaGmWOPZ+ic/u+5zv/Puq3z01JhttmZmYCeDO0u1atWnLbpFKp3Ot3ry1FynIcmZmZ+PLLLzFu3LgC22rXrl1k+4rayz8H+ce2du1auaQQgFzyWhbl8fcqyXX87jFra2vjzJkziIuLQ0xMDGbPno3AwECcOnWqRO0+f/4crq6ucHV1RUREBIyMjJCSkgJXV1e5WyJGjBiBL774At999x3CwsLQv39/aGpqFlqvVCotcL0QERER0ceh0hNgLS2tQu/Fe1fTpk2xfft2GBsbF5h9+X2oqanJTdL0vnR1dWFqaoo///xTvKfx9evX+Ouvv9C0aVOxnJGRkdw9xxkZGXK9hKU1bNgwNGjQAMOHD8fIkSPRtWtXODg4AIDCc9ywYUPExsbCx8enwDYHBwe8fv0af/75pzj0NS0tDUlJSXJDr8vqjz/+KPA6P9b8HzNSU1PFIbHvPtonvyfx7b+bo6MjpFIpUlJS5IY7VxRF103Tpk1x6dKlEl/TJVWzZk2YmZnh5s2bGDx4cKHxACjXa7kk14GRkRHu378PQRDEWxNK+igmFRUVdO3aFV27dsWcOXOgp6eHw4cP45NPPoGqqir+/PNP8YeDJ0+e4OrVq+Lf9sqVK0hLS8PChQthYWEBADh9+nSBNrp37w4tLS2sWrUK+/fvR3x8/HudEyIiIiKquio9AS6NwYMH45tvvkHPnj0RHBwMc3Nz3L59G5GRkZg2bVqB+wNLysrKCvHx8RgwYACkUilq1KhRov0ePHiA7OxsuXWGhoZQVVXF+PHjsXDhQtjZ2aFevXr49ttvCzyztnPnzggPD4eHhwf09PQwe/bsMvfm/fjjj/j9999x/vx5WFhYYO/evRg8eDD++OOPQh83M2fOHHTp0gV16tTBgAED8Pr1a0RHR2P69Omws7NDz549MXLkSKxevRra2trw9/dHrVq10LNnzzLF+Lbjx49j8eLF+Pzzz3Hw4EHs2LEDe/fuBfCmZ7p169ZYuHAhrK2t8eDBgwL3QFtaWkIikSAqKgrdu3eHhoYGtLW1MWXKFEycOBF5eXlo164d0tPTcfz4cejo6MDLy+u9436boutm+vTpaN26NcaMGYMRI0ZAS0sLly5dwsGDB7FixYr3ai8oKAjjxo2Drq4u3NzckJOTg9OnT+PJkyeYNGkSjI2NoaGhgf3798Pc3Bzq6urQ1dV9rzZLch24uLjg4cOHWLx4Mfr27Yv9+/dj3759xf5IFRUVhZs3b6JDhw7Q19dHdHQ08vLyULduXchkMgwfPhxTp06FoaEhjI2N8fXXX4ujA4A3PepqampYvnw5fH198ffff2Pu3LkF2lFWVoa3tzcCAgJgZ2dXYPg9EREREVUflX4PcGloamoiPj4etWvXRu/eveHg4IDhw4cjOzv7vXqEg4ODkZycjDp16hQ5lPpddevWhampqdzy119/AXhzP+4XX3wBLy8vtGnTBtra2nKPGALe3GvYsWNHfPrpp+jRowc+//xzuXtAS+rKlSuYOnUqVq5cKfaErVy5Eo8ePRJnGFbExcUFO3bswO7du9G4cWN07txZnEkYeDPBWLNmzfDpp5+iTZs2EAQB0dHRBYbMlsXkyZNx+vRpNGnSBCEhIfj222/h6uoqbg8NDcXr16/RrFkzTJgwASEhIXL716pVC0FBQfD390fNmjXFWZbnzp2LWbNmYcGCBXBwcICbmxv27t0rPiKoPCm6bho2bIijR4/i6tWraN++PZo0aYLZs2fDzMzsvdsbMWIE1q1bh7CwMDRo0AAdO3ZEeHi4eGwqKipYtmwZVq9eDTMzs3L5oQIo/jpwcHDAypUr8eOPP6JRo0Y4efKk3OzVhdHT00NkZCQ6d+4MBwcH/PTTT9i6dSucnJwAvJkpvH379vDw8EDXrl3Rrl07NGvWTNzfyMgI4eHh2LFjBxwdHbFw4cJCJ7caPnw4Xr58qXC0AxERERFVHxLh3Zv3iCqYlZUVJkyYIM6UTFTREhIS0KVLF9y5cwc1a9Ys1b4ZGRnQ1dVFun8P6Ejf/8cfIiIiqkYCK+YxqCRP/L6Wnl5sx2iVGgJNRFQaOTk5ePjwIQIDA9GvX79SJ79yArYA5Tj3ABERERH996rUEOj/iru7u9yjZt5e5s+fX9nhEZVYYdexTCZDQkJCZYdX4bZu3QpLS0s8ffoUixcvruxwiIiIiKiScQi0Av/88w9evHihcJuBgYHCRxARfYiuX79e6LZatWqVy6OwPnalGVJDRERERP89DoF+T+8+Q5aoqirvxzEREREREVVlHAJNRERERERE1QITYCIiIiIiIqoWmAATERERERFRtcAEmIiIiIiIiKoFJsBERERERERULTABJiIiIiIiomqBCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgWVyg6AiKhKWDAIkKpWdhRERERUmMCdlR0BVQHsASYiIiIiIqJqgQkwERERERERVQtMgIn+I+Hh4dDT06uw+uPi4iCRSPD06dNyqS85ORkSiQSJiYnlUl9JleU8eXt74/PPP6+QeIiIiIjo48EEmKgceXt7QyKRQCKRQE1NDba2tggODsbr168rvO22bdsiNTUVurq6Fd4WAPj7+6NevXpy665cuQKJRAJvb2+59eHh4ZBKpXjx4kWx9fbv3x9Xr14tz1ABAFZWVvj+++/LvV4iIiIiqjo4CRZROXNzc0NYWBhycnIQHR0NPz8/qKqqwtTUtELbVVNTg4mJSYW28bZOnTph0aJFuH//vtjukSNHYGFhgbi4OLmyR44cQevWraGhoVFsvRoaGiUqR0RERERUWuwBJipnUqkUJiYmsLS0xFdffYWuXbti9+7d4vYDBw7AwcEBMpkMbm5uSE1NBQDEx8dDVVUV9+/fl6tvwoQJaN++PQDg9u3b8PDwgL6+PrS0tODk5ITo6GgAiodAHz9+HC4uLtDU1IS+vj5cXV3x5MkTAMD+/fvRrl076OnpwdDQEJ9++ilu3LhR4uNs164dVFVV5ZLduLg4+Pn54fHjx0hOTpZb36lTJwBATk4OpkyZglq1akFLSwutWrWSq0PREOiQkBAYGxtDW1sbI0aMgL+/Pxo3blwgpiVLlsDU1BSGhobw8/PDq1evAAAuLi64ffs2Jk6cKPbQExEREVH1wwSYqIJpaGjg5cuXAICsrCwsWbIEmzZtQnx8PFJSUjBlyhQAQIcOHWBjY4NNmzaJ+7569QoREREYNmwYAMDPzw85OTmIj4/HhQsXsGjRIshkMoXtJiYmokuXLnB0dMTvv/+OY8eOwcPDA7m5uQCA58+fY9KkSTh9+jRiY2OhpKSEXr16IS8vr0THpaWlhRYtWuDIkSPiuri4OHTp0gXOzs7i+ps3byIlJUVMgMeMGYPff/8d27Ztw/nz59GvXz+4ubnh2rVrCtuJiIjAvHnzsGjRIvz111+oXbs2Vq1aVaDckSNHcOPGDRw5cgQbNmxAeHg4wsPDAQCRkZEwNzdHcHAwUlNTxR8dFMnJyUFGRobcQkREREQfBw6BJqoggiAgNjYWBw4cwNixYwG8SWh/+ukn1KlTB8CbZDA4OFjcZ/jw4QgLC8PUqVMBAHv27EF2djY8PT0BACkpKejTpw8aNGgAALCxsSm0/cWLF6N58+ZYuXKluM7JyUn8d58+feTKh4aGwsjICJcuXUL9+vVLdIydOnXCjh07AACXLl1CdnY2mjRpgg4dOiAuLg4+Pj6Ii4uDuro6WrdujZSUFISFhSElJQVmZmYAgClTpmD//v0ICwvD/PnzC7SxfPlyDB8+HD4+PgCA2bNnIyYmBpmZmXLl9PX1sWLFCigrK6NevXro0aMHYmNjMXLkSBgYGEBZWRna2trFDhNfsGABgoKCSnT8RERERFS1sAeYqJxFRUVBJpNBXV0d7u7u6N+/PwIDAwEAmpqaYvILAKampnjw4IH42tvbG9evX8cff/wB4M1wYE9PT2hpaQEAxo0bh5CQEDg7O2POnDk4f/58oXHk9wAX5tq1axg4cCBsbGygo6MDKysrAG+SbEWcnJwgk8kgk8ng7u4O4M3Q4qtXryI1NRVxcXFo164dlJWV0bFjR3FYc1xcHNq2bQupVIoLFy4gNzcX9vb2Yl0ymQxHjx4tdPh1UlISWrZsKbfu3df58SkrK4uv3z23JRUQEID09HRxuXPnTqnrICIiIqIPE3uAicpZp06dsGrVKqipqcHMzAwqKv97m6mqqsqVlUgkEARBfG1sbAwPDw+EhYXB2toa+/btk7s/dsSIEXB1dcXevXsRExODBQsWYOnSpWIP89uKm0jKw8MDlpaWWLt2LczMzJCXl4f69euLw7XfFR0dLd5Tm1+3s7Mz1NTUcOTIERw5cgQdO3YEALRo0QKPHj3CzZs3ERcXhy+//BIAkJmZCWVlZfz1119yySqAQodyl5Sic1vS4dxvk0qlkEql7xULEREREX2Y2ANMVM60tLRga2uL2rVryyW/JTVixAhs374da9asQZ06deDs7Cy33cLCAr6+voiMjMTkyZOxdu1ahfU0bNgQsbGxCrelpaUhKSkJM2fORJcuXeDg4CBOjlUYS0tL2NrawtbWFrVq1QLwJhHOn8Tq6NGjcHFxAfAmGW3dujXWr1+PO3fuiPf/NmnSBLm5uXjw4IFYV/5S2NDkunXr4tSpU3Lr3n1dEmpqauL9z0RERERUPTEBJvrAuLq6QkdHByEhIeJ9r/kmTJiAAwcO4NatWzhz5gyOHDkCBwcHhfUEBATg1KlTGD16NM6fP48rV65g1apVePToEfT19WFoaIg1a9bg+vXrOHz4MCZNmlSmeDt16oRt27YhOzsbTZs2Fdd37NgRy5cvFyfLAgB7e3sMHjwYQ4cORWRkJG7duoWTJ09iwYIF2Lt3r8L6x44di/Xr12PDhg24du0aQkJCcP78+VLP5GxlZYX4+Hj8888/ePToUZmOlYiIiIiqNibARB8YJSUleHt7Izc3F0OHDpXblpubCz8/Pzg4OMDNzQ329vZyk1y9zd7eHjExMTh37hxatmyJNm3aYNeuXVBRUYGSkhK2bduGv/76C/Xr18fEiRPxzTfflCneTp064dmzZ3B2dpbr8e7YsSOePXsmPi4pX1hYGIYOHYrJkyejbt26+Pzzz3Hq1CnUrl1bYf2DBw9GQEAApkyZgqZNm+LWrVvw9vaGurp6qeIMDg5GcnIy6tSpAyMjozIdKxERERFVbRLh7RsQieiDMHz4cDx8+FDu+cH0P926dYOJiYncI6MqSkZGBnR1dZHu3wM6UtXidyAiIqLKEbizsiOgSiJ+X0tPh46OTpFlOQkW0QckPT0dFy5cwJYtW5j8/r+srCz89NNPcHV1hbKyMrZu3YpDhw7h4MGD/20gAVuAYj5QiYiIiOjDxgSY6APSs2dPnDx5Er6+vujWrVtlh/NBkEgkiI6Oxrx585CdnY26devi119/RdeuXSs7NCIiIiKqYjgEmoioCKUZUkNERERE/73SfF/jJFhERERERERULTABJiIiIiIiomqBCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgUmwERERERERFQtMAEmIiIiIiKiaoEJMBEREREREVULTICJiIiIiIioWmACTERERERERNWCSmUHQERUJSwYBEhVKzsKIqKqKXBnZUdARASAPcBERERERERUTTABJiIiIiIiomqBCTARERERERFVC0yAiT5w3t7ekEgkBZbr168DAO7fv4/x48fD1tYW6urqqFmzJpydnbFq1SpkZWXJ1XX27Fn069cPNWvWhLq6Ouzs7DBy5EhcvXq10Pbj4uIUtj9z5kyxjCAIWLt2Ldq0aQMdHR3IZDI4OTlh/PjxYpz5MjIy8PXXX6NevXpQV1eHiYkJunbtisjISAiCUKJzcv36dfj4+MDc3BxSqRTW1tYYOHAgTp8+DQBITk6GRCJBYmJigX1dXFwwYcKEErVDRERERB8XToJFVAW4ubkhLCxMbp2RkRFu3rwJZ2dn6OnpYf78+WjQoAGkUikuXLiANWvWoFatWvjss88AAFFRUejTpw9cXV0RERGBOnXq4MGDB9ixYwdmzZqF7du3FxlDUlISdHR0xNcymQzAm+R30KBB+O233zBjxgx89913MDMzw71797Bz506EhIQgPDwcAPD06VO0a9cO6enpCAkJQYsWLaCiooKjR49i2rRp6Ny5M/T09IqM4/Tp0+jSpQvq16+P1atXo169enj27Bl27dqFyZMn4+jRo6U8u0RERERUXTABJqoCpFIpTExMCqwfPXo0VFRUcPr0aWhpaYnrbWxs0LNnT7FHNSsrCz4+PujevTt27vzfTJzW1tZo1aoVnj59WmwMxsbGCpPT7du3Y9u2bdi1a5eYbANA7dq10bp1a7le3RkzZiA5ORlXr16FmZmZuN7e3h4DBw6Eurp6kTEIggBvb2/Y2dkhISEBSkr/G8TSuHFjjB8/vtjjKE5OTg5ycnLE1xkZGe9dJxERERF9GDgEmqiKSktLQ0xMDPz8/OSS37dJJBIAwIEDB/Do0SNMmzZNYbniel2LsnXrVtStW1cu+VUUQ15eHrZt24bBgwfLJb/5ZDIZVFSK/k0uMTERFy9exOTJk+WS33zvcxz5FixYAF1dXXGxsLB47zqJiIiI6MPABJioCoiKioJMJhOXfv364fr16xAEAXXr1pUrW6NGDbHc9OnTAQDXrl0DANSrV6/MMZibm8vFkJaWBgC4evVqgRgmTJggljM3NwcAPHr0CE+ePHmvGMrjOIoTEBCA9PR0cblz506FtUVERERE/y0OgSaqAjp16oRVq1aJr7W0tJCSkqKw7MmTJ5GXl4fBgweLQ3lLOrmUk5MTbt++DQBo37499u3bJ25LSEiAtra2+FpfX7/Qer7++muMGTMGkZGRmD9/fqliKEp51FEcqVQKqVRa4e0QERER0X+PCTBRFaClpQVbW1u5dWpqapBIJEhKSpJbb2NjAwDQ0NAQ19nb2wMArly5gjZt2hTaTnR0NF69elVgf+DN/cKKhhjb2dkViMHIyAhGRkYwNjaWW6enp4crV64U2n5x3j6OJk2aFFouf7Ku9PT0AtuePn0KXV3dMsdARERERFUXh0ATVVGGhobo1q0bVqxYgefPnxdZ9pNPPkGNGjWwePFihdvzJ8GytLSEra0tbG1tUatWrRLFMXDgQCQlJWHXrl1FllNSUsKAAQMQERGBe/fuFdiemZmJ169fF1lH48aN4ejoiKVLlyIvL6/Q4zAwMECNGjXw119/yW3PyMjA9evXxUSaiIiIiKoXJsBEVdjKlSvx+vVrNG/eHNu3b8fly5eRlJSEzZs348qVK1BWVgbwpgd53bp12Lt3Lz777DMcOnQIycnJOH36NKZNmwZfX98yxzBgwAD07dsXAwYMQHBwMP78808kJyfj6NGj2L59uxgDAMybNw8WFhZo1aoVNm7ciEuXLuHatWsIDQ1FkyZNkJmZWWRbEokEYWFhuHr1Ktq3b4/o6GjcvHkT58+fx7x589CzZ0+x7KRJkzB//nxERETgxo0bOHnyJAYPHgwjIyP07t27zMdLRERERFUXh0ATVWF16tTB2bNnMX/+fAQEBODu3buQSqVwdHTElClTMHr0aLFsz549ceLECSxYsACDBg1CRkYGLCws0LlzZ4SEhJQ5BolEgu3bt2Pt2rUICwvD4sWL8erVK5ibm6NLly749ttvxbIGBgb4448/sHDhQoSEhOD27dvQ19dHgwYN8M0335RoaHLLli1x+vRpzJs3DyNHjsSjR49gamqKtm3b4vvvvxfLTZs2DTKZDIsWLcKNGzdgYGAAZ2dnHDlypMDwbiIiIiKqHiTCfzGrDBFRFZWRkQFdXV2k+/eAjlS1ssMhIqqaAncWX4aIqIzE72vp6eJcMIVhDzARUUkEbAGK+UAlIiIiog8b7wEmog9GQkKC3LOG312IiIiIiN4He4CJ6IPRvHlzJCYmVnYYRERERPSRYgJMRB8MDQ2NAs87JiIiIiIqLxwCTURERERERNUCE2AiIiIiIiKqFpgAExERERERUbXABJiIiIiIiIiqBSbAREREREREVC0wASYiIiIiIqJqgQkwERERERERVQtMgImIiIiIiKhaYAJMRERERERE1QITYCIiIiIiIqoWmAATERERERFRtaBS2QEQEVUJCwYBUtXKjoKI6MMWuLOyIyAiKhJ7gImIiIiIiKhaYAJMRERERERE1QITYKKPQHh4OPT09Cqs/ri4OEgkEjx9+rRc6ktOToZEIkFiYmK51EdEREREVBJMgImqCG9vb0gkEkgkEqipqcHW1hbBwcF4/fp1hbfdtm1bpKamQldXt8Lbyufi4iIer0QiQc2aNdGvXz/cvn1bLJOfSCsrK+Off/6R2z81NRUqKiqQSCRITk6WK8/Em4iIiKh6YgJMVIW4ubkhNTUV165dw+TJkxEYGIhvvvmmwttVU1ODiYkJJBJJhbf1tpEjRyI1NRX37t3Drl27cOfOHQwZMqRAuVq1amHjxo1y6zZs2IBatWr9V6ESERERURXABJioCpFKpTAxMYGlpSW++uordO3aFbt37xa3HzhwAA4ODpDJZGKyDADx8fFQVVXF/fv35eqbMGEC2rdvDwC4ffs2PDw8oK+vDy0tLTg5OSE6OhqA4iHQx48fh4uLCzQ1NaGvrw9XV1c8efIEALB//360a9cOenp6MDQ0xKeffoobN26U+ng1NTVhYmICU1NTtG7dGmPGjMGZM2cKlPPy8kJYWJjcurCwMHh5eZW6TSIiIiL6eDEBJqrCNDQ08PLlSwBAVlYWlixZgk2bNiE+Ph4pKSmYMmUKAKBDhw6wsbHBpk2bxH1fvXqFiIgIDBs2DADg5+eHnJwcxMfH48KFC1i0aBFkMpnCdhMTE9GlSxc4Ojri999/x7Fjx+Dh4YHc3FwAwPPnzzFp0iScPn0asbGxUFJSQq9evZCXl1fmY338+DF+/vlntGrVqsC2zz77DE+ePMGxY8cAAMeOHcOTJ0/g4eFR6nZycnKQkZEhtxARERHRx4HPASaqggRBQGxsLA4cOICxY8cCeJPQ/vTTT6hTpw4AYMyYMQgODhb3GT58OMLCwjB16lQAwJ49e5CdnQ1PT08AQEpKCvr06YMGDRoAAGxsbAptf/HixWjevDlWrlwprnNychL/3adPH7nyoaGhMDIywqVLl1C/fv0SH+fKlSuxbt06CIKArKws2Nvb48CBAwXKqaqqYsiQIQgNDUW7du0QGhqKIUOGQFW19M/tXbBgAYKCgkq9HxERERF9+NgDTFSFREVFQSaTQV1dHe7u7ujfvz8CAwMBvBkunJ/8AoCpqSkePHggvvb29sb169fxxx9/AHgzc7Snpye0tLQAAOPGjUNISAicnZ0xZ84cnD9/vtA48nuAC3Pt2jUMHDgQNjY20NHRgZWVFYA3SbYiTk5OkMlkkMlkcHd3F9cPHjwYiYmJOHfuHI4dOwZbW1t88sknePbsWYE6hg0bhh07duD+/fvYsWOH2LNdWgEBAUhPTxeXO3fulKkeIiIiIvrwsAeYqArp1KkTVq1aBTU1NZiZmUFF5X9v4Xd7OyUSCQRBEF8bGxvDw8MDYWFhsLa2xr59+xAXFyduHzFiBFxdXbF3717ExMRgwYIFWLp0qdjD/DYNDY0i4/Tw8IClpSXWrl0LMzMz5OXloX79+uJw7XdFR0fj1atXBerW1dWFra0tAMDW1hbr16+Hqakptm/fjhEjRsjV0aBBA9SrVw8DBw6Eg4MD6tevX6bZnqVSKaRSaan3IyIiIqIPH3uAiaoQLS0t2Nraonbt2nLJb0mNGDEC27dvx5o1a1CnTh04OzvLbbewsICvry8iIyMxefJkrF27VmE9DRs2RGxsrMJtaWlpSEpKwsyZM9GlSxc4ODiIk2MVxtLSEra2trC1tS1y5mZlZWUAwIsXLxRuHzZsGOLi4src+0tEREREHzf2ABNVI66urtDR0UFISIjc/cHAmxmh3d3dYW9vjydPnuDIkSNwcHBQWE9AQAAaNGiA0aNHw9fXF2pqajhy5Aj69esHAwMDGBoaYs2aNTA1NUVKSgr8/f3LFG9WVpY4c/W///6LuXPnQl1dHZ988onC8iNHjkS/fv2gp6dXpvaIiIiI6OPGHmCiakRJSQne3t7Izc3F0KFD5bbl5ubCz88PDg4OcHNzg729vdwkV2+zt7dHTEwMzp07h5YtW6JNmzbYtWsXVFRUoKSkhG3btuGvv/5C/fr1MXHixDI/q3jt2rUwNTWFqakpOnXqhEePHiE6Ohp169ZVWF5FRQU1atQoU+84EREREX38JMLbNwkS0Udv+PDhePjwodzzg6lwGRkZ0NXVRbp/D+hISz+rNBFRtRK4s7IjIKJqSPy+lp4OHR2dIsuym4SomkhPT8eFCxewZcsWJr9EREREVC0xASaqJnr27ImTJ0/C19cX3bp1q+xwqp6ALUAxvygSERER0YeNCTBRNfH2I4+IiIiIiKojToJFRERERERE1QITYCIiIiIiIqoWmAATERERERFRtcAEmIiIiIiIiKoFJsBERERERERULTABJiIiIiIiomqBCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhaYABMREREREVG1wASYiIiIiIiIqgUmwERERERERFQtqFR2AEREVcKCQYBUtbKjICL6sATurOwIiIhKhT3AREREREREVC0wASYiIiIiIqJqgQkwEVU53t7e+Pzzzys7DCIiIiKqYpgAE5XBw4cP8dVXX6F27dqQSqUwMTGBq6srjh8/DgCwsrKCRCKBRCKBhoYGrKys4OnpicOHDxeoa+fOnWjdujV0dXWhra0NJycnTJgwocj2s7KyEBAQgDp16kBdXR1GRkbo2LEjdu3aJZZxcXERY5BKpahVqxY8PDwQGRlZoL6jR4+ic+fOMDAwgKamJuzs7ODl5YWXL18WGYe3t7fYhqLFysqqyP1dXFyKPdb3UVRsEokEgYGBFdY2EREREX14mAATlUGfPn1w9uxZbNiwAVevXsXu3bvh4uKCtLQ0sUxwcDBSU1ORlJSEjRs3Qk9PD127dsW8efPEMrGxsejfvz/69OmDkydP4q+//sK8efPw6tWrItv39fVFZGQkli9fjitXrmD//v3o27evXPsAMHLkSKSmpuLGjRv49ddf4ejoiAEDBmDUqFFimUuXLsHNzQ3NmzdHfHw8Lly4gOXLl0NNTQ25ublFxvHDDz8gNTVVXAAgLCxMfH3q1KkSn9OK8HZs33//PXR0dOTWTZkypVLjIyIiIqL/FmeBJiqlp0+fIiEhAXFxcejYsSMAwNLSEi1btpQrp62tDRMTEwBA7dq10aFDB5iammL27Nno27cv6tatiz179sDZ2RlTp04V97O3ty92eO/u3bvxww8/oHv37gDe9Dg3a9asQDlNTU0xBnNzc7Ru3Rr16tXDsGHD4Onpia5duyImJgYmJiZYvHixuF+dOnXg5uZW7LnQ1dWFrq6u3Do9PT2xzaNHj2Lq1Kk4d+4cDAwM4OXlhZCQEKioqMDb2xtHjx7F0aNH8cMPPwAAbt26BQsLC4waNQqHDx/G/fv3Ubt2bYwePRrjx48vNp535ceRH6tEIpFbR0RERETVC3uAiUpJJpNBJpPht99+Q05OTqn2HT9+PARBEIcqm5iY4OLFi/j7779LVY+JiQmio6Px7NmzUu0HAF5eXtDX1xeHQpuYmCA1NRXx8fGlrqso//zzD7p3744WLVrg3LlzWLVqFdavX4+QkBAAb3qP27RpI/ZSp6amwsLCAnl5eTA3N8eOHTtw6dIlzJ49GzNmzMDPP/9crvEVJicnBxkZGXILEREREX0cmAATlZKKigrCw8OxYcMG6OnpwdnZGTNmzMD58+eL3dfAwADGxsZITk4GAIwdOxYtWrRAgwYNYGVlhQEDBiA0NLTYxHrNmjU4ceIEDA0N0aJFC0ycOFG8/7g4SkpKsLe3F2Po168fBg4ciI4dO8LU1BS9evXCihUr3jvxW7lyJSwsLLBixQrUq1cPn3/+OYKCgrB06VLk5eVBV1cXampqYi+1iYkJlJWVoaqqiqCgIDRv3hzW1tYYPHgwfHx8/rMEeMGCBWLPtq6uLiwsLP6TdomIiIio4jEBJiqDPn364N69e9i9ezfc3NwQFxeHpk2bIjw8vNh9BUGARCIBAGhpaWHv3r24fv06Zs6cCZlMhsmTJ6Nly5bIyspCSkqK2OMsk8kwf/58AECHDh1w8+ZNxMbGom/fvrh48SLat2+PuXPnlij+t2NQVlZGWFgY7t69i8WLF6NWrVqYP38+nJycxPt6y+Ly5cto06aN2A4AODs7IzMzE3fv3i1y3x9//BHNmjWDkZERZDIZ1qxZg5SUlDLHUhoBAQFIT08Xlzt37vwn7RIRERFRxWMCTFRG6urq6NatG2bNmoUTJ07A29sbc+bMKXKftLQ0PHz4ENbW1nLr69SpgxEjRmDdunU4c+YMLl26hO3bt8PMzAyJiYni4uvrK+6jqqqK9u3bY/r06YiJiUFwcDDmzp1b7MzNubm5uHbtWoEYatWqhS+++AIrVqzAxYsXkZ2djZ9++qmUZ+X9bdu2DVOmTMHw4cMRExODxMRE+Pj4FHtc5UUqlUJHR0duISIiIqKPAyfBIionjo6O+O2334os88MPP0BJSanISa6srKygqamJ58+fQ0VFBba2tiVu//Xr18jOzoaamlqh5TZs2IAnT56gT58+hZbR19eHqakpnj9/XqK2FXFwcMCvv/4q19t8/PhxaGtrw9zcHAAUzjR9/PhxtG3bFqNHjxbX3bhxo8xxEBERERHlK7cE+OnTp9DT0yuv6og+WGlpaejXrx+GDRuGhg0bQltbG6dPn8bixYvRs2dPsdyzZ89w//59vHr1Crdu3cLmzZuxbt06LFiwQExqAwMDkZWVhe7du8PS0hJPnz7FsmXL8OrVK3Tr1q3QGFxcXDBw4EA0b94choaGuHTpEmbMmIFOnTrJ9VhmZWXh/v37eP36Ne7evYudO3fiu+++w1dffYVOnToBAFavXo3ExET06tULderUQXZ2NjZu3IiLFy9i+fLlZT5Po0ePxvfff4+xY8dizJgxSEpKwpw5czBp0iQoKb0ZfGJlZYU///wTycnJkMlkMDAwgJ2dHTZu3IgDBw7A2toamzZtwqlTpwr0WBMRERERlVaZhkAvWrQI27dvF197enrC0NAQtWrVwrlz58otOKIPkUwmQ6tWrfDdd9+hQ4cOqF+/PmbNmoWRI0dixYoVYrnZs2fD1NQUtra2+OKLL5Ceno7Y2FhMnz5dLNOxY0fcvHkTQ4cORb169eDu7o779+8jJiYGdevWLTQGV1dXbNiwAZ988gkcHBwwduxYuLq6Fpgoau3atTA1NUWdOnXQu3dvcWj1ypUrxTItW7ZEZmYmfH194eTkhI4dO+KPP/7Ab7/9Jj7mqSxq1aqF6OhonDx5Eo0aNYKvry+GDx+OmTNnimWmTJkCZWVlODo6wsjICCkpKfjyyy/Ru3dv9O/fH61atUJaWppcbzARERERUVlJBEEQSruTtbU1IiIi0LZtWxw8eBCenp7Yvn07fv75Z6SkpCAmJqYiYiUi+s9lZGRAV1cX6f49oCNVrexwiIg+LIE7KzsCIqL/fV9LTy92/pYyDYG+f/+++GiQqKgoeHp64pNPPoGVlRVatWpVliqJiIiIiIiIKlSZEmB9fX3cuXMHFhYW2L9/P0JCQgC8ebTKuxPaEFHV5u7ujoSEBIXbZsyYgRkzZvzHEf1PSkoKHB0dC91+6dIl1K5du3waC9gCcEZoIiIioiqtTAlw7969MWjQINjZ2SEtLQ3u7u4AgLNnz5Z4xloiqhrWrVuHFy9eKNxmYGDwH0cjL/8xUUVtJyIiIiLKV6YE+LvvvoOVlRXu3LmDxYsXQyaTAQBSU1M5WQ3RR6ZWrVqVHUKhSvOYKCIiIiKiMk2CRURUXZRmUgUiIiIi+u+V5vtamR6DBACbNm1Cu3btYGZmhtu3bwMAvv/+e+zatausVRIRERERERFVmDIlwKtWrcKkSZPg7u6Op0+fihNf6enp4fvvvy/P+IiIiIiIiIjKRZkS4OXLl2Pt2rX4+uuvoaysLK5v3rw5Lly4UG7BEREREREREZWXMiXAt27dQpMmTQqsl0qleP78+XsHRURERERERFTeypQAW1tbK3z0yP79++Hg4PC+MRERERERERGVuzI9BmnSpEnw8/NDdnY2BEHAyZMnsXXrVixYsADr1q0r7xiJiIiIiIiI3luZEuARI0ZAQ0MDM2fORFZWFgYNGgQzMzP88MMPGDBgQHnHSERERERERPTeSp0Av379Glu2bIGrqysGDx6MrKwsZGZmwtjYuCLiIyIiIiIiIioXpb4HWEVFBb6+vsjOzgYAaGpqMvklIiIiIiKiD16ZJsFq2bIlzp49W96xEBEREREREVWYMt0DPHr0aEyePBl3795Fs2bNoKWlJbe9YcOG5RIcERERERERUXmRCIIglHYnJaWCHccSiQSCIEAikSA3N7dcgiMiqmwZGRnQ1dVFun8P6EhVKzscIvoYBO6s7AiIiD4q4ve19HTo6OgUWbZMPcC3bt0qU2BERERERERElaVMCbClpWV5x0FERERERERUocqUAG/cuLHI7UOHDi1TMEREREREREQVpUyzQI8fP15uGT16NLy9vTFq1ChMmDChnEMkIkW8vb0hkUjExdDQEG5ubjh//rxYRiKR4Lfffiuw75dffgllZWXs2LGj2HbCw8Pl2pHJZGjWrBkiIyPlyrm4uCh8/2/duhXKysrw8/Mr1fHFxcXJtauhoQEnJyesWbNGrlz+efD19S1Qh5+fHyQSCby9veXKf/7556WKhYiIiIg+DmVKgJ88eSK3ZGZmIikpCe3atcPWrVvLO0YiKoSbmxtSU1ORmpqK2NhYqKio4NNPPy1yn6ysLGzbtg3Tpk1DaGhoidrR0dER2zl79ixcXV3h6emJpKSkYvddv349pk2bhq1bt4rPDy+NpKQkpKam4tKlS/jyyy/x1VdfITY2Vq6MhYUFtm3bhhcvXojrsrOzsWXLFtSuXbvUbRIRERHRx6lMCbAidnZ2WLhwIcaPH19eVRJRMaRSKUxMTGBiYoLGjRvD398fd+7cwcOHDwvdZ8eOHXB0dIS/vz/i4+Nx586dYtuRSCRiO3Z2dggJCYGSkpJcb7Mit27dwokTJ+Dv7w97e/sCvcYlYWxsDBMTE1hbW2PcuHGwtrbGmTNn5Mo0bdoUFhYWcvVHRkaidu3aaNKkSanbJCIiIqKPU7klwACgoqKCe/fulWeVRFRCmZmZ2Lx5M2xtbWFoaFhoufXr12PIkCHQ1dWFu7s7wsPDS9VObm4uNmzYAOBN4lmUsLAw9OjRA7q6uhgyZAjWr19fqrbeJggC9u/fj5SUFLRq1arA9mHDhiEsLEx8HRoaCh8fn1K3k5OTg4yMDLmFiIiIiD4OZZoEa/fu3XKvBUFAamoqVqxYAWdn53IJjIiKFxUVBZlMBgB4/vw5TE1NERUVpfBZ3QBw7do1/PHHH2JP6ZAhQzBp0iTMnDkTEomk0HbS09PFdl68eAFVVVWsWbMGderUKXSfvLw8hIeHY/ny5QCAAQMGYPLkybh16xasra1LfIzm5uYA3iSmeXl5CA4ORocOHQqUGzJkCAICAnD79m0AwPHjx7Ft2zbExcWVuC0AWLBgAYKCgkq1DxERERFVDWVKgN+dQEYikcDIyAidO3fG0qVLyyMuIiqBTp06YdWqVQDe3Ju/cuVKuLu74+TJkwofVxYaGgpXV1fUqFEDANC9e3cMHz4chw8fRpcuXTB//nzMnz9fLH/p0iUAgLa2tjjsOCsrC4cOHYKvry8MDQ3h4eGhMLaDBw/i+fPn6N69OwCgRo0a6NatG0JDQzF37twSH2NCQgK0tbWRk5ODkydPYsyYMTAwMMBXX30lV87IyAg9evRAeHg4BEFAjx49xOMsjYCAAEyaNEl8nZGRAQsLi1LXQ0REREQfnjIlwHl5eeUdBxGVgZaWFmxtbcXX69atg66uLtauXYuQkBC5svlDl+/fvw8VFRW59aGhoejSpQt8fX3h6ekpbjMzMwMAKCkpybXTsGFDxMTEYNGiRYUmwOvXr8fjx4+hoaEhrsvLy8P58+cRFBRUaC/1u6ytraGnpwcAcHJywp9//ol58+YVSICBN8Ogx4wZAwD48ccfS1T/u6RSKaRSaZn2JSIiIqIPW5kS4ODgYEyZMgWamppy61+8eIFvvvkGs2fPLpfgiKh0JBIJlJSU5GZDzhcdHY1nz57h7NmzUFZWFtf//fff8PHxwdOnT2FgYAADA4MStaWsrKywHQBIS0vDrl27sG3bNjg5OYnrc3Nz0a5dO8TExMDNza2UR1d8u25ubnj58iUkEglcXV3LVD8RERERfbzKlAAHBQXB19e3QAKclZWFoKAgJsBE/5GcnBzcv38fwJsh0CtWrEBmZqbCXtn169ejR48eaNSokdx6R0dHTJw4EREREYU+q1cQBLGdFy9e4ODBgzhw4ECh7/VNmzbB0NAQnp6eBe4t7t69O9avX1/iBPjBgwfIzs4Wh0Bv2rQJffv2VVhWWVkZly9fFv9NRERERPS2MiXAgiAonDDn3LlzJe49IqL3t3//fpiamgJ4c59uvXr1sGPHDri4uMiV+/fff7F3715s2bKlQB1KSkro1asX1q9fX2gCnJGRIbYjlUphaWmJ4OBgTJ8+XWH50NBQ9OrVS+HnRJ8+ffDFF1/g0aNHJbpHt27dugDezDJvYWGBL7/8EoGBgYWW19HRKbZOIiIiIqqeJIIgCCUtrK+vD4lEgvT0dOjo6Mh9uc3NzUVmZiZ8fX3LfO8dEdGHJiMjA7q6ukj37wEdqWplh0NEH4PAnZUdARHRR0X8vvb/eWpRStUD/P3330MQBAwbNgxBQUHQ1dUVt6mpqcHKygpt2rQpW9RERB+ygC0Ae5eJiIiIqrRSJcBeXl4A3szK2rZtW6iqsjeEiMrG3d0dCQkJCrfNmDEDM2bM+I8jIiIiIqKPXamGQCuSnZ2Nly9fyq3jPXhEVJx//vmn0NmcSzMbdUUrzZAaIiIiIvrvVdgQ6HxZWVmYNm0afv75Z6SlpRXYnpubW5ZqiagaqVWrVmWHQERERETVjFJZdpo6dSoOHz6MVatWQSqVYt26dQgKCoKZmRk2btxY3jESERERERERvbcy9QDv2bMHGzduhIuLC3x8fNC+fXvY2trC0tISERERGDx4cHnHSURERERERPReytQD/PjxY9jY2AB4c7/v48ePAQDt2rVDfHx8+UVHREREREREVE7KlADb2Njg1q1bAIB69erh559/BvCmZ1hPT6/cgiMiIiIiIiIqL2VKgH18fHDu3DkAgL+/P3788Ueoq6tj4sSJmDp1arkGSERERERERFQe3vsxSABw+/Zt/PXXX7C1tUXDhg3LIy4iog8CH4NERERE9GGr8McgvS07OxuWlpawtLR836qIiIiIiIiIKkyZhkDn5uZi7ty5qFWrFmQyGW7evAkAmDVrFtavX1+uARIRERERERGVhzIlwPPmzUN4eDgWL14MNTU1cX39+vWxbt26cguOiIiIiIiIqLyUKQHeuHEj1qxZg8GDB0NZWVlc36hRI1y5cqXcgiMiIiIiIiIqL2VKgP/55x/Y2toWWJ+Xl4dXr169d1BERERERERE5a1MCbCjoyMSEhIKrP/ll1/QpEmT9w6KiIiIiIiIqLyVaRbo2bNnw8vLC//88w/y8vIQGRmJpKQkbNy4EVFRUeUdIxFR5VswCJCqVnYURPS2wJ2VHQEREVUxpeoBvnnzJgRBQM+ePbFnzx4cOnQIWlpamD17Ni5fvow9e/agW7duFRUrERERERERUZmVqgfYzs4OqampMDY2Rvv27WFgYIALFy6gZs2aFRUfERERERERUbkoVQ+wIAhyr/ft24fnz5+Xa0BEREREREREFaFMk2DlezchJvqQeHt7QyKRiIuhoSHc3Nxw/vx5sYxEIsFvv/1WYN8vv/wSysrK2LFjR7HthIeHy7Ujk8nQrFkzREZGypVzcXHBhAkTCuy/detWKCsrw8/Pr1THFxcXJ9du/jJz5sxS1UNEREREVF2UKgHO/4L97jqiD5WbmxtSU1ORmpqK2NhYqKio4NNPPy1yn6ysLGzbtg3Tpk1DaGhoidrR0dER2zl79ixcXV3h6emJpKSkYvddv349pk2bhq1btyI7O7tE7b0tKSlJbDs1NRX+/v4FyuTm5iIvL6/UdRMRERERfUxKPQTa29sbvXv3Ru/evZGdnQ1fX1/xdf5C9KGQSqUwMTGBiYkJGjduDH9/f9y5cwcPHz4sdJ8dO3bA0dER/v7+iI+Px507d4ptRyKRiO3Y2dkhJCQESkpKcr3Nity6dQsnTpyAv78/7O3tC/Qal4SxsbHYtomJCWQyGcLDw6Gnp4fdu3fD0dERUqkUKSkpOHXqFLp164YaNWpAV1cXHTt2xJkzZwocy+rVq/Hpp59CU1MTDg4O+P3333H9+nW4uLhAS0sLbdu2xY0bN+T227VrF5o2bQp1dXXY2NggKCgIr1+/LtExSCQSrFu3Dr169YKmpibs7Oywe/ducXv+8bztt99+k/sBLjAwEI0bN0ZoaChq164NmUyG0aNHIzc3F4sXL4aJiQmMjY0xb968Up5hIiIiIvpYlCoB9vLygrGxMXR1daGrq4shQ4bAzMxMfJ2/EH2IMjMzsXnzZtja2sLQ0LDQcuvXr8eQIUOgq6sLd3d3hIeHl6qd3NxcbNiwAQDQtGnTIsuGhYWhR48e4vtp/fr1pWqrKFlZWVi0aBHWrVuHixcvwtjYGM+ePYOXlxeOHTuGP/74A3Z2dujevTuePXsmt+/cuXMxdOhQJCYmol69ehg0aBC+/PJLBAQE4PTp0xAEAWPGjBHLJyQkYOjQoRg/fjwuXbqE1atXIzw8vFTJZlBQEDw9PXH+/Hl0794dgwcPxuPHj0t1zDdu3MC+ffuwf/9+bN26FevXr0ePHj1w9+5dHD16FIsWLcLMmTPx559/FlpHTk4OMjIy5BYiIiIi+jiUahbosLCwioqDqEJERUVBJpMBAJ4/fw5TU1NERUVBSUnxbz/Xrl3DH3/8IfbEDhkyBJMmTcLMmTOLHO6fnp4utvPixQuoqqpizZo1qFOnTqH75OXlITw8HMuXLwcADBgwAJMnT8atW7dgbW1d4mM0NzeXe3379m0AwKtXr7By5Uo0atRI3Na5c2e5smvWrIGenh6OHj0qNzTcx8cHnp6eAIDp06ejTZs2mDVrFlxdXQEA48ePh4+Pj1g+KCgI/v7+8PLyAgDY2Nhg7ty5mDZtGubMmVOi4/D29sbAgQMBAPPnz8eyZctw8uRJuLm5lWh/4M05DQ0Nhba2NhwdHdGpUyckJSUhOjoaSkpKqFu3LhYtWoQjR46gVatWCutYsGABgoKCStwmEREREVUd7zUJFtGHrlOnTkhMTERiYiJOnjwJV1dXuLu7i0niu0JDQ+Hq6ooaNWoAALp374709HQcPnwYwJvETCaTiUtKSgoAQFtbW2zn7NmzmD9/Pnx9fbFnz55CYzt48CCeP3+O7t27AwBq1KiBbt26lfi+43wJCQli24mJidDX1wcAqKmpoWHDhnJl//33X4wcORJ2dnbQ1dWFjo4OMjMzxePI9/Z++Y85a9Cggdy67OxssXf03LlzCA4Oljs3I0eORGpqKrKyskp0HG+3qaWlBR0dHTx48KAUZwKwsrKCtra2XJyOjo5yP3jUrFmzyHoDAgKQnp4uLiUZAk9EREREVUOpeoCJqhotLS3Y2tqKr9etWwddXV2sXbsWISEhcmXzhy7fv38fKioqcutDQ0PRpUsX+Pr6ij2jAGBmZgYAUFJSkmunYcOGiImJwaJFi+Dh4aEwtvXr1+Px48fQ0NAQ1+Xl5eH8+fMICgoqtJf6XdbW1gXujwUADQ2NAr3WXl5eSEtLww8//ABLS0tIpVK0adMGL1++lCunqqoq/ju/DkXr8ifWyszMRFBQkMI5ANTV1Ut0HG/Xn99Gfv1KSkoFZp1/9epVieooql5FpFIppFJpiWImIiIioqqFCTBVKxKJBEpKSnjx4kWBbdHR0Xj27BnOnj0LZWVlcf3ff/8NHx8fPH36FAYGBjAwMChRW8rKygrbAYC0tDTs2rUL27Ztg5OTk7g+NzcX7dq1Q0xMTKmG/pbU8ePHsXLlSrHX+c6dO3j06NF719u0aVMkJSXJ/QhQnoyMjPDs2TM8f/4cWlpaAIDExMQKaYuIiIiIPl5MgOmjlpOTg/v37wMAnjx5ghUrViAzM1Nhr2z+hElv3zMLAI6Ojpg4cSIiIiIKfVavIAhiOy9evMDBgwdx4MABzJ49W2H5TZs2wdDQEJ6engV6abt3747169dXSAJsZ2eHTZs2oXnz5sjIyMDUqVPleqDLavbs2fj0009Ru3Zt9O3bF0pKSjh37hz+/vvvAj3tZdGqVStoampixowZGDduHP78889ST05GRERERMR7gOmjtn//fpiamsLU1BStWrXCqVOnsGPHDri4uMiV+/fff7F371706dOnQB1KSkro1atXkTM0Z2RkiO04ODhg6dKlCA4Oxtdff62wfGhoKHr16qVwYq0+ffpg9+7d5dIz+67169fjyZMnaNq0Kb744guMGzcOxsbG712vq6sroqKiEBMTgxYtWqB169b47rvvYGlpWQ5RAwYGBti8eTOio6PRoEEDbN26FYGBgeVSNxERERFVHxLh3RvriIhIlJGRAV1dXaT794COVLX4HYjovxO4s7IjICKiD4D4fS09HTo6OkWW5RBoIqKSCNgCFPOBSkREREQfNg6BJvpAubu7yz1W6O1l/vz5lR1eiUVERBR6HG9PAEZEREREVNE4BJroA/XPP/8UOot0aWajrmzPnj3Dv//+q3Cbqqpqud0nXFFKM6SGiIiIiP57HAJN9BGoVatWZYdQLrS1taGtrV3ZYRARERERcQg0ERERERERVQ9MgImIiIiIiKhaYAJMRERERERE1QITYCIiIiIiIqoWmAATERERERFRtcAEmIiIiIiIiKoFJsBERERERERULTABJiIiIiIiomqBCTARERERERFVC0yAiYiIiIiIqFpgAkxERERERETVAhNgIiIiIiIiqhZUKjsAIqIqYcEgQKpa2VEQVS2BOys7AiIiIjnsASYiIiIiIqJqgQkwERERERERVQtMgImIiIiIiKhaYAJMVAV4e3tD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RERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBa2GDoCIqFEImQBItRs6CqLX27LdDR0BERFRtTgCTERERERERGqBCTARERERERGpBSbApHbCw8NhbGxcb/XHxcVBIpEgNze3TurLzMyERCKBQqGok/pepWf7or77noiIiIioOkyAqUny8/ODRCKBRCKBjo4O5HI5VqxYgZKSknpvu1evXsjOzoaRkVG9t/W00NBQdO7cGQYGBjA2NoarqytCQkLqpO66SurHjh2L1NTUOompf//+4mcskUhgYWEBX19f3LhxQyxT8ceDis3U1BSDBg3CpUuX6iQGIiIiImpcmABTk+Xj44Ps7GykpaVh3rx5WLZsGdatW1fv7ero6MDS0hISiaTe26rw448/Yu7cuZg9ezYUCgVOnjyJgIAAFBQUvLIYakJXVxfm5uZ1Vt/06dORnZ2N27dvY8+ePbh58yb+/e9/Vyp3+PBhZGdn49ChQygoKMCQIUPqbISeiIiIiBoPJsDUZEmlUlhaWsLW1hYffPABvL29sXfvXvH4oUOH4OzsDAMDAzFZBoBjx45BW1sbOTk5SvXNnTsXffr0AQDcuHEDw4YNg4mJCfT19eHi4oLo6GgAqkdLT548if79+0NPTw8mJiYYPHgwHj58CAA4ePAgevfuDWNjY5iamuLNN99ERkZGra517969GDNmDKZOnQq5XA4XFxeMHz8eK1eufOlryszMhKenJwDAxMQEEokEfn5+AICioiLMnj0b5ubmkMlk6N27N86dO1dlnKqmQP/3v/9Ft27dIJPJ0KJFC4wcObLG162npwdLS0tYWVmhZ8+emDVrFi5evFipnKmpKSwtLeHm5ob169fjzp07OHv2bI3bISIiIqKmgQkwqQ1dXV38888/AIDCwkKsX78eO3bswLFjx5CVlYX58+cDAPr27Qt7e3vs2LFDPLe4uBg7d+7Eu+++CwDw9/dHUVERjh07hoSEBKxZswYGBgYq21UoFPDy8kL79u1x+vRpnDhxAsOGDUNpaSkA4PHjx/j4449x/vx5xMbGQkNDAyNHjkRZWVmNr83S0hJnzpxRmv77tJe5JhsbG/z2228AgJSUFGRnZ+Orr74CAAQEBOC3337Dtm3bcPHiRcjlcgwePBgPHjyoUdz79+/HyJEjMXToUFy6dAmxsbHo3r17ja/7aQ8ePMAvv/yCHj16VFtOV1cXAMR74VlFRUXIz89X2oiIiIioaeB7gKnJEwQBsbGxOHToED788EMA5cnft99+CwcHBwDArFmzsGLFCvGcqVOnIiwsDJ988gmA8lHKv//+G2PGjAEAZGVlYdSoUejYsSMAwN7evsr2165dCzc3N2zevFnc5+LiIv571KhRSuV//PFHmJmZITExER06dKjRNQYFBeHtt9+GnZ0dnJyc4O7ujqFDh2L06NHQ0NB46Wtq3rw5AMDc3FwcwX38+DG2bNmC8PBwDBkyBED5c8h//PEHfvjhB7Gd6qxcuRLjxo3D8uXLxX2dO3eu0TUDwObNm7F161YIgoDCwkI4OTnh0KFDVZbPzc3FZ599BgMDgyoT7ZCQEKV4iIiIiKjp4AgwNVn79u2DgYEBZDIZhgwZgrFjx2LZsmUAyqfOViS/AGBlZYW7d++KP/v5+SE9PR1nzpwBUD51d8yYMdDX1wcAzJ49G8HBwfDw8EBQUBCuXLlSZRwVI8BVSUtLw/jx42Fvbw9DQ0PY2dkBKE9IVXFxcYGBgQEMDAzExNPKygqnT59GQkIC5syZg5KSEkyZMgU+Pj7iSHJdXhMAZGRkoLi4GB4eHuI+bW1tdO/eHUlJSdWeW9O+eZ6JEydCoVDg8uXLOHHiBORyOQYNGoRHjx4plevVqxcMDAxgYmKCy5cvIzIyEhYWFirrDAwMRF5enrjdvHnzheMjIiIiotcLE2Bqsjw9PaFQKJCWloYnT55g27ZtYrKnra2tVFYikUAQBPFnc3NzDBs2DGFhYbhz5w4OHDggThUGgGnTpuHatWuYNGkSEhIS4Obmhk2bNqmMo2LKbVWGDRuGBw8eIDQ0FGfPnhWfTa1qim50dDQUCgUUCgW2bt2qdKxDhw6YOXMmfvrpJ/zxxx/4448/cPTo0Tq/prryvL55HiMjI8jlcsjlcnh4eOCHH35AWloaIiMjlcpFRkbi8uXLePjwITIyMjB06NAq65RKpTA0NFTaiIiIiKhpYAJMTZa+vj7kcjlat24NLa3az/afNm0aIiMj8f3338PBwUFppBMAbGxsMGPGDERFRWHevHkIDQ1VWU+nTp0QGxur8tj9+/eRkpKCxYsXw8vLC87OzuLiWFWxtbUVkz5ra+sqy7Vv3x5A+VTll70mHR0dABCfWwYABwcH6Ojo4OTJk+K+4uJinDt3Tmz7earrmxehqakJAHjy5InSfhsbGzg4OPAdxERERERqjs8AE1Vh8ODBMDQ0RHBwsNLzwUD56slDhgyBk5MTHj58iCNHjsDZ2VllPYGBgejYsSNmzpyJGTNmQEdHB0eOHIGvry+aN28OU1NTfP/997CyskJWVhYWLlxY61g/+OADtGzZEgMGDECrVq2QnZ2N4OBgmJmZwd3d/aWvydbWFhKJBPv27cPQoUOhq6sLAwMDfPDBB/jkk0/QvHlztG7dGmvXrkVhYSGmTp1ao7iDgoLg5eUFBwcHjBs3DiUlJYiOjsaCBQtqdH5hYaG4svWdO3fw2WefQSaTYdCgQTU6n4iIiIjUC0eAiaqgoaEBPz8/lJaWYvLkyUrHSktL4e/vD2dnZ/j4+MDJyUlpkaunOTk5ISYmBpcvX0b37t3h7u6OPXv2QEtLCxoaGoiIiMCFCxfQoUMHfPTRRy/0rmJvb2+cOXMGvr6+cHJywqhRoyCTyRAbGwtTU9OXviZra2ssX74cCxcuhIWFBWbNmgUAWL16NUaNGoVJkyaha9euSE9Px6FDh2BiYlKjuPv3749ff/0Ve/fuRZcuXTBgwADEx8fX+LpDQ0NhZWUFKysreHp64t69e4iOjkbbtm1rXAcRERERqQ+J8PSDj0SkZOrUqfjrr7+U3h/c2DXFa6pP+fn5MDIyQt7Cf8FQqv38E4jU2bLdDR0BERGpIfH3tby8567fwinQRCrk5eUhISEBP//8c5NJFJviNRERERER1QYTYCIVRowYgfj4eMyYMQMDBw5s6HDqRGO6puPHj4uveFKloKDgFUbz/wv8GeCK0ERERESNGqdAE9Fr58mTJ/h//+//VXlcLpe/slhqM6WGiIiIiF49ToEmokZNV1f3lSa5RERERKQeuAo0ERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBSbAREREREREpBaYABMREREREZFaYAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqQauhAyAiahRCJgBS7YaOguj1sWx3Q0dARERUaxwBJiIiIiIiIrXABJiIiIiIiIjU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Ug9MgIleEQcHB1y6dAmrVq1CYGAgbt26BalUivbt22P+/PmYOXOmWHbEiBE4deoUQkJCMGHCBOTn58PGxgYDBgxQeldvbUkkEkRGRiI0NBRhYWFYu3YtiouL0apVK3h5eeHzzz8XyzZv3hxnzpzB6tWrERwcjBs3bsDExAQdO3bEunXrYGRk9Nz2evbsiQsXLmDVqlXw9/dHTk4O9PX10blzZ3zxxRd49913AQDdu3fHiRMnMGPGDNy+fRsGBgZwcXHB77//jn79+lVZ/4ABAzBgwADExMRUOrZ06VIsXboUOjo6sLS0RM+ePREbGwtPT88X6DkiIiIiagokQn2tdkNE1ATk5+fDyMgIeQv/BUOpdkOHQ/T6WLb7+WWIiIheAfH3tbw8GBoaVluWzwATERERERGRWuAUaCJ6IcePH6/0+qWnVbxSqckI/Bl4zl8UiYiIiOj1xgSYiF6Im5sbFApFQ4dBRERERFRjTICJ6IXo6upyNWUiIiIialT4DDARERERERGpBSbAREREREREpBaYABMREREREZFaYAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGpBq6EDICJqFEImAFLtho6C6PWwbHdDR0BERPRCOAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAEzUQPz8/SCSSSlt6ejoAICcnB3PmzIFcLodMJoOFhQU8PDywZcsWFBYWKtV16dIl+Pr6wsLCAjKZDI6Ojpg+fTpSU1OrbD8uLk5l+4sXLxbLCIKA0NBQuLu7w9DQEAYGBnBxccGcOXPEOCvk5+dj0aJFaNeuHWQyGSwtLeHt7Y2oqCgIglCjPklPT8e7776L1q1bQyqVwtraGl5eXti5cydKSkrEckePHsWAAQPQvHlz6OnpwdHREVOmTME///xT6do0NDRgZGQEV1dXBAQEIDs7u0axEBEREVHTwwSYqAH5+PggOztbaWvTpg2uXbsGV1dXxMTEYNWqVbh06RJOnz6NgIAA7Nu3D4cPHxbr2LdvH3r27ImioiLs3LkTSUlJ+Omnn2BkZIQlS5Y8N4aUlBSl9hcuXAigPPmdMGECZs+ejaFDhyImJgaJiYn44YcfIJPJEBwcLNaRm5uLXr16Yfv27QgMDMTFixdx7NgxjB07FgEBAcjLy3tuHPHx8ejatSuSkpLwzTff4M8//0RcXBymTZuGLVu24OrVqwCAxMRE+Pj4wM3NDceOHUNCQgI2bdoEHR0dlJaWVrq227dv49y5c1iwYAEOHz6MDh06ICEhoUafDxERERE1LRKhpkMzRFSn/Pz8kJubi99//73SMR8fH1y9ehXJycnQ19evdFwQBEgkEhQWFsLW1ha9e/fG7t2VV2XNzc2FsbGxyvbj4uLg6emJhw8fqiwTERGB8ePHY8+ePRg+fHiVMQDAzJkzsX37dqSmpqJly5ZK5QoKCiCTyaClVfWi84IgwMXFBXp6eoiPj4eGRuW/zVW09+WXX+Krr77C9evXq6yvqmt78uQJXF1d0aJFC5w4caLK85+Wn58PIyMj5C38Fwy5CjRROa4CTURErxHx97W8PBgaGlZbliPARK+Z+/fvIyYmBv7+/iqTXwBi4nno0CHcu3cPAQEBKstVlfzWxK5du9C2bVuVye/TMZSVlSEiIgITJ06slPwCgIGBQbXJLwAoFAokJSVh/vz5KpPfp9uztLREdnY2jh07VpvLAQDo6upixowZOHnyJO7evauyTFFREfLz85U2IiIiImoamAATNaB9+/bBwMBA3Hx9fZGeng5BENC2bVulsi1atBDLLViwAACQlpYGAGjXrt0Lx9CqVSulGO7fvw8ASE1NrRTD3LlzxXKtWrUCANy7dw8PHz58qRgqnlV+ur27d+8qxbV582YAgK+vL8aPH49+/frBysoKI0eOxNdff13jRLUizszMTJXHQ0JCYGRkJG42NjYvfF1ERERE9HphAkzUgDw9PaFQKMRt48aNVZaNj4+HQqGAi4sLioqKAKDGi0u5uLiIieSQIUOUjh0/flwpBhMTkyrrWbRoERQKBZYuXYqCgoJaxVBbpqamYkzGxsbiAleampoICwvDrVu3sHbtWlhbW2PVqlVwcXGp0QJXFfFWjCg/KzAwEHl5eeJ28+bNursoIiIiImpQ1c9LJKJ6pa+vD7lcrrRPR0cHEokEKSkpSvvt7e0BlE/jreDk5AQASE5Ohru7e5XtREdHo7i4uNL5ANCmTRuVU6UdHR0rxWBmZgYzMzOYm5sr7TM2NkZycnKV7T+Po6MjgPJFq1xdXQGUJ7oVfaNqCrW1tTUmTZqESZMm4bPPPoOTkxO+/fZbLF++vNq2kpKSAAB2dnYqj0ulUkil0he9FCIiIiJ6jXEEmOg1Y2pqioEDB+Lrr7/G48ePqy07aNAgtGjRAmvXrlV5PDc3FwBga2sLuVwOuVwOa2vrGsUxfvx4pKSkYM+ePdWW09DQwLhx47Bz507cvn270vGCggKlVxip4urqinbt2mH9+vUoKyurUXxPMzExgZWV1XP768mTJ/j+++/Rt29fmJmZ1bodIiIiImrcmAATvYY2b96MkpISuLm5ITIyEklJSUhJScFPP/2E5ORkaGpqAigfQd66dSv279+P4cOH4/Dhw8jMzMT58+cREBCAGTNmvHAM48aNw+jRozFu3DisWLECZ8+eRWZmJo4ePYrIyEgxBgBYuXIlbGxs0KNHD2zfvh2JiYlIS0vDjz/+CFdXV3G6dFUkEgnCwsKQkpICDw8P7N27F2lpaUhMTMS3336Lv/76S2zvu+++wwcffICYmBhkZGTg6tWrWLBgAa5evYphw4Yp1Xv37l3k5OQgLS0NERER8PDwwL1797Bly5YX7hciIiIiarw4BZroNeTg4IBLly5h1apVCAwMxK1btyCVStG+fXvMnz8fM2fOFMuOGDECp06dQkhICCZMmID8/HzY2NhgwIABSu/qrS2JRILIyEiEhoYiLCwMa9euRXFxMVq1agUvLy98/vnnYtnmzZvjzJkzWL16NYKDg3Hjxg2YmJigY8eOWLduHYyMjJ7bXs+ePXHhwgWsWrUK/v7+yMnJgb6+Pjp37owvvvgC7777LgCge/fuOHHiBGbMmIHbt2/DwMAALi4u+P3339GvXz+lOtu2bQuJRAIDAwPY29tj0KBB+Pjjj2FpafnC/UJEREREjRffA0xEVA2+B5hIBb4HmIiIXiO1eQ8wR4CJiGoi8GfgOV+oRERERPR64zPARFTvjh8/rvRO32c3IiIiIqJXgSPARFTv3NzcoFAoGjoMIiIiIlJzTICJqN7p6upWet8xEREREdGrxinQREREREREpBaYABMREREREZFaYAJMREREREREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBa2GDoCIqFEI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REREaoEJMBEREREREakFJsBERERERESkFpgAExERERERkVpgAkxERERERERqgQkwERERERERqQUmwERERERERKQWmAATERERERGRWmACTERERERERGqBCTARERERERGpBa2GDoCIqFEImQBItRs6CiJg2e6GjoCIiKjR4ggwERERERERqQUmwERERERERKQWmAATERERERGRWmACTNTI+Pn5QSKRVNrS09MBADk5OZgzZw7kcjlkMhksLCzg4eGBLVu2oLCwUKmuS5cuwdfXFxYWFpDJZHB0dMT06dORmppaZftxcXEq21+8eLFYRhAEhIaGwt3dHYaGhjAwMICLiwvmzJkjxlkhPz8fixYtQrt27SCTyWBpaQlvb29ERUVBEIQq48jMzFQZx9NbeHi4GG9ubu4L9DYRERERNSVcBIuoEfLx8UFYWJjSPjMzM1y7dg0eHh4wNjbGqlWr0LFjR0ilUiQkJOD777+HtbU1hg8fDgDYt28fRo0ahcGDB2Pnzp1wcHDA3bt38euvv2LJkiWIjIysNoaUlBQYGhqKPxsYGAAoT34nTJiA33//HZ9++im++OILtGzZErdv38bu3bsRHByM8PBwAEBubi569+6NvLw8BAcHo1u3btDS0sLRo0cREBCAAQMGwNjYWGX7NjY2yM7OFn9ev349Dh48iMOHD4v7jIyMcPbs2Rr3KxERERE1bUyAiRohqVQKS0vLSvtnzpwJLS0tnD9/Hvr6+uJ+e3t7jBgxQhxRLSwsxDvvvIOhQ4di9+7/W1G2TZs26NGjR41GS83NzVUmp5GRkYiIiMCePXvEZBsAWrdujZ49eyqN6n766afIzMxEamoqWrZsKe53cnLC+PHjIZPJqmxfU1NTqQ8MDAygpaWlsl9qo6ioCEVFReLP+fn5L1UfEREREb0+OAWaqIm4f/8+YmJi4O/vr5T8Pk0ikQAADh06hHv37iEgIEBluapGXWti165daNu2rVLyqyqGsrIyREREYOLEiUrJb4WKhPZVCwkJgZGRkbjZ2Ni88hiIiIiIqH4wASZqhPbt2wcDAwNx8/X1RXp6OgRBQNu2bZXKtmjRQiy3YMECAEBaWhoAoF27di8cQ6tWrZRiuH//PgAgNTW1Ugxz584Vy7Vq1QoAcO/ePTx8+PClYqgPgYGByMvLE7ebN282dEhEREREVEc4BZqoEfL0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"},"metadata":{}}],"execution_count":64},{"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-11-13T02:22:05.733292Z","iopub.execute_input":"2024-11-13T02:22:05.733782Z","iopub.status.idle":"2024-11-13T02:22:05.740422Z","shell.execute_reply.started":"2024-11-13T02:22:05.733736Z","shell.execute_reply":"2024-11-13T02:22:05.739354Z"}},"outputs":[],"execution_count":65},{"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\ntrain_ts_noID = train_ts.drop('id', axis=1)\ntest_ts_noID = test_ts.drop('id', axis=1)\n\ntrain_ts_encoded = perform_autoencoder(train_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\ntest_ts_encoded = perform_autoencoder(test_ts_noID, encoding_dim=60, epochs=100, batch_size=32)\n\ntime_series_cols = train_ts_encoded.columns.tolist()\ntrain_ts_encoded[\"id\"]=train_ts[\"id\"]\ntest_ts_encoded['id']=test_ts[\"id\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:22:05.741580Z","iopub.execute_input":"2024-11-13T02:22:05.741901Z","iopub.status.idle":"2024-11-13T02:23:38.856087Z","shell.execute_reply.started":"2024-11-13T02:22:05.741859Z","shell.execute_reply":"2024-11-13T02:23:38.854982Z"}},"outputs":[{"name":"stderr","text":"100%|██████████| 996/996 [01:21<00:00, 12.17it/s]\n100%|██████████| 2/2 [00:00<00:00, 12.84it/s]\n","output_type":"stream"},{"name":"stdout","text":"Epoch [10/100], Loss: 1.6832]\nEpoch [20/100], Loss: 1.6234]\nEpoch [30/100], Loss: 1.5770]\nEpoch [40/100], Loss: 1.5321]\nEpoch [50/100], Loss: 1.5061]\nEpoch [60/100], Loss: 1.4970]\nEpoch [70/100], Loss: 1.4968]\nEpoch [80/100], Loss: 1.4973]\nEpoch [90/100], Loss: 1.4980]\nEpoch [100/100], Loss: 1.4942]\nEpoch [10/100], Loss: 1.0089]\nEpoch [20/100], Loss: 0.6029]\nEpoch [30/100], Loss: 0.4271]\nEpoch [40/100], Loss: 0.4271]\nEpoch [50/100], Loss: 0.4271]\nEpoch [60/100], Loss: 0.4271]\nEpoch [70/100], Loss: 0.4271]\nEpoch [80/100], Loss: 0.4271]\nEpoch [90/100], Loss: 0.4271]\nEpoch [100/100], Loss: 0.4271]\n","output_type":"stream"}],"execution_count":66},{"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-11-13T02:23:38.857383Z","iopub.execute_input":"2024-11-13T02:23:38.857842Z","iopub.status.idle":"2024-11-13T02:23:38.865202Z","shell.execute_reply.started":"2024-11-13T02:23:38.857796Z","shell.execute_reply":"2024-11-13T02:23:38.864156Z"}},"outputs":[],"execution_count":67},{"cell_type":"code","source":"train_df = pd.merge(train_df, train_ts_encoded, how=\"left\", on='id')\ntest_df = pd.merge(test_df, test_ts_encoded, how=\"left\", on='id')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.866265Z","iopub.execute_input":"2024-11-13T02:23:38.868218Z","iopub.status.idle":"2024-11-13T02:23:38.883489Z","shell.execute_reply.started":"2024-11-13T02:23:38.868167Z","shell.execute_reply":"2024-11-13T02:23:38.882540Z"}},"outputs":[],"execution_count":68},{"cell_type":"code","source":"imputer = KNNImputer(n_neighbors=5)\nnumeric_cols = train_df.select_dtypes(include=['float64', 'int64']).columns\nimputed_data = imputer.fit_transform(train_df[numeric_cols])\ntrain_imputed = pd.DataFrame(imputed_data, columns=numeric_cols)\ntrain_imputed['sii'] = train_imputed['sii'].round().astype(int)\nfor col in train_df.columns:\n if col not in numeric_cols:\n train_imputed[col] = train_df[col]\n \ntrain_df = train_imputed\n\ntrain_df = feature_engineering(train_df)\ntrain_df = train_df.dropna(thresh=10, axis=0)\ntest_df = feature_engineering(test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:12.742036Z","iopub.execute_input":"2024-11-13T02:24:12.742440Z","iopub.status.idle":"2024-11-13T02:24:12.781294Z","shell.execute_reply.started":"2024-11-13T02:24:12.742402Z","shell.execute_reply":"2024-11-13T02:24:12.780552Z"}},"outputs":[],"execution_count":70},{"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-11-13T02:24:20.242224Z","iopub.execute_input":"2024-11-13T02:24:20.242990Z","iopub.status.idle":"2024-11-13T02:24:20.251667Z","shell.execute_reply.started":"2024-11-13T02:24:20.242953Z","shell.execute_reply":"2024-11-13T02:24:20.250623Z"}},"outputs":[],"execution_count":71},{"cell_type":"code","source":"print(f'Train Shape : {train_df.shape} || Test Shape : {test_df.shape}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:38.120201Z","iopub.execute_input":"2024-11-13T02:24:38.120612Z","iopub.status.idle":"2024-11-13T02:24:38.125743Z","shell.execute_reply.started":"2024-11-13T02:24:38.120573Z","shell.execute_reply":"2024-11-13T02:24:38.124709Z"}},"outputs":[{"name":"stdout","text":"Train Shape : (2718, 94) || Test Shape : (20, 93)\n","output_type":"stream"}],"execution_count":72},{"cell_type":"code","source":"train_df = train_df.fillna(0)\ntest_df = test_df.fillna(0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:40.311830Z","iopub.execute_input":"2024-11-13T02:24:40.312189Z","iopub.status.idle":"2024-11-13T02:24:40.324866Z","shell.execute_reply.started":"2024-11-13T02:24:40.312158Z","shell.execute_reply":"2024-11-13T02:24:40.323701Z"}},"outputs":[],"execution_count":73},{"cell_type":"code","source":"from imblearn.over_sampling import SMOTE\nX_train = train_df.drop(columns=['sii']) # 假設 'sii' 是目標欄位\ny_train = train_df['sii']\n\n# 使用 SMOTE 進行過採樣\nsmote = SMOTE(random_state=42)\nX_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:24:44.236575Z","iopub.execute_input":"2024-11-13T02:24:44.237416Z","iopub.status.idle":"2024-11-13T02:24:44.424853Z","shell.execute_reply.started":"2024-11-13T02:24:44.237377Z","shell.execute_reply":"2024-11-13T02:24:44.424033Z"}},"outputs":[],"execution_count":74},{"cell_type":"code","source":"X_train_resampled","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.940428Z","iopub.status.idle":"2024-11-13T02:23:38.940868Z","shell.execute_reply.started":"2024-11-13T02:23:38.940653Z","shell.execute_reply":"2024-11-13T02:23:38.940675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_train_resampled","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.941742Z","iopub.status.idle":"2024-11-13T02:23:38.942147Z","shell.execute_reply.started":"2024-11-13T02:23:38.941936Z","shell.execute_reply":"2024-11-13T02:23:38.941957Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train = X_train_resampled\ny_train = y_train_resampled\nX_test = test_df\n\nmodel = RandomForestClassifier(random_state=0)\nmodel.fit(X_train, y_train)\n\n# model = TabNetRegressor(\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# max_epochs=500, \n# patience=50, \n# batch_size=1024,\n# virtual_batch_size=128,\n# num_workers=0,\n# drop_last=False,\n# )\n\n\ntest_df['sii'] = model.predict(X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:25:29.517412Z","iopub.execute_input":"2024-11-13T02:25:29.517806Z","iopub.status.idle":"2024-11-13T02:25:31.709993Z","shell.execute_reply.started":"2024-11-13T02:25:29.517772Z","shell.execute_reply":"2024-11-13T02:25:31.709168Z"}},"outputs":[],"execution_count":75},{"cell_type":"code","source":"submit_df = pd.concat([test_id, test_df['sii']], axis=1)\nsubmit_df['sii'] = submit_df['sii'].astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:25:35.292463Z","iopub.execute_input":"2024-11-13T02:25:35.292856Z","iopub.status.idle":"2024-11-13T02:25:35.298737Z","shell.execute_reply.started":"2024-11-13T02:25:35.292821Z","shell.execute_reply":"2024-11-13T02:25:35.297751Z"}},"outputs":[],"execution_count":76},{"cell_type":"code","source":"submit_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:25:50.497175Z","iopub.execute_input":"2024-11-13T02:25:50.497961Z","iopub.status.idle":"2024-11-13T02:25:50.508569Z","shell.execute_reply.started":"2024-11-13T02:25:50.497921Z","shell.execute_reply":"2024-11-13T02:25:50.507323Z"}},"outputs":[{"execution_count":77,"output_type":"execute_result","data":{"text/plain":" id sii\n0 00008ff9 2\n1 000fd460 0\n2 00105258 0\n3 00115b9f 0\n4 0016bb22 2\n5 001f3379 0\n6 0038ba98 0\n7 0068a485 0\n8 0069fbed 0\n9 0083e397 0\n10 0087dd65 0\n11 00abe655 0\n12 00ae59c9 1\n13 00af6387 1\n14 00bd4359 0\n15 00c0cd71 2\n16 00d56d4b 0\n17 00d9913d 0\n18 00e6167c 0\n19 00ebc35d 0","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idsii
000008ff92
1000fd4600
2001052580
300115b9f0
40016bb222
5001f33790
60038ba980
70068a4850
80069fbed0
90083e3970
100087dd650
1100abe6550
1200ae59c91
1300af63871
1400bd43590
1500c0cd712
1600d56d4b0
1700d9913d0
1800e6167c0
1900ebc35d0
\n
"},"metadata":{}}],"execution_count":77},{"cell_type":"code","source":"submit_df.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T02:23:38.950333Z","iopub.status.idle":"2024-11-13T02:23:38.951086Z","shell.execute_reply.started":"2024-11-13T02:23:38.950858Z","shell.execute_reply":"2024-11-13T02:23:38.950883Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]} \ No newline at end of file +