{"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":"gpu","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30786,"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\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\n\n\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\nfrom sklearn.pipeline import Pipeline\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\n\nSEED = 42\nn_splits = 5\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-12-20T01:19:03.555657Z","iopub.execute_input":"2024-12-20T01:19:03.555902Z","iopub.status.idle":"2024-12-20T01:19:20.125585Z","shell.execute_reply.started":"2024-12-20T01:19:03.555876Z","shell.execute_reply":"2024-12-20T01:19:20.124852Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Paths to datasets\ntrain_csv_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\"\ntest_csv_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/test.csv\"\nsubmission_csv_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv\"\ntrain_parquet_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\"\ntest_parquet_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\"\n\n# Basic demographics and general info features\nbasic_demo_features = [\n    'Basic_Demos-Enroll_Season', \n    'Basic_Demos-Age', \n    'Basic_Demos-Sex'\n]\n\n# CGAS features\ncgas_features = [\n    'CGAS-Season', \n    'CGAS-CGAS_Score'\n]\n\n# Physical characteristics and health metrics\nphysical_features = [\n    'Physical-Season', \n    'Physical-BMI', \n    'Physical-Height', \n    'Physical-Weight', \n    'Physical-Waist_Circumference', \n    'Physical-Diastolic_BP', \n    'Physical-HeartRate', \n    'Physical-Systolic_BP'\n]\n\n# Fitness Endurance Test results\nfitness_endurance_features = [\n    'Fitness_Endurance-Season', \n    'Fitness_Endurance-Max_Stage', \n    'Fitness_Endurance-Time_Mins', \n    'Fitness_Endurance-Time_Sec'\n]\n\n# FGC-related features\nfgc_features = [\n    'FGC-Season', \n    'FGC-FGC_CU', \n    'FGC-FGC_CU_Zone', \n    'FGC-FGC_GSND', \n    'FGC-FGC_GSND_Zone', \n    'FGC-FGC_GSD', \n    'FGC-FGC_GSD_Zone', \n    'FGC-FGC_PU', \n    'FGC-FGC_PU_Zone', \n    'FGC-FGC_SRL', \n    'FGC-FGC_SRL_Zone', \n    'FGC-FGC_SRR', \n    'FGC-FGC_SRR_Zone', \n    'FGC-FGC_TL', \n    'FGC-FGC_TL_Zone'\n]\n\n# Body Impedance Analysis (BIA) features\nbia_features = [\n    'BIA-Season', \n    'BIA-BIA_Activity_Level_num', \n    'BIA-BIA_BMC', \n    'BIA-BIA_BMI', \n    'BIA-BIA_BMR', \n    'BIA-BIA_DEE', \n    'BIA-BIA_ECW', \n    'BIA-BIA_FFM', \n    'BIA-BIA_FFMI', \n    'BIA-BIA_FMI', \n    'BIA-BIA_Fat', \n    'BIA-BIA_Frame_num', \n    'BIA-BIA_ICW', \n    'BIA-BIA_LDM', \n    'BIA-BIA_LST', \n    'BIA-BIA_SMM', \n    'BIA-BIA_TBW'\n]\n\n# Physical Activity Questionnaire (PAQ) features\npaq_features = [\n    'PAQ_A-Season', \n    'PAQ_A-PAQ_A_Total', \n    'PAQ_C-Season', \n    'PAQ_C-PAQ_C_Total'\n]\n\n# SDS (Self-rating Depression Scale) features\nsds_features = [\n    'SDS-Season', \n    'SDS-SDS_Total_Raw', \n    'SDS-SDS_Total_T'\n]\n\n# Pre-intervention Education History features\npreint_eduhx_features = [\n    'PreInt_EduHx-Season', \n    'PreInt_EduHx-computerinternet_hoursday'\n]\n\n# Final list of selected features including 'sii'\nselected_features = basic_demo_features + cgas_features + physical_features + \\\n                    fitness_endurance_features + fgc_features + bia_features + \\\n                    paq_features + sds_features + preint_eduhx_features + ['sii']\n","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:19:20.127321Z","iopub.execute_input":"2024-12-20T01:19:20.127901Z","iopub.status.idle":"2024-12-20T01:19:20.135529Z","shell.execute_reply.started":"2024-12-20T01:19:20.127873Z","shell.execute_reply":"2024-12-20T01:19:20.134588Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def read_parquet_file(file_name, directory):\n    \"\"\"Loads a single parquet file and reshapes the data.\"\"\"\n    file_path = os.path.join(directory, file_name, 'part-0.parquet')\n    data_frame = pd.read_parquet(file_path)\n    data_frame.drop('step', axis=1, inplace=True)\n    reshaped_data = data_frame.describe().values.reshape(-1)\n    file_id = file_name.split('=')[1]\n    return reshaped_data, file_id\n\n\ndef load_time_series_data(directory) -> pd.DataFrame:\n    \"\"\"Loads and processes all time series data from a directory.\"\"\"\n    file_ids = os.listdir(directory)\n    with ThreadPoolExecutor() as executor:\n        results = list(tqdm(executor.map(lambda f: read_parquet_file(f, directory), file_ids), total=len(file_ids)))\n    \n    stats, ids = zip(*results)\n    time_series_df = pd.DataFrame(stats, columns=[f\"stat_{i}\" for i in range(len(stats[0]))])\n    time_series_df['id'] = ids\n    return time_series_df\n\n\ndef build_deep_autoencoder(input_dimension, encoding_dimension):\n    \"\"\"Builds and compiles a deep autoencoder model.\"\"\"\n    input_layer = Input(shape=(input_dimension,))\n    hidden_layer_1 = Dense(encoding_dimension * 3, activation='relu')(input_layer)\n    hidden_layer_2 = Dense(encoding_dimension * 2, activation='relu')(hidden_layer_1)\n    encoded_layer = Dense(encoding_dimension, activation='relu')(hidden_layer_2)\n    decoded_layer = Dense(input_dimension, activation='sigmoid')(encoded_layer)\n    \n    autoencoder_model = Model(inputs=input_layer, outputs=decoded_layer)\n    encoder_model = Model(inputs=input_layer, outputs=encoded_layer)\n    \n    autoencoder_model.compile(optimizer=Adam(), loss='mse')\n    \n    return autoencoder_model, encoder_model\n\n\ndef apply_autoencoder(time_series_df, encoding_dim=50, num_epochs=50, batch_size=32):\n    \"\"\"Applies the autoencoder to time series data for dimensionality reduction.\"\"\"\n    scaler = StandardScaler()\n    scaled_data = scaler.fit_transform(time_series_df)\n    input_dim = scaled_data.shape[1]\n    \n    autoencoder, encoder = build_deep_autoencoder(input_dim, encoding_dim)\n    \n    autoencoder.fit(scaled_data, scaled_data, epochs=num_epochs, batch_size=batch_size, shuffle=True, verbose=1)\n    \n    encoded_data = encoder.predict(scaled_data)\n    \n    encoded_df = pd.DataFrame(encoded_data, columns=[f'Enc_{i+1}' for i in range(encoded_data.shape[1])])\n    \n    return encoded_df\n","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:19:20.136659Z","iopub.execute_input":"2024-12-20T01:19:20.136987Z","iopub.status.idle":"2024-12-20T01:19:20.156266Z","shell.execute_reply.started":"2024-12-20T01:19:20.136951Z","shell.execute_reply":"2024-12-20T01:19:20.155460Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load data from CSV files\ntrain_df = pd.read_csv(train_csv_path)\ntest_df = pd.read_csv(test_csv_path)\nsample_submission = pd.read_csv(submission_csv_path)\n\n# Load time series data\ntrain_time_series = load_time_series_data(train_parquet_path)\ntest_time_series  = load_time_series_data(test_parquet_path)\n\n# Prepare dataframes for autoencoder\ntrain_time_series_data = train_time_series.drop('id', axis=1)\ntest_time_series_data  = test_time_series.drop('id', axis=1)\n\n# Display sample data\ndisplay(train_time_series.head(5)) \n\n# Encode time series data using autoencoder\nencoded_train_time_series = apply_autoencoder(train_time_series_data, encoding_dim=96, num_epochs=100, batch_size=32)\nencoded_test_time_series  = apply_autoencoder(test_time_series_data, encoding_dim=96, num_epochs=100, batch_size=32)\n\n# Display encoded time series data\ndisplay(encoded_train_time_series.head(5))\n\n# Prepare column names and merge encoded data with the original dataframe\nencoded_columns = encoded_train_time_series.columns.tolist()\nencoded_train_time_series['id'] = train_time_series['id']\n\n# Merge encoded time series features with train and test datasets\ntrain_df = pd.merge(train_df, encoded_train_time_series, how=\"left\", on='id')\ntest_df  = pd.merge(test_df,  encoded_train_time_series, how=\"left\", on='id')\ntest_df_merged = pd.merge(test_df,  test_time_series, how='left', on='id')\n\n# Drop 'id' columns as they are no longer needed\ntrain_df = train_df.drop('id', axis=1)\ntest_df  = test_df.drop('id', axis=1)\n\n# Add time series features to the list of feature columns\nfeature_columns = selected_features + encoded_columns\n\n# Select relevant columns and handle missing values\ntrain_df = train_df[feature_columns]\ntrain_df = train_df.dropna(subset=['sii'])\n\n# Define categorical columns\ncategorical_columns = [\n    '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","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:19:20.157682Z","iopub.execute_input":"2024-12-20T01:19:20.158000Z","iopub.status.idle":"2024-12-20T01:21:58.041349Z","shell.execute_reply.started":"2024-12-20T01:19:20.157965Z","shell.execute_reply":"2024-12-20T01:21:58.040689Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def fill_and_convert_to_category(df, categorical_columns):\n    #\"\"\"Fills missing values with 'Missing' and converts specified columns to categorical.\"\"\"\n    for column in categorical_columns: \n        df[column] = df[column].fillna('Missing').astype('category')\n    return df\n        \n# Update train and test datasets\ntrain_df = fill_and_convert_to_category(train_df, categorical_columns)\ntest_df = fill_and_convert_to_category(test_df, categorical_columns)\n\ndef generate_category_mapping(column, data):\n    #\"\"\"Generates a mapping of unique categorical values to integer indices.\"\"\"\n    unique_values = data[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\n\n# Apply mapping to convert categorical columns to integer values\nfor column in categorical_columns:\n    train_mapping = generate_category_mapping(column, train_df)\n    test_mapping = generate_category_mapping(column, test_df)\n    \n    train_df[column] = train_df[column].replace(train_mapping).astype(int)\n    test_df[column] = test_df[column].replace(test_mapping).astype(int)\n\ndef quadratic_weighted_kappa_score(y_true, y_pred):\n    #\"\"\"Calculates the quadratic weighted kappa score.\"\"\"\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef round_predictions_by_thresholds(predictions, thresholds):\n    #\"\"\"Rounds predictions based on the specified thresholds.\"\"\"\n    return np.where(predictions < thresholds[0], 0,\n                    np.where(predictions < thresholds[1], 1,\n                             np.where(predictions < thresholds[2], 2, 3)))\n\ndef evaluate_model_predictions(thresholds, true_labels, raw_predictions):\n    #\"\"\"Evaluates model predictions using quadratic weighted kappa score.\"\"\"\n    rounded_predictions = round_predictions_by_thresholds(raw_predictions, thresholds)\n    return -quadratic_weighted_kappa_score(true_labels, rounded_predictions)\n","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:21:58.042339Z","iopub.execute_input":"2024-12-20T01:21:58.042617Z","iopub.status.idle":"2024-12-20T01:21:58.098496Z","shell.execute_reply.started":"2024-12-20T01:21:58.042592Z","shell.execute_reply":"2024-12-20T01:21:58.097811Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_and_evaluate_model(model, test_data):\n    \"\"\"Trains a model using Stratified K-Folds and evaluates using QWK score, with test predictions.\"\"\"\n    X_train = train_df.drop(columns=['sii'])\n    y_train = train_df['sii']\n\n    skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)\n    \n    train_kappa_scores = []\n    val_kappa_scores = []\n    \n    oof_raw_predictions = np.zeros(len(y_train), dtype=float) \n    oof_rounded_predictions = np.zeros(len(y_train), dtype=int) \n    test_predictions = np.zeros((len(test_data), n_splits))\n\n    for fold, (train_idx, val_idx) in enumerate(tqdm(skf.split(X_train, y_train), desc=\"Training Folds\", total=n_splits)):\n        X_fold_train, X_fold_val = X_train.iloc[train_idx], X_train.iloc[val_idx]\n        y_fold_train, y_fold_val = y_train.iloc[train_idx], y_train.iloc[val_idx]\n\n        model_copy = clone(model)\n        model_copy.fit(X_fold_train, y_fold_train)\n\n        y_train_pred = model_copy.predict(X_fold_train)\n        y_val_pred = model_copy.predict(X_fold_val)\n\n        oof_raw_predictions[val_idx] = y_val_pred\n        y_val_pred_rounded = y_val_pred.round(0).astype(int)\n        oof_rounded_predictions[val_idx] = y_val_pred_rounded\n\n        train_qwk = quadratic_weighted_kappa_score(y_fold_train, y_train_pred.round(0).astype(int))\n        val_qwk = quadratic_weighted_kappa_score(y_fold_val, y_val_pred_rounded)\n\n        train_kappa_scores.append(train_qwk)\n        val_kappa_scores.append(val_qwk)\n        \n        test_predictions[:, fold] = model_copy.predict(test_data)\n        \n        print(f\"Fold {fold+1} - Train QWK: {train_qwk:.4f}, Validation QWK: {val_qwk:.4f}\")\n        clear_output(wait=True)\n\n    print(f\"Mean Train QWK --> {np.mean(train_kappa_scores):.4f}\")\n    print(f\"Mean Validation QWK ---> {np.mean(val_kappa_scores):.4f}\")\n\n    # Optimizing thresholds for best QWK\n    threshold_optimizer = minimize(evaluate_model_predictions,\n                                   x0=[0.5, 1.5, 2.5], \n                                   args=(y_train, oof_raw_predictions), \n                                   method='Nelder-Mead')\n    \n    assert threshold_optimizer.success, \"Threshold optimization did not converge.\"\n\n    oof_tuned_predictions = round_predictions_by_thresholds(oof_raw_predictions, threshold_optimizer.x)\n    final_qwk = quadratic_weighted_kappa_score(y_train, oof_tuned_predictions)\n\n    print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {final_qwk:.3f}{Style.RESET_ALL}\")\n\n    # Averaging test predictions across folds and applying optimized thresholds\n    mean_test_predictions = test_predictions.mean(axis=1)\n    final_test_predictions = round_predictions_by_thresholds(mean_test_predictions, threshold_optimizer.x)\n    \n    # Preparing submission file\n    submission = pd.DataFrame({\n        'id': sample_submission['id'],\n        'sii': final_test_predictions\n    })\n\n    return submission\n","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:21:58.101503Z","iopub.execute_input":"2024-12-20T01:21:58.101736Z","iopub.status.idle":"2024-12-20T01:21:58.111350Z","shell.execute_reply.started":"2024-12-20T01:21:58.101712Z","shell.execute_reply":"2024-12-20T01:21:58.110595Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lgbm_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,  # L1 regularization strength\n    'lambda_l2': 0.01  # L2 regularization strength\n}\n\n\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,  # L1 regularization\n    'reg_lambda': 5,  # L2 regularization\n    'random_state': SEED,\n    'tree_method': 'exact'\n}\n\n\ncatboost_params = {\n    'learning_rate': 0.05,\n    'depth': 6,\n    'iterations': 200,\n    'random_seed': SEED,\n    'cat_features': categorical_columns,  # Renamed to be more descriptive\n    'verbose': 0,\n    'l2_leaf_reg': 10  # L2 regularization strength\n}\n","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:21:58.112474Z","iopub.execute_input":"2024-12-20T01:21:58.113256Z","iopub.status.idle":"2024-12-20T01:21:58.125056Z","shell.execute_reply.started":"2024-12-20T01:21:58.113214Z","shell.execute_reply":"2024-12-20T01:21:58.124407Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create model instances with descriptive names\nlightgbm_model = LGBMRegressor(**lgbm_params, random_state=SEED, verbose=-1, n_estimators=300)\nxgboost_model = XGBRegressor(**xgb_params)\ncatboost_model = CatBoostRegressor(**catboost_params)\n\n# Combine models using Voting Regressor with clearer naming\nensemble_model = VotingRegressor(estimators=[\n    ('lightgbm', lightgbm_model),\n    ('xgboost', xgboost_model),\n    ('catboost', catboost_model)\n])\n","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:21:58.125974Z","iopub.execute_input":"2024-12-20T01:21:58.126208Z","iopub.status.idle":"2024-12-20T01:21:58.138002Z","shell.execute_reply.started":"2024-12-20T01:21:58.126179Z","shell.execute_reply":"2024-12-20T01:21:58.137068Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Submission1 = train_and_evaluate_model(ensemble_model, test_df)\n\n#Submission1.to_csv('submission.csv', index=False)\n\nSubmission1","metadata":{"execution":{"iopub.status.busy":"2024-12-20T01:21:58.138946Z","iopub.execute_input":"2024-12-20T01:21:58.139210Z","iopub.status.idle":"2024-12-20T01:22:51.116492Z","shell.execute_reply.started":"2024-12-20T01:21:58.139179Z","shell.execute_reply":"2024-12-20T01:22:51.115616Z"},"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\ndef 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        \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\ntime_series_cols = train_ts.columns.tolist()\ntime_series_cols.remove(\"id\")\n\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')\n\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)   \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\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\ndef 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)\n\ndef create_mapping(column, dataset):\n    unique_values = dataset[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\n\nfor col in cat_c:\n    mapping = create_mapping(col, train)\n    mappingTe = create_mapping(col, test)\n    \n    train[col] = train[col].replace(mapping).astype(int)\n    test[col] = test[col].replace(mappingTe).astype(int)\n\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)\n\ndef TrainML(model_class, 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.49, 2.5], args=(y, oof_non_rounded), \n                              method='Nelder-Mead')\n    assert KappaOPtimizer.success, \"Optimization did not converge.\"\n    thresholds = KappaOPtimizer.x\n    \n    oof_tuned = threshold_Rounder(oof_non_rounded, thresholds)\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    fold_weights = [1.25, 1.0, 1.0, 1.0, 1.0]\n    tpm = test_preds.dot(fold_weights) / np.sum(fold_weights)\n    tpTuned = threshold_Rounder(tpm, thresholds)\n    \n    submission = pd.DataFrame({\n        'id': sample['id'],\n        'sii': tpTuned\n    })\n\n    return submission\n\n# Model parameters for LightGBM\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}\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}\n\n\nCatBoost_Params = {\n    'learning_rate': 0.05,\n    'depth': 6,\n    'iterations': 200,\n    'random_seed': SEED,\n    'cat_features': cat_c,\n    'verbose': 0,\n    'l2_leaf_reg': 10  # Increase this value\n}\n\n# Create model instances\nLight = LGBMRegressor(**Params, random_state=SEED, verbose=-1, n_estimators=300)\nXGB_Model = XGBRegressor(**XGB_Params)\nCatBoost_Model = CatBoostRegressor(**CatBoost_Params)\n\n# Combine models using Voting Regressor\nvoting_model = VotingRegressor(estimators=[\n    ('lightgbm', Light),\n    ('xgboost', XGB_Model),\n    ('catboost', CatBoost_Model)\n])\n\n# Train the ensemble model\nSubmission2 = TrainML(voting_model, test)\n\n# Save submission\n#Submission2.to_csv('submission.csv', index=False)\nSubmission2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T01:22:51.117983Z","iopub.execute_input":"2024-12-20T01:22:51.118345Z","iopub.status.idle":"2024-12-20T01:24:52.507562Z","shell.execute_reply.started":"2024-12-20T01:22:51.118306Z","shell.execute_reply":"2024-12-20T01:24:52.506685Z"}},"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\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\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\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\ntime_series_cols = train_ts.columns.tolist()\ntime_series_cols.remove(\"id\")\n\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')\n\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)\n\nfeaturesCols += time_series_cols\n\ntrain = train[featuresCols]\ntrain = train.dropna(subset='sii')\n\ndef 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)\n\ndef create_mapping(column, dataset):\n    unique_values = dataset[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\n\nfor col in cat_c:\n    mapping = create_mapping(col, train)\n    mappingTe = create_mapping(col, test)\n    \n    train[col] = train[col].replace(mapping).astype(int)\n    test[col] = test[col].replace(mappingTe).astype(int)\n\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)\n\ndef TrainML(model_class, 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    thresholds = KappaOPtimizer.x\n    \n    oof_tuned = threshold_Rounder(oof_non_rounded, thresholds)\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    tp_rounded = threshold_Rounder(tpm, thresholds)\n\n    return tp_rounded\n\nimputer = SimpleImputer(strategy='median')\n\nensemble = VotingRegressor(estimators=[\n    ('lgb', Pipeline(steps=[('imputer', imputer), ('regressor', LGBMRegressor(random_state=SEED))])),\n    ('xgb', Pipeline(steps=[('imputer', imputer), ('regressor', XGBRegressor(random_state=SEED))])),\n    ('cat', Pipeline(steps=[('imputer', imputer), ('regressor', CatBoostRegressor(random_state=SEED, silent=True))])),\n    ('rf', Pipeline(steps=[('imputer', imputer), ('regressor', RandomForestRegressor(random_state=SEED))])),\n    ('gb', Pipeline(steps=[('imputer', imputer), ('regressor', GradientBoostingRegressor(random_state=SEED))]))\n])\n\nSubmission3 = TrainML(ensemble, test)\nSubmission3 = pd.DataFrame({\n    'id': sample['id'],\n    'sii': Submission3\n})\n\nSubmission3","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T01:24:52.508708Z","iopub.execute_input":"2024-12-20T01:24:52.508974Z","iopub.status.idle":"2024-12-20T01:28:01.638366Z","shell.execute_reply.started":"2024-12-20T01:24:52.508949Z","shell.execute_reply":"2024-12-20T01:28:01.637563Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score, accuracy_score\nfrom sklearn.ensemble import VotingClassifier\nfrom sklearn.base import clone\nfrom sklearn.preprocessing import LabelBinarizer\nfrom lightgbm import LGBMClassifier\nfrom xgboost import XGBClassifier\nfrom catboost import CatBoostClassifier\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nfrom scipy.optimize import minimize\nfrom colorama import Fore, Style\nfrom IPython.display import clear_output\nfrom sklearn.metrics import precision_score\n\n# Load data\ntrain = 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\n# Helper function to process parquet files\ndef 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\n# Load time series data\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        \ntrain_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\n\n# Merge time series data\ntime_series_cols = train_ts.columns.tolist()\ntime_series_cols.remove(\"id\")\n\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')\n\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)   \n\n# Feature selection\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']\n\nfeaturesCols += time_series_cols\n\ntrain = train[featuresCols + ['sii']]\ntrain['sii'] = (train['sii'] == 2).astype(int)  # Convert to binary: 1 if sii == 2, else 0\n\n# Handle categorical columns\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\ndef 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)\n\n# Encode categorical variables\nfor col in cat_c:\n    train[col] = train[col].cat.codes\n    test[col] = test[col].cat.codes\n\n# Evaluation metric\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\n# Model training and evaluation with Precision Score\ndef TrainBinary(model_class, test_data):\n    X = train.drop(['sii'], axis=1)\n    y = train['sii']\n\n    SKF = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n    \n    oof_preds = np.zeros(len(y), dtype=float)\n    test_preds = np.zeros((len(test_data), 5))\n    fold_precisions = []\n\n    for fold, (train_idx, val_idx) in enumerate(SKF.split(X, y)):\n        X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n\n        model = clone(model_class)\n        model.fit(X_train, y_train)\n\n        oof_preds[val_idx] = model.predict_proba(X_val)[:, 1]\n        test_preds[:, fold] = model.predict_proba(test_data)[:, 1]\n        \n        # Calculate metrics\n        val_preds_binary = (oof_preds[val_idx] > 0.7).astype(int)\n        val_accuracy = accuracy_score(y_val, val_preds_binary)\n        val_precision = precision_score(y_val, val_preds_binary, pos_label=1)\n        fold_precisions.append(val_precision)\n\n        print(f\"Fold {fold+1} Accuracy: {val_accuracy:.4f}, Precision: {val_precision:.4f}\")\n\n    mean_accuracy = accuracy_score(y, (oof_preds > 0.7).astype(int))\n    mean_precision = np.mean(fold_precisions)\n    \n    print(f\"Mean Validation Accuracy: {mean_accuracy:.4f}\")\n    print(f\"Mean Validation Precision: {mean_precision:.4f}\")\n\n    # Test predictions\n    test_preds_mean = test_preds.mean(axis=1)\n    submission = pd.DataFrame({\n        'id': sample['id'],\n        'sii': (test_preds_mean > 0.7).astype(int)\n    })\n\n    return submission\n\n# Model parameters for LightGBM\nParams = {\n    'learning_rate': 0.05,\n    'max_depth': 6,\n    'n_estimators': 300,\n    'random_state': 42\n}\n\nLight = LGBMClassifier(**Params)\nXGB_Model = XGBClassifier(**Params)\nCatBoost_Model = CatBoostClassifier(**Params)\n\nvoting_model = VotingClassifier(estimators=[\n    ('lightgbm', Light),\n    ('xgboost', XGB_Model),\n    ('catboost', CatBoost_Model)\n], voting='soft')\n\n# Train the ensemble model\nSubmission4 = TrainBinary(voting_model, test)\n\n# Save submission\n# submission.to_csv('submission.csv', index=False)\nSubmission4","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T01:28:01.639573Z","iopub.execute_input":"2024-12-20T01:28:01.639865Z","iopub.status.idle":"2024-12-20T01:30:01.033596Z","shell.execute_reply.started":"2024-12-20T01:28:01.639838Z","shell.execute_reply":"2024-12-20T01:30:01.032635Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub1 = Submission1\nsub2 = Submission2\nsub3 = Submission3\nsub4 = Submission4\n\nsub1 = sub1.sort_values(by='id').reset_index(drop=True)\nsub2 = sub2.sort_values(by='id').reset_index(drop=True)\nsub3 = sub3.sort_values(by='id').reset_index(drop=True)\nsub4 = sub4.sort_values(by='id').reset_index(drop=True)\n\ncombined = pd.DataFrame({\n    'id': sub1['id'],\n    'sii_1': sub1['sii'],\n    'sii_2': sub2['sii'],\n    'sii_3': sub3['sii'],\n    'sii_4': sub4['sii']\n})\n\ndef majority_vote(row):\n    if row['sii_4'] == 1:\n        return 2\n    else:\n        mode_values = row[['sii_1', 'sii_2', 'sii_3']].mode()\n        if len(mode_values) > 1:\n            return row['sii_1']\n        return mode_values[0]\n\n# Áp dụng apply trên toàn bộ DataFrame\ncombined['final_sii'] = combined.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)\n\nprint(\"Majority voting completed and saved to 'submission.csv'\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T01:30:01.034724Z","iopub.execute_input":"2024-12-20T01:30:01.034987Z","iopub.status.idle":"2024-12-20T01:30:01.059066Z","shell.execute_reply.started":"2024-12-20T01:30:01.034960Z","shell.execute_reply":"2024-12-20T01:30:01.058203Z"}},"outputs":[],"execution_count":null}]}