{"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"},{"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":"# The third model from the notebook [Prem Chotepanit - CMI| Tuning | Ensemble of solutions - 0.497](https://www.kaggle.com/code/batprem/cmi-tuning-ensemble-of-solutions)","metadata":{}},{"cell_type":"code","source":"import os\nimport gc\nimport abc\nimport enum\nimport datetime\nimport time\nimport copy\nimport random\nimport numpy as np\nimport pandas as pd\nfrom pathlib import Path\nfrom collections import OrderedDict, defaultdict\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\n\nfrom IPython import get_ipython\nfrom IPython.display import clear_output\n\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.optim import lr_scheduler\n#from pytorch_tabnet.tab_model import TabNetRegressor\n#from pytorch_tabnet.callbacks import Callback\n\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\n\nfrom scipy.optimize import minimize\nfrom sklearn.base import clone, BaseEstimator, RegressorMixin\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.model_selection import KFold, StratifiedKFold, train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.ensemble import VotingRegressor, RandomForestRegressor, GradientBoostingRegressor\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.pipeline import Pipeline\n\nfrom colorama import Fore, Back, Style\nb_ = Fore.BLUE\nsr_ = Style.RESET_ALL\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\npd.options.display.max_columns = None\n#pd.options.display.max_rows = None\n\n@enum.unique\nclass RunModeEnum(enum.IntEnum):\n    Train = 0\n    Infer = 1\n\n@enum.unique\nclass DataEnum(enum.IntEnum):\n    Train = 0\n    Valid = 1\n    Test = 2\n    Infer = 3\n\nclass APP:\n    version = None\n    debug = False\n    run_mode = RunModeEnum.Train\n    short_dataset = False\n    test_full_dataset = False\n    check_inference = True  # False\n    three_phase = False\n    used_gateway_server = False\n    used_gpu = True    \n    gpu_float_64 = False # True    \n    parallel_gpu = False\n    disable_gpu_tf = False\n    disable_cpu_tf = False    \n    kaggle = os.environ.get(\"KAGGLE_KERNEL_RUN_TYPE\", \"\") != \"\"\n    submit = os.environ.get('KAGGLE_IS_COMPETITION_RERUN', \"\") != \"\"\n    local = os.environ.get(\"DOCKER_USING\", \"\") == \"LOCAL\"\n    try:\n        interactive = 'runtime' in get_ipython().config.IPKernelApp.connection_file\n    except Exception as inst:\n        print(\"Error interactive:\", inst)\n        interactive = False\n    jupyter = \"ipykernel\" in globals()\n    if not jupyter:\n        try:\n            if \"IPython\" in globals().get(\"__doc__\", \"\"):\n                jupyter = True\n        except Exception as inst:\n            print(\"Error IPython:\", inst)\n    if submit:\n        debug = False\n        short_dataset = False\n        test_full_dataset = False\n        check_inference = False\n        run_mode = RunModeEnum.Infer\n    if debug:\n        num_workers = 0\n        # For descriptive error messages\n        os.environ['CUDA_LAUNCH_BLOCKING'] = \"1\"\n        os.environ['TORCH_USE_CUDA_DSA'] = \"1\"\n        os.environ['MKL_NUM_THREADS'] = '1' \n        os.environ['OPENBLAS_NUM_THREADS'] = '1'\n        os.environ[\"NUM_INTER_THREADS\"] = \"1\"\n        os.environ[\"NUM_INTRA_THREADS\"] = \"1\"\n        os.environ[\"XLA_FLAGS\"] = (\"--xla_cpu_multi_thread_eigen=false \"\n                                   \"intra_op_parallelism_threads=1\")        \n        #tf.config.threading.set_inter_op_parallelism_threads(1)\n        #tf.config.threading.set_intra_op_parallelism_threads(1)\n    else:\n        num_workers = os.cpu_count()\n        #parallel_gpu = True\n    if kaggle:\n        #parallel_gpu = True\n        # GPU_DEVICES = \"auto\"\n        pass\n    device = torch.device(\"cuda\")\n    device_0 = torch.device(\"cuda:0\")\n    gpu_count = torch.cuda.device_count()\n    if parallel_gpu and gpu_count > 1:\n        num_gpu_process = gpu_count\n        device_1 = torch.device(\"cuda:1\")\n        os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0,1\"\n        num_workers //= 2\n    else:\n        num_gpu_process = 1\n        device_1 = device_0\n        os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n    if debug:\n        print(f\"{Back.CYAN}mode: DEBUG!{sr_}\")\n    print(f\"jupyter:{jupyter}, kaggle:{kaggle}, local:{local}, submit:{submit}, interactive:{interactive}, gpu_count:{gpu_count}\")\n    if torch.cuda.is_available():\n        print(\"[INFO] Using GPU: {}\\n\".format(torch.cuda.get_device_name()))\n    do_cross_val_score = not submit\n\n    date_time_start = datetime.datetime.now()\n    dt_start_ymd_hms = date_time_start.strftime(\"%Y.%m.%d_%H-%M-%S\")\n\n    file_run_path = Path(\"\")\n    if jupyter:\n        try:\n            file_run_path = Path(globals().get(\"__vsc_ipynb_file__\", \"\"))\n            print(f\"file_run_path globals:{file_run_path}\")\n        except Exception as inst:\n            print('file_run_path globals:',inst)\n    else:\n        try:\n            file_run_path = Path(__file__)\n            print(f\"file_run_path:{file_run_path}\")\n        except Exception as inst:\n            print('file_run_path:',inst)\n    file_run_name = file_run_path.stem\n    if version is None:\n        version = file_run_name.split(' ')[0]\n    path_app = file_run_path.parent\n    path_run = Path(os.getcwd())\n    log_dir = (version + \"_\" if version.strip() else \"\") + \"weights_\" + dt_start_ymd_hms\n    path_out = Path(\"/kaggle/working\") if kaggle else path_app / log_dir\n    output_dir = \"/kaggle/working\" if kaggle else \".\"\n    if not os.path.exists(path_out):\n        os.makedirs(path_out)\n    path_log = f\"{output_dir}/{log_dir}\"\n    if not os.path.exists(path_log):\n        os.makedirs(path_log)\n    path_model = f\"{output_dir}/{log_dir}\"\n    if not os.path.exists(path_model):\n        os.makedirs(path_model)\n    path_root = Path('/kaggle/input')\n    print(f\"path_app: {path_app}\")\n    print(f\"path_run: {path_run}\")\n    print(f\"log_dir: {log_dir}\")\n    print(f\"path_out: {path_out}\")\n    print(f\"path_log: {path_log}\")\n    print(f\"path_model: {path_model}\")\n\n!cat /etc/os-release | grep -oP \"PRETTY_NAME=\\\"\\K([^\\\"]*)\" && uname -r\nprint(f\"CONTAINER_NAME={os.environ['CONTAINER_NAME']}, BUILD_DATE={os.environ['BUILD_DATE']}\")\n!free -h\n!nv_version=\"$(nvidia-smi --query-gpu=driver_version --format=csv,noheader)\" && echo \"My NVIDIA driver version is '${nv_version}'.\"\n!ls -l /usr/local | grep cuda\n\nSEED = 42\nn_splits = 5\n\ndef seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False  # True\nseed_everything(2024)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:51:14.219129Z","iopub.execute_input":"2024-12-12T19:51:14.219486Z","iopub.status.idle":"2024-12-12T19:51:22.282936Z","shell.execute_reply.started":"2024-12-12T19:51:14.219459Z","shell.execute_reply":"2024-12-12T19:51:22.281940Z"}},"outputs":[],"execution_count":null},{"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    with ThreadPoolExecutor() as executor:\n        results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n    stats, indexes = zip(*results)    \n    df = pd.DataFrame(stats, columns=[f\"stat_{i}\" for i in range(len(stats[0]))])\n    df['id'] = indexes\n    return df\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 = 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')\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    \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    tp_rounded = threshold_Rounder(tpm, KappaOPtimizer.x)\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    #('tabnet', Pipeline(steps=[('imputer', imputer), ('regressor', TabNetWrapper(**TabNet_Params))])),\n    #('odt',    Pipeline(steps=[('imputer', imputer), ('regressor', ObliqueDecisionTreeRegressor(**ODT_Params))])),\n])\n\nSubmission3 = TrainML(ensemble, test)\n\nSubmission3 = pd.DataFrame({\n    'id': sample['id'],\n    'sii': Submission3\n})\nSubmission3.to_csv('submission.csv', index=False)\ndisplay(Submission3)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T19:51:22.284913Z","iopub.execute_input":"2024-12-12T19:51:22.285953Z","iopub.status.idle":"2024-12-12T19:54:36.523712Z","shell.execute_reply.started":"2024-12-12T19:51:22.285916Z","shell.execute_reply":"2024-12-12T19:54:36.522844Z"}},"outputs":[],"execution_count":null}]}