{"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":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install autogluon","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T10:41:05.296505Z","iopub.execute_input":"2024-12-07T10:41:05.296854Z","iopub.status.idle":"2024-12-07T10:42:13.869834Z","shell.execute_reply.started":"2024-12-07T10:41:05.296822Z","shell.execute_reply":"2024-12-07T10:42:13.868333Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"SEED = 42\nn_splits = 5","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T10:42:35.047713Z","iopub.execute_input":"2024-12-07T10:42:35.048145Z","iopub.status.idle":"2024-12-07T10:42:35.053266Z","shell.execute_reply.started":"2024-12-07T10:42:35.048111Z","shell.execute_reply":"2024-12-07T10:42:35.051933Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.impute import KNNImputer\n\n# Đọc dữ liệu từ file CSV\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_submission = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv')\n\n\n# Hàm xử lý feature engineering\ndef feature_engineering(df):\n    # Bỏ cột Season\n    season_cols = [col for col in df.columns if 'Season' in col]\n    df = df.drop(season_cols, axis=1)\n    \n    # Tạo các feature mới\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['ICW_TBW'] = df['BIA-BIA_ICW'] / df['BIA-BIA_TBW']\n    \n    return df\n\n# Áp dụng feature engineering\ntrain = feature_engineering(train)\ntest = feature_engineering(test)\n\nimport numpy as np\n\n# Thay infinity bằng giá trị NaN để xử lý tiếp\n# train.replace([np.inf, -np.inf], np.nan, inplace=True)\n# test.replace([np.inf, -np.inf], np.nan, inplace=True)\n\ntrain = feature_engineering(train)\ntrain = train.dropna(thresh=10, axis=0)\ntest = feature_engineering(test)\n\ntrain = train.drop('id', axis=1)\n#test  = test .drop('id', axis=1)   \n\n\nfeaturesCols = ['Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-CGAS_Score', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Max_Stage',\n                'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                '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',\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-PAQ_A_Total',\n                'PAQ_C-PAQ_C_Total', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T',\n                'PreInt_EduHx-computerinternet_hoursday', 'sii', 'BMI_Age','Internet_Hours_Age','BMI_Internet_Hours',\n                'BFP_BMI', 'FFMI_BFP', 'FMI_BFP', 'LST_TBW', 'BFP_BMR', 'BFP_DEE', 'BMR_Weight', 'DEE_Weight',\n                'SMM_Height', 'Muscle_to_Fat', 'Hydration_Status', 'ICW_TBW']\n\n# Loại bỏ cột `sii` khỏi danh sách cột đặc trưng\nfeaturesCols = [col for col in featuresCols if col != 'sii']\n# Chọn các cột đặc trưng và nhãn mục tiêu\ntrain = train[featuresCols + ['sii']].dropna(subset=['sii'])\n# Loại bỏ 'sii' khỏi danh sách cột khi chọn từ test\ncolumns_to_keep = [col for col in featuresCols if col in test.columns] + ['id']\ntest = test[columns_to_keep]\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T10:42:37.564218Z","iopub.execute_input":"2024-12-07T10:42:37.564733Z","iopub.status.idle":"2024-12-07T10:42:37.670604Z","shell.execute_reply.started":"2024-12-07T10:42:37.564694Z","shell.execute_reply":"2024-12-07T10:42:37.669286Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nfrom sklearn.metrics import confusion_matrix\n\ndef quadratic_weighted_kappa(y_true, y_pred, N=None):\n    \"\"\"\n    Calculate the Quadratic Weighted Kappa (QWK) metric.\n    y_true: Ground truth labels (list or np.array)\n    y_pred: Predicted labels (list or np.array)\n    N: Number of unique classes. If None, inferred from data.\n    \"\"\"\n    if N is None:\n        N = len(np.unique(np.concatenate([y_true, y_pred])))\n    \n    O = confusion_matrix(y_true, y_pred, labels=range(N))  # Confusion matrix\n    \n    # Create weight matrix\n    W = np.zeros((N, N))\n    for i in range(N):\n        for j in range(N):\n            W[i][j] = ((i - j) ** 2) / ((N - 1) ** 2)\n    \n    # Histogram of actual and predicted\n    hist_true = np.histogram(y_true, bins=np.arange(N + 1))[0]\n    hist_pred = np.histogram(y_pred, bins=np.arange(N + 1))[0]\n    \n    # Expected confusion matrix\n    E = np.outer(hist_true, hist_pred)\n    E = E / E.sum()\n    \n    # Normalize O matrix\n    O = O / O.sum()\n    \n    # Calculate QWK\n    numerator = np.sum(W * O)\n    denominator = np.sum(W * E)\n    kappa = 1 - numerator / denominator\n    \n    return kappa\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T10:42:40.291465Z","iopub.execute_input":"2024-12-07T10:42:40.291949Z","iopub.status.idle":"2024-12-07T10:42:40.301336Z","shell.execute_reply.started":"2024-12-07T10:42:40.291911Z","shell.execute_reply":"2024-12-07T10:42:40.300129Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from autogluon.core.metrics import make_scorer\n\n# Định nghĩa QWK scorer cho AutoGluon\nqwk_scorer = make_scorer(\n    name='quadratic_weighted_kappa',\n    score_func=quadratic_weighted_kappa,\n    optimum=1,\n    greater_is_better=True\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T10:42:54.176856Z","iopub.execute_input":"2024-12-07T10:42:54.177316Z","iopub.status.idle":"2024-12-07T10:42:54.182966Z","shell.execute_reply.started":"2024-12-07T10:42:54.177282Z","shell.execute_reply":"2024-12-07T10:42:54.181722Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\nfrom sklearn.base import clone\nfrom scipy.optimize import minimize\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom autogluon.tabular import TabularPredictor\n\n# Tối ưu hóa ngưỡng để cải thiện QWK\ndef evaluate_predictions(thresholds, y_true, y_preds):\n    \"\"\"\n    Evaluate Quadratic Weighted Kappa for given thresholds.\n    \"\"\"\n    y_preds_rounded = threshold_Rounder(y_preds, thresholds)\n    return -quadratic_weighted_kappa(y_true, y_preds_rounded)\n\ndef threshold_Rounder(preds, thresholds):\n    \"\"\"\n    Apply thresholds to round predictions to nearest class.\n    \"\"\"\n    preds_tuned = np.digitize(preds, thresholds)\n    return preds_tuned\n\ndef TrainML_with_AutoGluon(train_data, test_data, n_splits=5, SEED=42):\n    \"\"\"\n    Train with StratifiedKFold and optimize QWK thresholds using AutoGluon.\n    \"\"\"\n    X = train_data.drop(['sii'], axis=1)\n    y = train_data['sii']\n\n    # StratifiedKFold\n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)\n    oof_non_rounded = np.zeros(len(y), dtype=float)\n    test_preds = np.zeros((len(test_data), n_splits))\n\n    for fold, (train_idx, val_idx) in enumerate(tqdm(SKF.split(X, y), desc=\"Training Folds\", total=n_splits)):\n        # Tách train và validation\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        # Huấn luyện AutoGluon cho từng fold\n        predictor = TabularPredictor(label='sii', eval_metric=qwk_scorer).fit(\n            train_data=pd.concat([X_train, y_train], axis=1),\n            tuning_data=pd.concat([X_val, y_val], axis=1),\n            time_limit=3600 // n_splits  # Chia thời gian cho các fold\n        )\n\n        # Dự đoán trên tập validation và test\n        val_preds = predictor.predict(X_val)\n        test_preds[:, fold] = predictor.predict(test_data)\n\n        # Lưu dự đoán không làm tròn\n        oof_non_rounded[val_idx] = val_preds\n\n    # Tối ưu hóa ngưỡng\n    KappaOptimizer = minimize(evaluate_predictions, x0=[0.5, 1.5, 2.5], args=(y, oof_non_rounded), method='Nelder-Mead')\n    assert KappaOptimizer.success, \"Optimization did not converge.\"\n    optimal_thresholds = KappaOptimizer.x\n\n    # Áp dụng ngưỡng tối ưu để làm tròn\n    oof_tuned = threshold_Rounder(oof_non_rounded, optimal_thresholds)\n    tuned_kappa = quadratic_weighted_kappa(y, oof_tuned)\n    print(f\"Optimized QWK Score: {tuned_kappa:.4f}\")\n\n    # Trung bình dự đoán trên các fold và áp dụng ngưỡng tối ưu\n    test_preds_mean = test_preds.mean(axis=1)\n    test_preds_tuned = threshold_Rounder(test_preds_mean, optimal_thresholds)\n\n    # Tạo file submission\n    submission = pd.DataFrame({\n        'id': test_data['id'],\n        'sii': test_preds_tuned\n    })\n\n    return submission, tuned_kappa\n\n# Chạy huấn luyện với dữ liệu\nsubmission, tuned_kappa = TrainML_with_AutoGluon(train, test)\n\n# Lưu file submission\nsubmission.to_csv('/kaggle/working/submission.csv', index=False)\n# print(\"File submission.csv đã được tạo!\")\n\nsubmission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T10:42:56.204315Z","iopub.execute_input":"2024-12-07T10:42:56.204727Z","iopub.status.idle":"2024-12-07T10:49:35.440008Z","shell.execute_reply.started":"2024-12-07T10:42:56.204692Z","shell.execute_reply":"2024-12-07T10:49:35.438856Z"}},"outputs":[],"execution_count":null}]}