{"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":30776,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import 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\nfrom scipy.stats import mode\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 lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom sklearn.ensemble import VotingRegressor, RandomForestRegressor, GradientBoostingRegressor\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.pipeline import Pipeline\nimport lightgbm as lgb\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None","metadata":{"execution":{"iopub.status.busy":"2025-01-19T14:56:59.921883Z","iopub.execute_input":"2025-01-19T14:56:59.922272Z","iopub.status.idle":"2025-01-19T14:56:59.932994Z","shell.execute_reply.started":"2025-01-19T14:56:59.922237Z","shell.execute_reply":"2025-01-19T14:56:59.931768Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"SEED = 42\nn_splits = 5","metadata":{"execution":{"iopub.status.busy":"2025-01-19T14:56:59.935208Z","iopub.execute_input":"2025-01-19T14:56:59.936205Z","iopub.status.idle":"2025-01-19T14:56:59.951743Z","shell.execute_reply.started":"2025-01-19T14:56:59.936155Z","shell.execute_reply":"2025-01-19T14:56:59.950646Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Feature Engineering\n\n- **Feature Selection**: The dataset contains features related to physical characteristics (e.g., BMI, Height, Weight), behavioral aspects (e.g., internet usage), and fitness data (e.g., endurance time). \n- **Categorical Feature Encoding**: Categorical features are mapped to numerical values using custom mappings for each unique category within the dataset. This ensures compatibility with machine learning algorithms that require numerical input.\n- **Time Series Aggregation**: Time series statistics (e.g., mean, standard deviation) from the actigraphy data are computed and merged into the main dataset to create additional features for model training.\n","metadata":{}},{"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]\n\ndef 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    return df\n\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\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['BMI_PHR'] = df['Physical-BMI'] * df['Physical-HeartRate']    \n    return df\n\ndef update(df, 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\n\n#Tạo một dictionary ánh xạ mỗi giá trị duy nhất trong cột thành một số nguyên.\ndef create_mapping(column, dataset):\n    unique_values = dataset[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\n\n\ndef process_string_data(train, test, cat_c):\n            \n    train = update(train, cat_c)\n    test = update(test, cat_c)\n    \n    for col in cat_c:\n        mapping = create_mapping(col, train)\n        mappingTe = create_mapping(col, test)\n        \n        train[col] = train[col].cat.rename_categories(mapping).astype(int)\n        test[col] = test[col].cat.rename_categories(mappingTe).astype(int)\n\n    return train, test","metadata":{"execution":{"iopub.status.busy":"2025-01-19T14:56:59.953451Z","iopub.execute_input":"2025-01-19T14:56:59.953812Z","iopub.status.idle":"2025-01-19T14:56:59.981871Z","shell.execute_reply.started":"2025-01-19T14:56:59.953779Z","shell.execute_reply":"2025-01-19T14:56:59.980727Z"},"trusted":true},"outputs":[],"execution_count":null},{"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')\n\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\ndf_train = train_ts.drop('id', axis=1)\ndf_test = test_ts.drop('id', axis=1)\n\ntrain_ts_encoded = perform_autoencoder(df_train, encoding_dim=60, epochs=100, batch_size=32)\ntest_ts_encoded = perform_autoencoder(df_test, 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\"]\n\ntrain = pd.merge(train, train_ts_encoded, how=\"left\", on='id')\ntest = pd.merge(test, test_ts_encoded, how=\"left\", on='id')\n\n#train.replace([np.inf, -np.inf], np.nan, inplace=True)\n#test.replace([np.inf, -np.inf], np.nan, inplace=True)\n\nimputer = KNNImputer(n_neighbors=6)\n\nnumeric_cols_train = train.select_dtypes(include=['int32', 'int64', 'float64']).columns\nnumeric_cols_test = test.select_dtypes(include=['int32', 'int64', 'float64']).columns\n\nimputed_train_data = imputer.fit_transform(train[numeric_cols_train])\nimputed_test_data = imputer.fit_transform(test[numeric_cols_test])\n\ntrain_imputed = pd.DataFrame(imputed_train_data, columns=numeric_cols_train)\ntest_imputed = pd.DataFrame(imputed_test_data, columns=numeric_cols_test)\ntrain_imputed['sii'] = train_imputed['sii'].round().astype(int)\nfor col in train.columns:\n    if col not in numeric_cols_train:\n        train_imputed[col] = train[col]\n\nfor col in test.columns:\n    if col not in numeric_cols_test:\n        test_imputed[col] = test[col]\n\n#train = train_imputed\n#test = test_imputed\n\n#train = feature_engineering(train)\n#train = train.dropna(thresh=10, axis=0)\n#test = feature_engineering(test)\n\n\nfeaturesCols = ['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', 'sii']\n\nfeaturesCols+= time_series_cols\n    \ntrain = train[featuresCols]\ntrain = train.dropna(subset='sii')\n    \n## xửa lí các feature string\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'] # các cột có dạng string\ntrain, test = process_string_data(train, test, cat_c)","metadata":{"execution":{"iopub.status.busy":"2025-01-19T14:57:00.095455Z","iopub.execute_input":"2025-01-19T14:57:00.095944Z","iopub.status.idle":"2025-01-19T14:58:47.678473Z","shell.execute_reply.started":"2025-01-19T14:57:00.095891Z","shell.execute_reply":"2025-01-19T14:58:47.677608Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = test.drop('id', axis=1)\ntest","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:58:47.680407Z","iopub.execute_input":"2025-01-19T14:58:47.680717Z","iopub.status.idle":"2025-01-19T14:58:47.831099Z","shell.execute_reply.started":"2025-01-19T14:58:47.680687Z","shell.execute_reply":"2025-01-19T14:58:47.829848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:58:47.832379Z","iopub.execute_input":"2025-01-19T14:58:47.832700Z","iopub.status.idle":"2025-01-19T14:58:47.839229Z","shell.execute_reply.started":"2025-01-19T14:58:47.832669Z","shell.execute_reply":"2025-01-19T14:58:47.837960Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## code model here\nCatBoost_Params = {\n    'learning_rate': 0.05,\n    'depth': 6,\n    'iterations': 200,\n    'random_seed': SEED,\n    'verbose': 0,\n    'l2_leaf_reg': 10,  # Increase this value\n    'task_type': 'GPU'\n}\n\ncat_boost_model = CatBoostRegressor(**CatBoost_Params)\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    'random_state': SEED,\n    'tree_method': 'gpu_hist',\n}\n\nXGB_Model = XGBRegressor(**XGB_Params)\n\n### LGBMRegressor\nParams = {\n    'learning_rate': 0.046,\n    'max_depth': 12,\n    'num_leaves': 478,\n    'min_data_in_leaf': 13,\n    'feature_fraction': 0.893,\n    'bagging_fraction': 0.784,\n    'bagging_freq': 4,\n    'lambda_l1': 10,  # Increased from 6.59\n    'lambda_l2': 0.01,  # Increased from 2.68e-06\n    'device': 'gpu'\n\n}\nLight = lgb.LGBMRegressor(**Params, verbose=-1, n_estimators=200, random_state=SEED)\n\nRF_Params = {\n    'n_estimators': 200,\n    'max_depth': 10,\n    'min_samples_split': 2,\n    'min_samples_leaf': 1,\n    'random_state': SEED,\n    'n_jobs': -1,  # Dùng tất cả các luồng CPU có sẵn để huấn luyện\n}\n\nRF_Model = RandomForestRegressor(**RF_Params)\n\nvoting_model = VotingRegressor(estimators=[\n    ('lightgbm', Light),\n    ('xgboost', XGB_Model),\n    ('catboost', cat_boost_model)\n])\n### \nimputer = SimpleImputer(strategy='median')\n\nensemble = VotingRegressor(estimators=[\n    ('lgb', Pipeline(steps=[ ('regressor', Light)])),\n    ('xgb', Pipeline(steps=[ ('regressor', XGB_Model)])),\n    ('cat', Pipeline(steps=[ ('regressor', cat_boost_model)])),\n    ('rf', Pipeline(steps=[('imputer', imputer), ('regressor', RF_Model)])),\n    ('gb', Pipeline(steps=[('imputer', imputer), ('regressor', GradientBoostingRegressor(random_state=SEED))]))\n])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:58:47.840557Z","iopub.execute_input":"2025-01-19T14:58:47.840869Z","iopub.status.idle":"2025-01-19T14:58:47.854672Z","shell.execute_reply.started":"2025-01-19T14:58:47.840839Z","shell.execute_reply":"2025-01-19T14:58:47.853777Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def TrainML(train, sample, model_class, test_data):\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\n        model = clone(model_class)\n        model.fit(X_train, y_train)\n\n        y_train_pred = model.predict(X_train)\n        y_val_pred = model.predict(X_val)\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] = model.predict(test_data)\n        \n        print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")\n        clear_output(wait=True)\n\n    print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\")\n    print(f\"Mean Validation QWK ---> {np.mean(test_S):.4f}\")\n\n    KappaOPtimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y, 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":"2025-01-19T14:58:47.856780Z","iopub.execute_input":"2025-01-19T14:58:47.857088Z","iopub.status.idle":"2025-01-19T14:58:47.869153Z","shell.execute_reply.started":"2025-01-19T14:58:47.857058Z","shell.execute_reply":"2025-01-19T14:58:47.868195Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_Light_1 = TrainML(train, sample, Light, test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:58:47.870444Z","iopub.execute_input":"2025-01-19T14:58:47.871029Z","iopub.status.idle":"2025-01-19T14:58:56.318894Z","shell.execute_reply.started":"2025-01-19T14:58:47.870984Z","shell.execute_reply":"2025-01-19T14:58:56.318078Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_cat_boost_model_1 = TrainML(train, sample, cat_boost_model, test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:58:56.320616Z","iopub.execute_input":"2025-01-19T14:58:56.321356Z","iopub.status.idle":"2025-01-19T14:59:06.973380Z","shell.execute_reply.started":"2025-01-19T14:58:56.321307Z","shell.execute_reply":"2025-01-19T14:59:06.972367Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_XGB_Model_1 = TrainML(train, sample, XGB_Model, test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:59:06.974820Z","iopub.execute_input":"2025-01-19T14:59:06.975475Z","iopub.status.idle":"2025-01-19T14:59:11.891112Z","shell.execute_reply.started":"2025-01-19T14:59:06.975427Z","shell.execute_reply":"2025-01-19T14:59:11.890030Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_voting_model_1 = TrainML(train, sample,voting_model, test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:59:11.892543Z","iopub.execute_input":"2025-01-19T14:59:11.893323Z","iopub.status.idle":"2025-01-19T14:59:35.938856Z","shell.execute_reply.started":"2025-01-19T14:59:11.893273Z","shell.execute_reply":"2025-01-19T14:59:35.937950Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub_voting_model_2 = TrainML(train, sample, ensemble,test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T14:59:35.940229Z","iopub.execute_input":"2025-01-19T14:59:35.940547Z","iopub.status.idle":"2025-01-19T15:00:35.019438Z","shell.execute_reply.started":"2025-01-19T14:59:35.940518Z","shell.execute_reply":"2025-01-19T15:00:35.018339Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub1 = sub_Light_1.sort_values(by='id').reset_index(drop=True)\nsub2 = sub_cat_boost_model_1.sort_values(by='id').reset_index(drop=True)\nsub3 = sub_voting_model_2.sort_values(by='id').reset_index(drop=True)\nsub4 = sub_XGB_Model_1.sort_values(by='id').reset_index(drop=True)\nsub5 = sub_voting_model_1.sort_values(by='id').reset_index(drop=True)\ncombined = pd.DataFrame({\n    'id': sub3['id'],\n    'sii_1': sub1['sii'],\n    'sii_2': sub2['sii'],\n    'sii_3': sub3['sii'],\n    'sii_4': sub4['sii'],\n    'sii_5': sub5['sii'],\n})\n\n#def majority_vote(row):\n#    return row.mode()[0] if len(row.mode()) == 1 else row.mean().round().astype(int)\n\ndef majority_vote(row):\n    mode_result = mode(row)\n    mode_values = mode_result.mode\n    mode_count = mode_result.count\n    mode_values = np.atleast_1d(mode_values)\n    if len(mode_values) == 1:\n        return mode_values[0]\n    else:\n        unique_modes = pd.Series(row).value_counts().index.tolist()\n        sorted_modes = sorted(unique_modes)\n        median_mode_index = len(sorted_modes) // 2\n        if len(sorted_modes) % 2 == 1:\n            return sorted_modes[median_mode_index]\n        else:\n            middle_mode = (sorted_modes[median_mode_index - 1] + sorted_modes[median_mode_index]) / 2\n            return middle_mode\n\n\ncombined['final_sii'] = combined[['sii_1','sii_2','sii_3','sii_4','sii_5']].apply(majority_vote, axis=1)\n\nfinal_submission = combined[['id', 'final_sii']].rename(columns={'final_sii': 'sii'})\n\nfinal_submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T15:00:35.020981Z","iopub.execute_input":"2025-01-19T15:00:35.021376Z","iopub.status.idle":"2025-01-19T15:00:35.053401Z","shell.execute_reply.started":"2025-01-19T15:00:35.021339Z","shell.execute_reply":"2025-01-19T15:00:35.052349Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T15:00:35.054880Z","iopub.execute_input":"2025-01-19T15:00:35.055606Z","iopub.status.idle":"2025-01-19T15:00:35.066040Z","shell.execute_reply.started":"2025-01-19T15:00:35.055557Z","shell.execute_reply":"2025-01-19T15:00:35.064672Z"}},"outputs":[],"execution_count":null}]}