{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.11"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":643.005219,"end_time":"2025-05-21T01:32:33.186767","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-05-21T01:21:50.181548","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\nfrom concurrent.futures import ThreadPoolExecutor\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split, StratifiedKFold, cross_val_score\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.compose import ColumnTransformer\nimport warnings\n\nwarnings.filterwarnings('ignore')\n\n","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2025-05-23T05:28:04.705614Z","iopub.execute_input":"2025-05-23T05:28:04.705923Z","iopub.status.idle":"2025-05-23T05:28:04.711784Z","shell.execute_reply.started":"2025-05-23T05:28:04.705905Z","shell.execute_reply":"2025-05-23T05:28:04.710920Z"},"papermill":{"duration":5.095779,"end_time":"2025-05-21T01:22:01.099232","exception":false,"start_time":"2025-05-21T01:21:56.003453","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load data","metadata":{"papermill":{"duration":0.004381,"end_time":"2025-05-21T01:22:01.108838","exception":false,"start_time":"2025-05-21T01:22:01.104457","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"### Load timeseries","metadata":{"papermill":{"duration":0.003963,"end_time":"2025-05-21T01:22:01.117307","exception":false,"start_time":"2025-05-21T01:22:01.113344","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def process_file(filename, dirname):\n    \"\"\"Process a single parquet file and extract time-based features\"\"\"\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    \n    # Drop 'step' column if it exists\n    if 'step' in df.columns:\n        df.drop('step', axis=1, inplace=True)\n    \n    # Convert time_of_day to hours\n    df[\"hours\"] = df[\"time_of_day\"] // (3_600 * 1_000_000_000)\n    \n    # Define time periods\n    night = ((df[\"hours\"] >= 22) | (df[\"hours\"] <= 5))\n    day = ((df[\"hours\"] <= 20) & (df[\"hours\"] >= 7))\n    \n    # Initialize features dictionary\n    features = {}\n    \n    # Basic activity features\n    features['non_wear_mean'] = df[\"non-wear_flag\"].mean()\n    features['active_enmo_sum'] = df[\"enmo\"][df[\"enmo\"] >= 0.05].sum()\n    \n    # Process each column for different time periods\n    for col in ['enmo', 'anglez', 'light', 'battery_voltage']:\n        # Full day statistics\n        features[f\"{col}_mean\"] = df[col].mean()\n        features[f\"{col}_std\"] = df[col].std()\n        features[f\"{col}_max\"] = df[col].max()\n        features[f\"{col}_min\"] = df[col].min()\n        features[f\"{col}_diff_mean\"] = df[col].diff().mean()\n        features[f\"{col}_diff_std\"] = df[col].diff().std()\n        \n        # Night time statistics\n        night_data = df.loc[night, col]\n        features[f\"{col}_night_mean\"] = night_data.mean()\n        features[f\"{col}_night_std\"] = night_data.std()\n        features[f\"{col}_night_max\"] = night_data.max()\n        features[f\"{col}_night_min\"] = night_data.min()\n        \n        # Day time statistics\n        day_data = df.loc[day, col]\n        features[f\"{col}_day_mean\"] = day_data.mean()\n        features[f\"{col}_day_std\"] = day_data.std()\n        features[f\"{col}_day_max\"] = day_data.max()\n        features[f\"{col}_day_min\"] = day_data.min()\n    \n    return features, filename.split('=')[1]\n\ndef load_data_parquet(dirname) -> pd.DataFrame:\n    \"\"\"Load and process time series data from directory in parallel\"\"\"\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    features_list, indexes = zip(*results)\n    \n    # Create DataFrame with extracted features and IDs\n    df = pd.DataFrame(features_list)\n    df['id'] = indexes\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:04.712776Z","iopub.execute_input":"2025-05-23T05:28:04.713068Z","iopub.status.idle":"2025-05-23T05:28:04.724650Z","shell.execute_reply.started":"2025-05-23T05:28:04.713046Z","shell.execute_reply":"2025-05-23T05:28:04.723436Z"},"papermill":{"duration":0.015984,"end_time":"2025-05-21T01:22:01.137272","exception":false,"start_time":"2025-05-21T01:22:01.121288","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Load datasets","metadata":{"papermill":{"duration":0.003637,"end_time":"2025-05-21T01:22:01.144945","exception":false,"start_time":"2025-05-21T01:22:01.141308","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\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# chia thành 3 nhóm features chính (Bộ dữ liệu khách quan csv)\ndemographicFeatures = ['Basic_Demos-Enroll_Season', 'Basic_Demos-Age', 'Basic_Demos-Sex']\n\nseasonFeatures = ['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', 'PCIAT-Season']\n\ntrain_ts = load_data_parquet('/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet')\ntest_ts = load_data_parquet('/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","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:04.725627Z","iopub.execute_input":"2025-05-23T05:28:04.725845Z","iopub.status.idle":"2025-05-23T05:28:49.795000Z","shell.execute_reply.started":"2025-05-23T05:28:04.725831Z","shell.execute_reply":"2025-05-23T05:28:49.794205Z"},"papermill":{"duration":44.833231,"end_time":"2025-05-21T01:22:45.982195","exception":false,"start_time":"2025-05-21T01:22:01.148964","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Overview datasets","metadata":{"papermill":{"duration":0.010717,"end_time":"2025-05-21T01:22:46.005111","exception":false,"start_time":"2025-05-21T01:22:45.994394","status":"completed"},"tags":[]}},{"cell_type":"code","source":"print(train.shape)\nprint(test.shape)\n","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.796875Z","iopub.execute_input":"2025-05-23T05:28:49.797101Z","iopub.status.idle":"2025-05-23T05:28:49.801521Z","shell.execute_reply.started":"2025-05-23T05:28:49.797083Z","shell.execute_reply":"2025-05-23T05:28:49.800769Z"},"papermill":{"duration":0.016358,"end_time":"2025-05-21T01:22:46.032282","exception":false,"start_time":"2025-05-21T01:22:46.015924","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(set(train.columns) - set(test.columns))","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.802122Z","iopub.execute_input":"2025-05-23T05:28:49.802351Z","iopub.status.idle":"2025-05-23T05:28:49.816189Z","shell.execute_reply.started":"2025-05-23T05:28:49.802336Z","shell.execute_reply":"2025-05-23T05:28:49.815353Z"},"papermill":{"duration":0.015834,"end_time":"2025-05-21T01:22:46.059340","exception":false,"start_time":"2025-05-21T01:22:46.043506","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"columns_not_in_test = sorted(list(set(train.columns) - set(test.columns)))\n\ncolumns_to_exclude = ['PCIAT-PCIAT_Total', 'PCIAT-Season', 'sii']\nquestion_columns = [\n    col for col in columns_not_in_test if col not in columns_to_exclude\n]\n\nquestion_columns","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.816826Z","iopub.execute_input":"2025-05-23T05:28:49.817077Z","iopub.status.idle":"2025-05-23T05:28:49.829800Z","shell.execute_reply.started":"2025-05-23T05:28:49.817056Z","shell.execute_reply":"2025-05-23T05:28:49.828940Z"},"papermill":{"duration":0.018203,"end_time":"2025-05-21T01:22:46.088590","exception":false,"start_time":"2025-05-21T01:22:46.070387","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"na_total_rows = train[train['sii'].isna()]\nna_total_rows","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.830736Z","iopub.execute_input":"2025-05-23T05:28:49.830973Z","iopub.status.idle":"2025-05-23T05:28:49.861455Z","shell.execute_reply.started":"2025-05-23T05:28:49.830957Z","shell.execute_reply":"2025-05-23T05:28:49.860669Z"},"papermill":{"duration":0.042365,"end_time":"2025-05-21T01:22:46.142336","exception":false,"start_time":"2025-05-21T01:22:46.099971","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train.dropna(subset=['PCIAT-PCIAT_Total'])\ntrain","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.862245Z","iopub.execute_input":"2025-05-23T05:28:49.862627Z","iopub.status.idle":"2025-05-23T05:28:49.890254Z","shell.execute_reply.started":"2025-05-23T05:28:49.862601Z","shell.execute_reply":"2025-05-23T05:28:49.889592Z"},"papermill":{"duration":0.03672,"end_time":"2025-05-21T01:22:46.192926","exception":false,"start_time":"2025-05-21T01:22:46.156206","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Data Cleanning","metadata":{"papermill":{"duration":0.012805,"end_time":"2025-05-21T01:22:46.220134","exception":false,"start_time":"2025-05-21T01:22:46.207329","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"#### Height - Weight","metadata":{"papermill":{"duration":0.011967,"end_time":"2025-05-21T01:22:46.244204","exception":false,"start_time":"2025-05-21T01:22:46.232237","status":"completed"},"tags":[]}},{"cell_type":"code","source":"wh_cols = [\n    'Physical-BMI', 'Physical-Height',\n    'Physical-Weight', 'Physical-Waist_Circumference'\n]\n\ntrain[wh_cols] = train[wh_cols].replace(0, np.nan)\ntest[wh_cols] = test[wh_cols].replace(0, np.nan)\ntrain[wh_cols].describe()","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.892554Z","iopub.execute_input":"2025-05-23T05:28:49.892932Z","iopub.status.idle":"2025-05-23T05:28:49.915664Z","shell.execute_reply.started":"2025-05-23T05:28:49.892917Z","shell.execute_reply":"2025-05-23T05:28:49.915103Z"},"papermill":{"duration":0.035973,"end_time":"2025-05-21T01:22:46.292672","exception":false,"start_time":"2025-05-21T01:22:46.256699","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"object_columns = train.select_dtypes(include='object').columns\nprint(\"Các cột kiểu object:\")\nprint(object_columns)\n","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.916333Z","iopub.execute_input":"2025-05-23T05:28:49.916589Z","iopub.status.idle":"2025-05-23T05:28:49.921739Z","shell.execute_reply.started":"2025-05-23T05:28:49.916563Z","shell.execute_reply":"2025-05-23T05:28:49.920893Z"},"papermill":{"duration":0.018094,"end_time":"2025-05-21T01:22:46.323065","exception":false,"start_time":"2025-05-21T01:22:46.304971","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### BIA","metadata":{"papermill":{"duration":0.012031,"end_time":"2025-05-21T01:22:46.347337","exception":false,"start_time":"2025-05-21T01:22:46.335306","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Danh sách các cột thuộc nhóm BIA\nbia_cols = [\n    'BIA-BIA_BMC', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n    'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_ICW', 'BIA-BIA_LDM',\n    'BIA-BIA_LST', 'BIA-BIA_SMM', 'BIA-BIA_TBW'\n]\n# Các thuộc tính nhóm này không thể là âm => Replace bằng NaN\n\nprint(\"\\n======== Trước khi Replace ========\")\nprint(\"\\nTập train:\")\nprint((train[bia_cols] < 0).sum())\nprint(\"\\nTập test:\")\nprint((test[bia_cols] < 0).sum())\n\ntrain[bia_cols] = train[bia_cols].applymap(lambda x: np.nan if x < 0 else x)\n# Tập test ko có nên ko cần replace\n\n# Kiểm tra lại sau khi Replace\nprint(\"\\n======== Sau khi Replace ========\")\nprint(\"\\nTập train:\")\nprint((train[bia_cols] < 0).sum())","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.922542Z","iopub.execute_input":"2025-05-23T05:28:49.922733Z","iopub.status.idle":"2025-05-23T05:28:49.952678Z","shell.execute_reply.started":"2025-05-23T05:28:49.922702Z","shell.execute_reply":"2025-05-23T05:28:49.952157Z"},"papermill":{"duration":0.037333,"end_time":"2025-05-21T01:22:46.396932","exception":false,"start_time":"2025-05-21T01:22:46.359599","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def cleaning_features(df):\n    # Xóa các dữ liệu bị sai lệch lớn (vô lý)\n    \n    # % mỡ cơ thể\n    df['BIA-BIA_Fat'] = np.where(df['BIA-BIA_Fat'] < 5, np.nan, df['BIA-BIA_Fat'])\n    df['BIA-BIA_Fat'] = np.where(df['BIA-BIA_Fat'] > 60, np.nan, df['BIA-BIA_Fat'])\n    # Bone Mineral Content (Khối lượng khoáng trong xương) (kg)\n    df['BIA-BIA_BMC'] = np.where(df['BIA-BIA_BMC'] < 0.5, np.nan, df['BIA-BIA_BMC'])\n    df['BIA-BIA_BMC'] = np.where(df['BIA-BIA_BMC'] > 5, np.nan, df['BIA-BIA_BMC'])\n    # Body Mass Index (chỉ số khối cơ thể)\n    df['BIA-BIA_BMI'] = np.where(df['BIA-BIA_BMI'] < 10, np.nan, df['BIA-BIA_BMI'])\n    df['BIA-BIA_BMI'] = np.where(df['BIA-BIA_BMI'] > 40, np.nan, df['BIA-BIA_BMI'])\n    # Basal Metabolic Rate (kcal/ngày)\n    df['BIA-BIA_BMR'] = np.where(df['BIA-BIA_BMR'] < 600, np.nan, df['BIA-BIA_BMR'])\n    df['BIA-BIA_BMR'] = np.where(df['BIA-BIA_BMR'] > 3000, np.nan, df['BIA-BIA_BMR'])\n    # Daily Energy Expenditure (kcal/ngày)\n    df['BIA-BIA_DEE'] = np.where(df['BIA-BIA_DEE'] < 800, np.nan, df['BIA-BIA_DEE'])\n    df['BIA-BIA_DEE'] = np.where(df['BIA-BIA_DEE'] > 5000, np.nan, df['BIA-BIA_DEE'])\n    # Extracellular Water – Nước ngoài tế bào (L)\n    df['BIA-BIA_ECW'] = np.where(df['BIA-BIA_ECW'] < 3, np.nan, df['BIA-BIA_ECW'])\n    df['BIA-BIA_ECW'] = np.where(df['BIA-BIA_ECW'] > 15, np.nan, df['BIA-BIA_ECW'])\n    # Fat-Free Mass – Khối lượng không mỡ (kg)\n    df['BIA-BIA_FFM'] = np.where(df['BIA-BIA_FFM'] < 10, np.nan, df['BIA-BIA_FFM'])\n    df['BIA-BIA_FFM'] = np.where(df['BIA-BIA_FFM'] > 60, np.nan, df['BIA-BIA_FFM'])\n    # Fat-Free Mass Index\n    df['BIA-BIA_FFMI'] = np.where(df['BIA-BIA_FFMI'] < 8, np.nan, df['BIA-BIA_FFMI'])\n    df['BIA-BIA_FFMI'] = np.where(df['BIA-BIA_FFMI'] > 25, np.nan, df['BIA-BIA_FFMI'])\n    # Fat Mass Index\n    df['BIA-BIA_FMI'] = np.where(df['BIA-BIA_FMI'] < 1, np.nan, df['BIA-BIA_FMI'])\n    df['BIA-BIA_FMI'] = np.where(df['BIA-BIA_FMI'] > 15, np.nan, df['BIA-BIA_FMI'])\n    # Intracellular Water – Nước trong tế bào (L)\n    df['BIA-BIA_ICW'] = np.where(df['BIA-BIA_ICW'] < 5, np.nan, df['BIA-BIA_ICW'])\n    df['BIA-BIA_ICW'] = np.where(df['BIA-BIA_ICW'] > 20, np.nan, df['BIA-BIA_ICW'])\n    # Lean Dry Mass – Khối lượng nạc không nước (kg)\n    df['BIA-BIA_LDM'] = np.where(df['BIA-BIA_LDM'] < 5, np.nan, df['BIA-BIA_LDM'])\n    df['BIA-BIA_LDM'] = np.where(df['BIA-BIA_LDM'] > 40, np.nan, df['BIA-BIA_LDM'])\n    # Lean Soft Tissue – Mô mềm không mỡ (kg)\n    df['BIA-BIA_LST'] = np.where(df['BIA-BIA_LST'] < 10, np.nan, df['BIA-BIA_LST'])\n    df['BIA-BIA_LST'] = np.where(df['BIA-BIA_LST'] > 55, np.nan, df['BIA-BIA_LST'])\n    # Skeletal Muscle Mass – Khối cơ xương (kg)\n    df['BIA-BIA_SMM'] = np.where(df['BIA-BIA_SMM'] < 5, np.nan, df['BIA-BIA_SMM'])\n    df['BIA-BIA_SMM'] = np.where(df['BIA-BIA_SMM'] > 40, np.nan, df['BIA-BIA_SMM'])\n    # Total Body Water – Tổng lượng nước trong cơ thể (L)\n    df['BIA-BIA_TBW'] = np.where(df['BIA-BIA_TBW'] < 10, np.nan, df['BIA-BIA_TBW'])\n    df['BIA-BIA_TBW'] = np.where(df['BIA-BIA_TBW'] > 40, np.nan, df['BIA-BIA_TBW'])\n\n    return df\n\ntrain = cleaning_features(train)\ntest = cleaning_features(test)","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.953310Z","iopub.execute_input":"2025-05-23T05:28:49.953661Z","iopub.status.idle":"2025-05-23T05:28:49.979791Z","shell.execute_reply.started":"2025-05-23T05:28:49.953638Z","shell.execute_reply":"2025-05-23T05:28:49.979202Z"},"papermill":{"duration":0.036064,"end_time":"2025-05-21T01:22:46.487322","exception":false,"start_time":"2025-05-21T01:22:46.451258","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Feature Engineering","metadata":{"papermill":{"duration":0.011872,"end_time":"2025-05-21T01:22:46.511316","exception":false,"start_time":"2025-05-21T01:22:46.499444","status":"completed"},"tags":[]}},{"cell_type":"code","source":"train = train.drop(columns=question_columns, errors='ignore')\ntrain = train.drop(columns=seasonFeatures, errors='ignore')\ntest = test.drop(columns=seasonFeatures, errors='ignore')\ntrain = train.drop(columns='PCIAT-PCIAT_Total', errors='ignore')","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.980674Z","iopub.execute_input":"2025-05-23T05:28:49.980910Z","iopub.status.idle":"2025-05-23T05:28:49.990914Z","shell.execute_reply.started":"2025-05-23T05:28:49.980893Z","shell.execute_reply":"2025-05-23T05:28:49.990202Z"},"papermill":{"duration":0.02217,"end_time":"2025-05-21T01:22:46.545523","exception":false,"start_time":"2025-05-21T01:22:46.523353","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfiltered_features = train.drop(columns=['id', 'sii'])  \n\n# Chuẩn bị dữ liệu X và y\nX = filtered_features\ny = train['sii']               \n\n# Định nghĩa pipeline xử lý dữ liệu số\nnum_transformer = Pipeline(steps=[\n    ('imputer', KNNImputer(n_neighbors=3)),\n    ('scaler', StandardScaler())\n])\n\n# Định nghĩa ColumnTransformer để áp dụng pipeline cho các cột số\npreprocessor = ColumnTransformer(transformers=[\n    ('num', num_transformer, filtered_features.columns.tolist())\n])\n\n# Fit và transform X\npreprocessor.fit(X)\nX_transformed = pd.DataFrame(preprocessor.transform(X), columns=filtered_features.columns)\n\n# Kiểm tra các dòng đầu tiên của dữ liệu đã transform\nprint(\"Transformed X DataFrame:\")\nprint(X_transformed.head())","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:49.991754Z","iopub.execute_input":"2025-05-23T05:28:49.992270Z","iopub.status.idle":"2025-05-23T05:28:59.857694Z","shell.execute_reply.started":"2025-05-23T05:28:49.992245Z","shell.execute_reply":"2025-05-23T05:28:59.856854Z"},"papermill":{"duration":9.265213,"end_time":"2025-05-21T01:22:55.822908","exception":false,"start_time":"2025-05-21T01:22:46.557695","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Split dataset","metadata":{"papermill":{"duration":0.01199,"end_time":"2025-05-21T01:22:55.848345","exception":false,"start_time":"2025-05-21T01:22:55.836355","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_val, y_train, y_val = train_test_split(X_transformed, y, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:59.858513Z","iopub.execute_input":"2025-05-23T05:28:59.858790Z","iopub.status.idle":"2025-05-23T05:28:59.865723Z","shell.execute_reply.started":"2025-05-23T05:28:59.858760Z","shell.execute_reply":"2025-05-23T05:28:59.864839Z"},"papermill":{"duration":0.019854,"end_time":"2025-05-21T01:22:55.880279","exception":false,"start_time":"2025-05-21T01:22:55.860425","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Hyparameter","metadata":{"papermill":{"duration":0.011997,"end_time":"2025-05-21T01:22:55.904419","exception":false,"start_time":"2025-05-21T01:22:55.892422","status":"completed"},"tags":[]}},{"cell_type":"code","source":"seed = 2023\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-23T05:28:59.866732Z","iopub.execute_input":"2025-05-23T05:28:59.867030Z","iopub.status.idle":"2025-05-23T05:28:59.878803Z","shell.execute_reply.started":"2025-05-23T05:28:59.866999Z","shell.execute_reply":"2025-05-23T05:28:59.878180Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"LGB_Param = {\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,\n    'lambda_l2': 0.01\n}\n\n\nXGBoost_Param = {\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,  \n    'reg_lambda': 3,  \n    'random_state': seed,\n}\n\nXGBoost_Param.update({\n    'learning_rate': 0.01,\n    'max_depth': 5,\n    'n_estimators': 500,\n    'reg_alpha': 5,\n    'reg_lambda': 10,\n})\n\nCatBoost_Param = {\n    'learning_rate': 0.05,\n        'depth': 6,\n        'iterations': 200,\n        'random_seed': seed,\n        'verbose': 0,\n        'l2_leaf_reg': 10,\n}\n\n\nGradientBoost_Param = {\n    'n_estimators': 204,\n    'learning_rate': 0.03055022094677994,\n    'max_depth': 7,\n    'min_samples_split': 20,\n    'min_samples_leaf': 18,\n    'subsample': 0.8363079223697193,\n    'max_features': 'log2'\n}","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:28:59.879552Z","iopub.execute_input":"2025-05-23T05:28:59.879774Z","iopub.status.idle":"2025-05-23T05:28:59.891257Z","shell.execute_reply.started":"2025-05-23T05:28:59.879750Z","shell.execute_reply":"2025-05-23T05:28:59.890651Z"},"papermill":{"duration":0.019894,"end_time":"2025-05-21T01:22:55.936563","exception":false,"start_time":"2025-05-21T01:22:55.916669","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Train Model","metadata":{"papermill":{"duration":0.012383,"end_time":"2025-05-21T01:22:55.961262","exception":false,"start_time":"2025-05-21T01:22:55.948879","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nfrom sklearn.metrics import cohen_kappa_score, make_scorer\nfrom sklearn.model_selection import cross_val_score, StratifiedKFold\nfrom sklearn.ensemble import (\n    RandomForestRegressor,\n    GradientBoostingRegressor, \n    AdaBoostRegressor,\n    ExtraTreesRegressor,\n    BaggingRegressor,\n    StackingRegressor,\n    VotingRegressor\n)\nfrom lightgbm import LGBMRegressor\nfrom catboost import CatBoostRegressor\nfrom xgboost import XGBRegressor\nfrom scipy.optimize import minimize\n\n# Cấu hình\nseed = 2023\nnp.random.seed(seed)\nwarnings.filterwarnings(\"ignore\")\n\n# Khởi tạo các mô hình Regressor\nLGB_Model = LGBMRegressor(**LGB_Param,random_state=seed, verbose=-1)\nCatBoost_Model = CatBoostRegressor(**CatBoost_Param)\nXGB_Model = XGBRegressor(**XGBoost_Param)\n\n# Hàm tính Quadratic Weighted Kappa\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred.round().astype(int), weights='quadratic')\n\n# Hàm tối ưu Threshold Rounding\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\n# Tạo mô hình StackingRegressor\nstacking_model = StackingRegressor(\n    estimators=[\n        ('lgb', LGB_Model),\n        ('cat', CatBoost_Model),\n        ('xgb', XGB_Model)\n    ]\n)","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:33:11.937534Z","iopub.execute_input":"2025-05-23T05:33:11.938301Z","iopub.status.idle":"2025-05-23T05:33:11.945891Z","shell.execute_reply.started":"2025-05-23T05:33:11.938278Z","shell.execute_reply":"2025-05-23T05:33:11.945124Z"},"papermill":{"duration":7.286389,"end_time":"2025-05-21T01:23:03.259699","exception":false,"start_time":"2025-05-21T01:22:55.973310","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Submit","metadata":{"papermill":{"duration":0.01304,"end_time":"2025-05-21T01:23:03.285774","exception":false,"start_time":"2025-05-21T01:23:03.272734","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Preprocess the test data\nX_test = test.drop(columns=['id'])\nX_test = pd.DataFrame(preprocessor.transform(X_test), columns=filtered_features.columns)\n\n# Train mô hình StackingRegressor\nbest_model = StackingRegressor(\n    estimators=[\n        ('lgb', LGB_Model),\n        ('cat', CatBoost_Model),\n        ('xgb', XGB_Model)\n    ],\n    #final_estimator=GradientBoostingRegressor(**GradientBoost_Param, random_state=seed)  # Meta-model\n)\n\n#best_model = GradientBoostingRegressor(**GradientBoost_Param, random_state=seed)\n\nbest_model.fit(X_train, y_train)\n\n# Dự đoán trên tập test\ny_test_pred = best_model.predict(X_test)\n\n# Tối ưu hóa threshold để làm tròn\nKappaOptimizer = minimize(\n    evaluate_predictions,\n    x0=[0.5, 1.5, 2.5], args=(y_train, best_model.predict(X_train)),\n    method='Nelder-Mead'\n)\noptimized_thresholds = KappaOptimizer.x\n\n# Làm tròn kết quả về nhãn classification\ny_test_pred_rounded = threshold_Rounder(y_test_pred, optimized_thresholds)\n\n# Tạo file submission\nsubmission = pd.DataFrame({\n    'id': test['id'],\n    'sii': y_test_pred_rounded\n})\nsubmission.to_csv('submission.csv', index=False)\n\n# Load và kiểm tra kết quả\nsubmiss = pd.read_csv('submission.csv')\nprint(submiss)\nprint(\"✅ Submission file created successfully.\")  # In ra thông báo khi hoàn thành","metadata":{"execution":{"iopub.status.busy":"2025-05-23T05:33:13.868690Z","iopub.execute_input":"2025-05-23T05:33:13.868971Z","iopub.status.idle":"2025-05-23T05:33:50.015953Z","shell.execute_reply.started":"2025-05-23T05:33:13.868951Z","shell.execute_reply":"2025-05-23T05:33:50.015309Z"},"papermill":{"duration":568.815742,"end_time":"2025-05-21T01:32:32.113955","exception":false,"start_time":"2025-05-21T01:23:03.298213","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.01674,"end_time":"2025-05-21T01:32:32.149909","exception":false,"start_time":"2025-05-21T01:32:32.133169","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null}]}