{"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":30805,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# PROBLEM\n","metadata":{}},{"cell_type":"markdown","source":"Target Variable (sii) is defined as:\n- 0: None (PCIAT-PCIAT_Total from 0 to 30)\n- 1: Mild (PCIAT-PCIAT_Total from 31 to 49)\n- 2: Moderate (PCIAT-PCIAT_Total from 50 to 79)\n- 3: Severe (PCIAT-PCIAT_Total 80 and more)\nThis makes sii an ordinal categorical variable with four levels, where the order of categories is meaningful.","metadata":{}},{"cell_type":"markdown","source":"Approaches to Modeling SII as the Target Variable\n1. Multiclass classification (treat sii as a nominal categorical variable without considering the order)\n2. Regression (ignore the discrete nature of categories and treat sii as a continuous variable, then round prediction)\nWe can also use `PCIAT-PCIAT_Total` as a continuous target variable, and implement regression on `PCIAT-PCIAT_Total` and then map predictions to sii categories.\n- **In this project, the primary focus will be on classification models to directly predict SII categories.**","metadata":{}},{"cell_type":"markdown","source":"# Exploratory Data Analysis","metadata":{}},{"cell_type":"markdown","source":"- Load Python Libraries","metadata":{}},{"cell_type":"code","source":"import kagglehub\nimport numpy as np\nimport pandas as pd\nimport os\nimport re\nfrom sklearn.base import clone\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom scipy.optimize import minimize\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nimport polars as pl\nimport polars.selectors as cs\nimport matplotlib.pyplot as plt\nfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter, PercentFormatter\nimport seaborn as sns\n\nfrom sklearn.preprocessing import StandardScaler\nimport matplotlib.pyplot as plt\nfrom keras.models import Model\nfrom keras.layers import Input, Dense\nfrom keras.optimizers import Adam\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\n\nfrom colorama import Fore, Style\nfrom IPython.display import clear_output\nimport warnings\nfrom catboost import CatBoostRegressor\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\n\nfrom sklearn.ensemble import VotingRegressor, RandomForestRegressor, GradientBoostingRegressor\nfrom sklearn.impute import  KNNImputer\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\npath = kagglehub.dataset_download(\"ryati131457/pytorchtabnet\")\nprint(\"Path to dataset files:\", path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:06.074128Z","iopub.execute_input":"2024-12-21T12:01:06.074452Z","iopub.status.idle":"2024-12-21T12:01:30.291030Z","shell.execute_reply.started":"2024-12-21T12:01:06.074404Z","shell.execute_reply":"2024-12-21T12:01:30.290134Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data Processing Pipeline","metadata":{}},{"cell_type":"markdown","source":"##  Data Ingestion","metadata":{}},{"cell_type":"markdown","source":"- Load data from file","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\nsample = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.292048Z","iopub.execute_input":"2024-12-21T12:01:30.292791Z","iopub.status.idle":"2024-12-21T12:01:30.373926Z","shell.execute_reply.started":"2024-12-21T12:01:30.292760Z","shell.execute_reply":"2024-12-21T12:01:30.372942Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.describe()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.375798Z","iopub.execute_input":"2024-12-21T12:01:30.376095Z","iopub.status.idle":"2024-12-21T12:01:30.548867Z","shell.execute_reply.started":"2024-12-21T12:01:30.376069Z","shell.execute_reply":"2024-12-21T12:01:30.547946Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Data Validation","metadata":{}},{"cell_type":"markdown","source":"- Schema check","metadata":{}},{"cell_type":"code","source":"print(\"Train Dimension: \", train.shape)\nprint(\"Test Dimension: \", test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.550104Z","iopub.execute_input":"2024-12-21T12:01:30.551008Z","iopub.status.idle":"2024-12-21T12:01:30.556045Z","shell.execute_reply.started":"2024-12-21T12:01:30.550962Z","shell.execute_reply":"2024-12-21T12:01:30.555143Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"##  Data Cleaning & Feature Engineering","metadata":{}},{"cell_type":"markdown","source":"- Standarization","metadata":{}},{"cell_type":"markdown","source":"- Feature selection","metadata":{}},{"cell_type":"code","source":"def feature_engineering(df):\n    df['Physical-Weight'] = df['Physical-Weight'].replace(0, np.nan)\n    df['Physical-Height'] = df['Physical-Height'].replace(0, np.nan)\n    df['Physical-BMI'] = df['Physical-BMI'].replace(0, np.nan)\n    df['Basic_Demos-Age'] = df['Basic_Demos-Age'].replace(0, np.nan)\n    df['Physical-Waist_Circumference'] = df['Physical-Waist_Circumference'].replace(0, np.nan)\n    df['Physical-Diastolic_BP'] = df['Physical-Diastolic_BP'].replace(0, np.nan)\n    df['Physical-HeartRate'] = df['Physical-HeartRate'].replace(0, np.nan)\n    df['Physical-Systolic_BP'] = df['Physical-Systolic_BP'].replace(0, np.nan)\n\n    df['Total_Fitness_Endurance_Time'] = np.where(\n        df['Fitness_Endurance-Time_Mins'].isna() & df['Fitness_Endurance-Time_Sec'].isna(),\n        np.nan,\n        df['Fitness_Endurance-Time_Mins'].fillna(0) + df['Fitness_Endurance-Time_Sec'].fillna(0) / 60\n    )\n    df = df.drop(\"Fitness_Endurance-Time_Mins\",axis=1)\n    df = df.drop(\"Fitness_Endurance-Time_Sec\",axis=1)\n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.557296Z","iopub.execute_input":"2024-12-21T12:01:30.557657Z","iopub.status.idle":"2024-12-21T12:01:30.566754Z","shell.execute_reply.started":"2024-12-21T12:01:30.557618Z","shell.execute_reply":"2024-12-21T12:01:30.565939Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"featuresCols = ['Basic_Demos-Enroll_Season', 'Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-Season', 'CGAS-CGAS_Score', 'Physical-Season', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Season', 'Fitness_Endurance-Max_Stage',\n                # 'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                'FGC-Season', 'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n                'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n                'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n                'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone', 'BIA-Season',\n                'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n                'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n                'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n                'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n                'BIA-BIA_TBW', 'PAQ_A-Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-Season',\n                'PAQ_C-PAQ_C_Total', 'SDS-Season', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T', 'PreInt_EduHx-Season',\n                'PreInt_EduHx-computerinternet_hoursday','Total_Fitness_Endurance_Time']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.567649Z","iopub.execute_input":"2024-12-21T12:01:30.567888Z","iopub.status.idle":"2024-12-21T12:01:30.580189Z","shell.execute_reply.started":"2024-12-21T12:01:30.567858Z","shell.execute_reply":"2024-12-21T12:01:30.579494Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"SEED = 42\nn_splits = 5","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.581107Z","iopub.execute_input":"2024-12-21T12:01:30.581374Z","iopub.status.idle":"2024-12-21T12:01:30.592469Z","shell.execute_reply.started":"2024-12-21T12:01:30.581349Z","shell.execute_reply":"2024-12-21T12:01:30.591690Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data Filtering","metadata":{}},{"cell_type":"code","source":"def update(df):\n    global cat_c\n    for c in cat_c: \n        df[c] = df[c].fillna('Missing')\n        df[c] = df[c].astype('category')   \n    return df\n    \ndef create_mapping(column, dataset):\n    unique_values = dataset[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\ncat_c = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', \n          'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', \n          'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', 'PreInt_EduHx-Season']\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.593407Z","iopub.execute_input":"2024-12-21T12:01:30.593666Z","iopub.status.idle":"2024-12-21T12:01:30.603103Z","shell.execute_reply.started":"2024-12-21T12:01:30.593642Z","shell.execute_reply":"2024-12-21T12:01:30.602374Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = feature_engineering(train)\ntest = feature_engineering(test)\nlabel_column = train['sii']\ntrain = train.drop('sii',axis=1)\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.605627Z","iopub.execute_input":"2024-12-21T12:01:30.605913Z","iopub.status.idle":"2024-12-21T12:01:30.636741Z","shell.execute_reply.started":"2024-12-21T12:01:30.605881Z","shell.execute_reply":"2024-12-21T12:01:30.635821Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"- KNN Imputation","metadata":{}},{"cell_type":"code","source":"# Bước 1: Gộp train và test\nall_data = pd.concat([train, test], axis=0)\n# Bước 2: Xác định các cột numeric\nnumeric_cols = all_data.select_dtypes(include=['float64', 'int64']).columns\nimputer = KNNImputer(n_neighbors=5)\nimputed_data = imputer.fit_transform(all_data[numeric_cols])\n\n# Chuyển kết quả impute về DataFrame\nall_data_imputed = pd.DataFrame(imputed_data, \n                                columns=numeric_cols, \n                                index=all_data.index)\n\n# Bước 4: Khôi phục lại các cột không phải numeric\nfor col in all_data.columns:\n    if col not in numeric_cols:\n        all_data_imputed[col] = all_data[col]\n\n# Bước 5: Tách lại tập train và test dựa trên index\ntrain_imputed = all_data_imputed.iloc[:len(train)]\ntest_imputed = all_data_imputed.iloc[len(train):]\n\n# Giờ bạn có train_imputed và test_imputed đã được impute\ntrain = train_imputed\ntest = test_imputed","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:30.637746Z","iopub.execute_input":"2024-12-21T12:01:30.638009Z","iopub.status.idle":"2024-12-21T12:01:37.848731Z","shell.execute_reply.started":"2024-12-21T12:01:30.637983Z","shell.execute_reply":"2024-12-21T12:01:37.847908Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"- Select training data for training model","metadata":{}},{"cell_type":"code","source":"train = train[featuresCols]\ntest = test[featuresCols]\ntrain['sii'] = label_column\ntrain = train.dropna(subset='sii')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:37.849999Z","iopub.execute_input":"2024-12-21T12:01:37.850731Z","iopub.status.idle":"2024-12-21T12:01:37.862359Z","shell.execute_reply.started":"2024-12-21T12:01:37.850678Z","shell.execute_reply":"2024-12-21T12:01:37.861327Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"- We don't use season feature for KNNImputation because they can make my model become overfiting so, add that feature after Imputation","metadata":{}},{"cell_type":"code","source":"def update(df):\n    global cat_c\n    for c in cat_c: \n        df[c] = df[c].fillna('Missing')\n        df[c] = df[c].astype('category')\n    return df\n\ntrain = update(train)\ntest = update(test)\nfor col in cat_c:\n    mapping = create_mapping(col, train)\n    mappingTe = create_mapping(col, test)\n    train[col] = train[col].replace(mapping).astype(int)\n    test[col] = test[col].replace(mappingTe).astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:37.863820Z","iopub.execute_input":"2024-12-21T12:01:37.864216Z","iopub.status.idle":"2024-12-21T12:01:38.047534Z","shell.execute_reply.started":"2024-12-21T12:01:37.864166Z","shell.execute_reply":"2024-12-21T12:01:38.046555Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:38.048736Z","iopub.execute_input":"2024-12-21T12:01:38.049022Z","iopub.status.idle":"2024-12-21T12:01:38.054586Z","shell.execute_reply.started":"2024-12-21T12:01:38.048994Z","shell.execute_reply":"2024-12-21T12:01:38.053539Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model Training and Evaluation\n\n- **Model Types**: Various models are used, including:\n  - **LightGBM**: A gradient-boosting framework known for its speed and efficiency with large datasets.\n  - **XGBoost**: Another powerful gradient-boosting model used for structured data.\n  - **CatBoost**: Optimized for categorical features without the need for extensive preprocessing.\n  - **Voting Regressor**: An ensemble model that combines the predictions of LightGBM, XGBoost, and CatBoost for better accuracy.\n- **Cross-Validation**: Stratified K-Folds cross-validation is employed to split the data into training and validation sets, ensuring balanced class distribution in each fold.\n- **Quadratic Weighted Kappa (QWK)**: The performance of the models is evaluated using QWK, which measures the agreement between predicted and actual values, taking into account the ordinal nature of the target variable.\n- **Threshold Optimization**: The `minimize` function from `scipy.optimize` is used to fine-tune decision thresholds that map continuous predictions to discrete categories (None, Mild, Moderate, Severe).\n","metadata":{}},{"cell_type":"code","source":"def TrainML(model_class, test_data, model_name=\"None\"):\n    X = train.drop(['sii'], axis=1)\n    y = train['sii']\n\n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)\n    \n    train_S = []\n    test_S = []\n    \n    oof_non_rounded = np.zeros(len(y), dtype=float) \n    oof_rounded = np.zeros(len(y), dtype=int) \n    test_preds = np.zeros((len(test_data), n_splits))\n\n    for fold, (train_idx, test_idx) in enumerate(tqdm(SKF.split(X, y), desc=\"Training Folds\", total=n_splits)):\n        X_train, X_val = X.iloc[train_idx], X.iloc[test_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[test_idx] \n        model = clone(model_class)\n        model.fit(X_train, y_train)\n        y_train_pred = model.predict(X_train)\n        y_val_pred = model.predict(X_val)\n        test_pred = model.predict(test_data)\n            \n        oof_non_rounded[test_idx] = y_val_pred\n        y_val_pred_rounded = y_val_pred.round(0).astype(int)\n        oof_rounded[test_idx] = y_val_pred_rounded\n\n        train_kappa = quadratic_weighted_kappa(y_train, y_train_pred.round(0).astype(int))\n        val_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded)\n\n        train_S.append(train_kappa)\n        test_S.append(val_kappa)\n        \n        test_preds[:, fold] = test_pred\n        \n        print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")\n        clear_output(wait=True)\n\n    print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\")\n    print(f\"Mean Validation QWK ---> {np.mean(test_S):.4f}\")\n\n    KappaOPtimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y, oof_non_rounded), \n                              method='Nelder-Mead')\n    assert KappaOPtimizer.success, \"Optimization did not converge.\"\n    \n    oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x)\n    tKappa = quadratic_weighted_kappa(y, oof_tuned)\n\n    print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {tKappa:.3f}{Style.RESET_ALL}\")\n\n    tpm = test_preds.mean(axis=1)\n    tpTuned = threshold_Rounder(tpm, KappaOPtimizer.x)\n    \n    submission = pd.DataFrame({\n        'id': sample['id'],\n        'sii': tpTuned\n    })\n\n    return submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:38.055958Z","iopub.execute_input":"2024-12-21T12:01:38.056244Z","iopub.status.idle":"2024-12-21T12:01:38.069301Z","shell.execute_reply.started":"2024-12-21T12:01:38.056216Z","shell.execute_reply":"2024-12-21T12:01:38.068540Z"},"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\n# Hyperparameter Tuning\n CatBoost Parameters**: Similar tuning is applied for XGBoost and CatBoost, adjusting parameters such as `n_estimators`, `max_depth`, `learning_rate`, `subsample`, and `regularization` terms (`reg_alpha`, `reg_lambda`). These help in controlling overfitting and ensuring the model's robustness.","metadata":{}},{"cell_type":"code","source":"CatBoost_Params = {\n    'learning_rate': 0.05,\n    'depth': 6,\n    'iterations': 200,\n    'l2_leaf_reg': 10,  # Increase this value\n}\nLGB_Params = {\n    'learning_rate': 0.046,\n    'max_depth': 12,\n    'num_leaves': 478,\n    'min_data_in_leaf': 13,\n    'feature_fraction': 0.893,\n    'bagging_fraction': 0.784,\n    'bagging_freq': 4,\n    'lambda_l1': 10,  # Increased from 6.59\n    'lambda_l2': 0.01,  # Increased from 2.68e-06\n\n}\n\n\n# XGBoost parameters\nXGB_Params = {\n    'learning_rate': 0.05,\n    'max_depth': 6,\n    'n_estimators': 200,\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}\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:38.070452Z","iopub.execute_input":"2024-12-21T12:01:38.071238Z","iopub.status.idle":"2024-12-21T12:01:38.082709Z","shell.execute_reply.started":"2024-12-21T12:01:38.071204Z","shell.execute_reply":"2024-12-21T12:01:38.082002Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create model instances\nLight = LGBMRegressor(**LGB_Params,random_state=SEED, n_estimators=200, device='cpu',verbose= -1)\nXGB_Model = XGBRegressor(**XGB_Params,random_state=SEED,tree_method = \"gpu_hist\",verbosity=0)\nCatBoost_Model = CatBoostRegressor(**CatBoost_Params,random_seed=SEED, task_type='GPU',verbose=0 )\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:38.083516Z","iopub.execute_input":"2024-12-21T12:01:38.083814Z","iopub.status.idle":"2024-12-21T12:01:38.094917Z","shell.execute_reply.started":"2024-12-21T12:01:38.083789Z","shell.execute_reply":"2024-12-21T12:01:38.094197Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"---\n# **》》》Model\n---","metadata":{}},{"cell_type":"code","source":"voting_model = VotingRegressor(estimators=[\n    ('lightgbm', Light),\n    ('xgboost', XGB_Model),\n    ('catboost', CatBoost_Model),\n\n],weights=[4.0,4.0,4.0])\n\n\n\nSubmission1 = TrainML(voting_model, test)\n\nSubmission1","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:57.786374Z","iopub.execute_input":"2024-12-21T12:01:57.787366Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub1 = Submission1\nsub1 = sub1.sort_values(by='id').reset_index(drop=True)\n\nfinal_submission = sub1.rename(columns={'final_sii': 'sii'})\n\nfinal_submission.to_csv('submission.csv', index=False)\n\nprint(\"Majority voting completed and saved to 'Final_Submission.csv'\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T12:01:47.892384Z","iopub.execute_input":"2024-12-21T12:01:47.892738Z","iopub.status.idle":"2024-12-21T12:01:47.912482Z","shell.execute_reply.started":"2024-12-21T12:01:47.892699Z","shell.execute_reply":"2024-12-21T12:01:47.911636Z"}},"outputs":[],"execution_count":null}]}