{"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":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.302081Z","iopub.status.idle":"2024-12-07T06:29:38.302688Z","shell.execute_reply.started":"2024-12-07T06:29:38.302397Z","shell.execute_reply":"2024-12-07T06:29:38.302427Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nfrom sklearn.preprocessing import LabelEncoder\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom tqdm import tqdm\nfrom sklearn.metrics import cohen_kappa_score\nimport lightgbm as lgb\n\nimport warnings\nwarnings.simplefilter(\"ignore\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.304786Z","iopub.status.idle":"2024-12-07T06:29:38.305406Z","shell.execute_reply.started":"2024-12-07T06:29:38.305114Z","shell.execute_reply":"2024-12-07T06:29:38.305144Z"}},"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')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.306625Z","iopub.status.idle":"2024-12-07T06:29:38.307218Z","shell.execute_reply.started":"2024-12-07T06:29:38.306896Z","shell.execute_reply":"2024-12-07T06:29:38.306924Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Train dataset has rows:\", train.shape[0], \"and columns:\", train.shape[1])\nprint(\"Test dataset has rows:\", test.shape[0], \"and columns:\", test.shape[1])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.309880Z","iopub.status.idle":"2024-12-07T06:29:38.310544Z","shell.execute_reply.started":"2024-12-07T06:29:38.310216Z","shell.execute_reply":"2024-12-07T06:29:38.310247Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_columns = set(train.columns)\ntest_columns = set(test.columns)\n\n# Menemukan kolom yang sama\ncommon_columns = train_columns & test_columns\nprint(f\"Shared columns ({len(common_columns)}):\", sorted(common_columns))\n\n# Menemukan kolom unik pada data latih\ntrain_only_columns = train_columns - test_columns\nprint(f\"Train-only columns ({len(train_only_columns)}):\", sorted(train_only_columns))\n\n# Menemukan kolom unik pada data uji\ntest_only_columns = test_columns - train_columns\nif test_only_columns:\n    print(f\"Test-only columns ({len(test_only_columns)}):\", sorted(test_only_columns))\nelse:\n    print(\"No unique columns found in test dataset.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.311678Z","iopub.status.idle":"2024-12-07T06:29:38.312272Z","shell.execute_reply.started":"2024-12-07T06:29:38.311977Z","shell.execute_reply":"2024-12-07T06:29:38.312007Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Menghitung nilai yang hilang untuk setiap kolom di common_columns\nmissing_common = {col: train[col].isnull().sum() for col in common_columns}\n\n# Menampilkan informasi tentang nilai yang hilang\nprint(\"Summary of missing values in common columns:\")\nfor col, missing in sorted(missing_common.items(), key=lambda x: x[1], reverse=True):\n    print(f\"Column: {col:<40} | Missing values: {missing}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.314017Z","iopub.status.idle":"2024-12-07T06:29:38.314589Z","shell.execute_reply.started":"2024-12-07T06:29:38.314306Z","shell.execute_reply":"2024-12-07T06:29:38.314336Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Menghitung nilai yang hilang untuk data latih dan uji\nmissing_train = {col: train[col].isnull().sum() for col in common_columns}\nmissing_test = {col: test[col].isnull().sum() for col in common_columns}\n\n# Menghitung total dan proporsi nilai yang hilang\ntotal_train = len(train)\ntotal_test = len(test)\n\nmissing_train_ratio = {col: missing_train[col] / total_train for col in common_columns}\nmissing_test_ratio = {col: missing_test[col] / total_test for col in common_columns}\n\n# Menyiapkan indeks untuk plot\nindex = range(len(common_columns))\nbar_width = 0.35\n\n# Membuat plot\nplt.figure(figsize=(18, 12))\n\nplt.barh(index, list(missing_train_ratio.values()), color='steelblue', height=bar_width, label='Train Missing Ratio', alpha=0.8)\nplt.barh([i + bar_width for i in index], list(missing_test_ratio.values()), color='indianred', height=bar_width, label='Test Missing Ratio', alpha=0.8)\n\n# Menambahkan detail ke grafik\nplt.xlabel('Proportion of Missing Values', fontsize=12)\nplt.ylabel('Common Columns', fontsize=12)\nplt.title('Comparison of Missing Value Proportions Between Train and Test Datasets', fontsize=14, fontweight='bold')\n\nplt.yticks([i + bar_width / 2 for i in index], sorted(common_columns), fontsize=10)\nplt.legend(loc='upper right', fontsize=12)\nplt.grid(axis='x', linestyle='--', alpha=0.6)\n\n# Menyempurnakan tata letak\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.316608Z","iopub.status.idle":"2024-12-07T06:29:38.317369Z","shell.execute_reply.started":"2024-12-07T06:29:38.317050Z","shell.execute_reply":"2024-12-07T06:29:38.317087Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Menghitung nilai yang hilang hanya untuk kolom di data train\nmissing_train_only = {col: train[col].isnull().sum() for col in train_only_columns}\n\n# Menampilkan nilai yang hilang dengan format yang lebih rapi\nprint(\"\\nSummary of missing values in columns exclusive to train dataset:\")\nfor col, missing in sorted(missing_train_only.items(), key=lambda x: x[1], reverse=True):\n    print(f\"Column: {col:<25} | Missing values: {missing}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.319584Z","iopub.status.idle":"2024-12-07T06:29:38.320311Z","shell.execute_reply.started":"2024-12-07T06:29:38.319869Z","shell.execute_reply":"2024-12-07T06:29:38.319898Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Menghitung proporsi nilai yang hilang hanya untuk kolom di data train\nmissing_train_only = {col: train[col].isnull().sum() for col in train_only_columns}\nmissing_train_only_ratio = {col: missing_train_only[col] / total_train for col in train_only_columns}\n\n# Membuat plot bar horizontal\nplt.figure(figsize=(18, 12))\nplt.barh(\n    y=sorted(missing_train_only_ratio.keys(), key=lambda x: missing_train_only_ratio[x], reverse=True),\n    width=sorted(missing_train_only_ratio.values(), reverse=True),\n    color='indianred',\n    alpha=0.8,\n)\n\n# Menambahkan detail pada grafik\nplt.xlabel('Proportion of Missing Values', fontsize=12)\nplt.ylabel('Train-Only Columns', fontsize=12)\nplt.title('Proportion of Missing Values in Train-Only Columns', fontsize=14, fontweight='bold')\n\n# Menyempurnakan tampilan grafik\nplt.xticks(fontsize=10)\nplt.yticks(fontsize=10)\nplt.grid(axis='x', linestyle='--', alpha=0.6)\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.321912Z","iopub.status.idle":"2024-12-07T06:29:38.322493Z","shell.execute_reply.started":"2024-12-07T06:29:38.322219Z","shell.execute_reply":"2024-12-07T06:29:38.322248Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Menemukan kolom non-numerik di dataset train\nnon_numeric_columns = train.select_dtypes(exclude=['number']).columns\n\n# Menampilkan kolom non-numerik dengan format yang lebih rapi\nprint(\"Non-numeric columns found in the train dataset:\")\nfor i, col in enumerate(non_numeric_columns, 1):\n    print(f\"{i:>2}. {col}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.326355Z","iopub.status.idle":"2024-12-07T06:29:38.326958Z","shell.execute_reply.started":"2024-12-07T06:29:38.326661Z","shell.execute_reply":"2024-12-07T06:29:38.326690Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def process_data(data, is_train=True):\n    \"\"\"\n    Process the dataset by selecting relevant columns, encoding categorical data, \n    and handling missing values.\n\n    Args:\n        data (pd.DataFrame): The input dataset (train or test).\n        is_train (bool): Flag indicating whether the data is for training.\n\n    Returns:\n        pd.DataFrame: The processed dataset.\n    \"\"\"\n    # Columns to be selected\n    common_columns = [\n        'id', 'PreInt_EduHx-Season', 'FGC-FGC_SRL_Zone', 'BIA-BIA_FFMI',\n        'Fitness_Endurance-Time_Sec', 'Fitness_Endurance-Time_Mins',\n        'BIA-BIA_ECW', 'FGC-FGC_SRR', 'BIA-Season',\n        'PAQ_C-PAQ_C_Total', 'FGC-FGC_TL_Zone', 'Physical-HeartRate',\n        'BIA-BIA_Fat', 'Fitness_Endurance-Max_Stage', 'Basic_Demos-Enroll_Season',\n        'PreInt_EduHx-computerinternet_hoursday', 'FGC-FGC_PU', 'BIA-BIA_TBW',\n        'BIA-BIA_BMR', 'BIA-BIA_BMC', 'Physical-Diastolic_BP',\n        'Physical-Weight', 'FGC-FGC_GSND_Zone', 'Physical-Systolic_BP',\n        'BIA-BIA_Activity_Level_num', 'PAQ_A-Season', 'SDS-SDS_Total_Raw',\n        'Physical-BMI', 'Basic_Demos-Sex', 'SDS-SDS_Total_T', 'FGC-FGC_GSD',\n        'FGC-FGC_CU', 'PAQ_A-PAQ_A_Total', 'FGC-FGC_GSD_Zone',\n        'Fitness_Endurance-Season', 'FGC-FGC_GSND', 'FGC-FGC_PU_Zone',\n        'BIA-BIA_ICW', 'FGC-Season', 'FGC-FGC_SRL', 'Physical-Waist_Circumference',\n        'BIA-BIA_Frame_num', 'FGC-FGC_SRR_Zone', 'Physical-Height',\n        'Physical-Season', 'BIA-BIA_FMI', 'PAQ_C-Season', 'FGC-FGC_CU_Zone',\n        'BIA-BIA_SMM', 'CGAS-Season', 'SDS-Season', 'BIA-BIA_BMI',\n        'FGC-FGC_TL', 'BIA-BIA_LST', 'Basic_Demos-Age', 'BIA-BIA_LDM',\n        'BIA-BIA_DEE', 'CGAS-CGAS_Score', 'BIA-BIA_FFM'\n    ]\n\n    # Add target column for training data\n    if is_train:\n        common_columns.append('PCIAT-PCIAT_Total')  # Target column\n\n    # Select relevant columns\n    data = data[common_columns]\n\n    # Encode categorical columns\n    label_encoders = {}\n    categorical_columns = data.select_dtypes(include=['object', 'category']).columns\n    for col in categorical_columns:\n        le = LabelEncoder()\n        data[col] = le.fit_transform(data[col].astype(str))\n        label_encoders[col] = le  # Save encoder for future use\n\n    # Handle missing values\n    if is_train:\n        # Drop columns with > 50% missing values\n        missing_threshold = 0.5\n        missing_ratios = data.isnull().mean()\n        columns_to_drop = missing_ratios[missing_ratios > missing_threshold].index\n        data.drop(columns=columns_to_drop, inplace=True)\n\n        # Drop rows with any remaining missing values\n        data.dropna(inplace=True)\n    else:\n        # Fill missing values in test data\n        for col in data.columns:\n            if data[col].isnull().any():\n                if data[col].dtype in ['float64', 'int64']:\n                    # Fill numerical columns with mean\n                    data[col].fillna(data[col].mean(), inplace=True)\n                else:\n                    # Fill categorical columns with mode\n                    data[col].fillna(data[col].mode()[0], inplace=True)\n\n    return data\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.328401Z","iopub.status.idle":"2024-12-07T06:29:38.328998Z","shell.execute_reply.started":"2024-12-07T06:29:38.328688Z","shell.execute_reply":"2024-12-07T06:29:38.328718Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Memproses data train dan test\nprocessed_train = process_data(train, is_train=True)\nprocessed_test = process_data(test, is_train=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.330645Z","iopub.status.idle":"2024-12-07T06:29:38.331256Z","shell.execute_reply.started":"2024-12-07T06:29:38.330964Z","shell.execute_reply":"2024-12-07T06:29:38.330993Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Mengambil kolom target 'PCIAT-PCIAT_Total' dari dataset pelatihan\ntarget_column = \"PCIAT-PCIAT_Total\"  # Menyimpan nama kolom target\n\n# Memisahkan target dan fitur\ntarget = processed_train[target_column]  # Kolom target (label) yang ingin diprediksi\nfeatures = processed_train.drop(columns=[target_column])  # Menghapus kolom target untuk mendapatkan fitur\n\n# Menampilkan bentuk data setelah pemisahan\nprint(\"Train features shape:\", features.shape)\nprint(\"Train target shape:\", target.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.333539Z","iopub.status.idle":"2024-12-07T06:29:38.334155Z","shell.execute_reply.started":"2024-12-07T06:29:38.333831Z","shell.execute_reply":"2024-12-07T06:29:38.333860Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Print columns of both datasets\nprint(\"Processed Train Columns:\", processed_train.columns.tolist())\nprint(\"Processed Test Columns:\", processed_test.columns.tolist())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.335797Z","iopub.status.idle":"2024-12-07T06:29:38.336413Z","shell.execute_reply.started":"2024-12-07T06:29:38.336132Z","shell.execute_reply":"2024-12-07T06:29:38.336162Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Filter common columns that exist in both datasets\ncommon_columns = [col for col in common_columns if col in processed_train.columns and col in processed_test.columns]\n\n# Now filter the train and test data using the updated common_columns\nprocessed_train_data = processed_train[common_columns]\nprocessed_test_data = processed_test[common_columns]\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.337550Z","iopub.status.idle":"2024-12-07T06:29:38.338144Z","shell.execute_reply.started":"2024-12-07T06:29:38.337817Z","shell.execute_reply":"2024-12-07T06:29:38.337846Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Print the shapes of the filtered data\nprint(\"Processed Train Data shape:\", processed_train_data.shape)\nprint(\"Processed Test Data shape:\", processed_test_data.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.340452Z","iopub.status.idle":"2024-12-07T06:29:38.341043Z","shell.execute_reply.started":"2024-12-07T06:29:38.340740Z","shell.execute_reply":"2024-12-07T06:29:38.340768Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop the 'id' column from both the train and test datasets to create the feature sets\nX_train = processed_train_data.drop(columns=[\"id\"])\nX_test = processed_test_data.drop(columns=[\"id\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.342390Z","iopub.status.idle":"2024-12-07T06:29:38.342937Z","shell.execute_reply.started":"2024-12-07T06:29:38.342662Z","shell.execute_reply":"2024-12-07T06:29:38.342690Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nfrom sklearn.metrics import cohen_kappa_score\n\n# Define the convert function\ndef convert(scores):\n    scores = np.array(scores) * 1.3  # Scale the scores by 1.3\n    bins = np.zeros_like(scores)  # Initialize bins array with zeros\n    bins[scores <= 30] = 0  # Category 0 for scores <= 30\n    bins[(scores > 30) & (scores < 50)] = 1  # Category 1 for scores between 30 and 50\n    bins[(scores >= 50) & (scores < 80)] = 2  # Category 2 for scores between 50 and 80\n    bins[scores >= 80] = 3  # Category 3 for scores >= 80\n    return bins\n\n# Define the quadratic_weighted_kappa function\ndef quadratic_weighted_kappa(y_true, y_pred):\n    y_true_cat = convert(y_true)  # Convert true values to categories\n    y_pred_cat = convert(y_pred)  # Convert predicted values to categories\n    return cohen_kappa_score(y_true_cat, y_pred_cat, weights='quadratic')  # Calculate the quadratic weighted kappa score\n\n# Example true and predicted scores\ny_true = [20, 35, 55, 85, 40]\ny_pred = [25, 38, 50, 80, 43]\n\n# Calculate the quadratic weighted kappa\nkappa = quadratic_weighted_kappa(y_true, y_pred)\nprint(f\"Quadratic Weighted Kappa: {kappa}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.344199Z","iopub.status.idle":"2024-12-07T06:29:38.344762Z","shell.execute_reply.started":"2024-12-07T06:29:38.344464Z","shell.execute_reply":"2024-12-07T06:29:38.344492Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\nimport numpy as np\nfrom tqdm import tqdm\nfrom sklearn.metrics import cohen_kappa_score\n\n# Function to convert scores to categories for quadratic weighted kappa\ndef convert(scores):\n    scores = np.array(scores) * 1.3\n    bins = np.zeros_like(scores)\n    bins[scores <= 30] = 0\n    bins[(scores > 30) & (scores < 50)] = 1\n    bins[(scores >= 50) & (scores < 80)] = 2\n    bins[scores >= 80] = 3\n    return bins\n\n# Function to calculate quadratic weighted kappa\ndef quadratic_weighted_kappa(y_true, y_pred):\n    y_true_cat = convert(y_true)\n    y_pred_cat = convert(y_pred)\n    return cohen_kappa_score(y_true_cat, y_pred_cat, weights='quadratic')\n\n# Main function to train model across multiple folds\ndef train_folds(model_class, X, y, test_data, n_splits=5, params=None):\n    skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)\n    \n    oof_non_rounded = np.zeros(len(y))  # Out of Fold predictions\n    test_preds = np.zeros((len(test_data), n_splits))  # Test set predictions across folds\n    val_kappas = []  # Store QWK for each fold\n    \n    for fold, (train_idx, val_idx) in enumerate(tqdm(skf.split(X, y), total=n_splits, desc=\"Training Folds\")):\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        # Initialize model with provided parameters\n        model = model_class(**params) if params else model_class()\n        \n        # Train the model\n        model.fit(X_train, y_train)\n        \n        # Predict on the validation data\n        y_val_pred = model.predict(X_val)\n        oof_non_rounded[val_idx] = y_val_pred\n        \n        # Round validation predictions and compute QWK for validation set\n        y_val_pred_rounded = y_val_pred.round(0).astype(int)\n        val_kappa = quadratic_weighted_kappa(y_val, y_val_pred)\n        val_kappas.append(val_kappa)\n        print(f\"Fold {fold + 1} - Validation QWK: {val_kappa:.4f}\")\n        \n        # Predict on the test set for the current fold\n        test_preds[:, fold] = model.predict(test_data)\n    \n    # Average the test set predictions across all folds\n    test_preds_mean = test_preds.mean(axis=1)\n    \n    # Print the mean QWK score across all folds\n    mean_kappa = np.mean(val_kappas)\n    print(f\"Mean Validation QWK across folds: {mean_kappa:.4f}\")\n    \n    # Return the averaged predictions for the test set\n    return test_preds_mean\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.346513Z","iopub.status.idle":"2024-12-07T06:29:38.347205Z","shell.execute_reply.started":"2024-12-07T06:29:38.346871Z","shell.execute_reply":"2024-12-07T06:29:38.346903Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import lightgbm as lgb\nimport numpy as np\nfrom tqdm import tqdm\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\n\n# Fungsi untuk mengonversi skor ke dalam kategori\ndef convert(scores):\n    scores = np.array(scores) * 1.3\n    bins = np.zeros_like(scores)\n    bins[scores <= 30] = 0\n    bins[(scores > 30) & (scores < 50)] = 1\n    bins[(scores >= 50) & (scores < 80)] = 2\n    bins[scores >= 80] = 3\n    return bins\n\n# Fungsi untuk menghitung Quadratic Weighted Kappa (QWK)\ndef quadratic_weighted_kappa(y_true, y_pred):\n    y_true_cat = convert(y_true)\n    y_pred_cat = convert(y_pred)\n    return cohen_kappa_score(y_true_cat, y_pred_cat, weights='quadratic')\n\n# Fungsi untuk melatih model di setiap fold dengan LightGBM\ndef train_folds(model_class, X, y, test_data, n_splits=5, params=None):\n    skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)\n    \n    # Variabel untuk menyimpan hasil prediksi\n    oof_non_rounded = np.zeros(len(y))  # Out-of-Fold predictions\n    test_preds = np.zeros((len(test_data), n_splits))  # Prediksi untuk data test per fold\n    val_kappas = []  # Menyimpan QWK untuk setiap fold\n    \n    # Proses training untuk setiap fold\n    for fold, (train_idx, val_idx) in enumerate(tqdm(skf.split(X, y), total=n_splits, desc=\"Training Folds\")):\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        # Inisialisasi model dengan parameter yang sudah diberikan\n        model = model_class(**params) if params else model_class()\n        \n        # Latih model\n        model.fit(X_train, y_train)\n        \n        # Prediksi pada data validasi\n        y_val_pred = model.predict(X_val)\n        oof_non_rounded[val_idx] = y_val_pred\n        \n        # Prediksi yang sudah dibulatkan dan menghitung QWK\n        y_val_pred_rounded = y_val_pred.round(0).astype(int)\n        val_kappa = quadratic_weighted_kappa(y_val, y_val_pred)\n        val_kappas.append(val_kappa)\n        print(f\"Fold {fold + 1} - Validation QWK: {val_kappa:.4f}\")\n        \n        # Prediksi pada data test\n        test_preds[:, fold] = model.predict(test_data)\n    \n    # Rata-rata prediksi dari data test\n    test_preds_mean = test_preds.mean(axis=1)\n    \n    # Menampilkan nilai rata-rata QWK untuk semua fold\n    mean_kappa = np.mean(val_kappas)\n    print(f\"Mean Validation QWK across folds: {mean_kappa:.4f}\")\n    \n    # Mengembalikan prediksi rata-rata untuk data test\n    return test_preds_mean","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.349463Z","iopub.status.idle":"2024-12-07T06:29:38.350157Z","shell.execute_reply.started":"2024-12-07T06:29:38.349791Z","shell.execute_reply":"2024-12-07T06:29:38.349824Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import lightgbm as lgb\nfrom sklearn.metrics import mean_squared_error, r2_score\nfrom tqdm import tqdm\nfrom sklearn.model_selection import StratifiedKFold\n\n# Fungsi untuk melatih model di setiap fold dengan LightGBM untuk regresi\ndef train_folds_regressor(model_class, X, y, test_data, n_splits=5, params=None):\n    skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)\n    \n    # Variabel untuk menyimpan hasil prediksi\n    oof_non_rounded = np.zeros(len(y))  # Out-of-Fold predictions\n    test_preds = np.zeros((len(test_data), n_splits))  # Prediksi untuk data test per fold\n    val_rmse = []  # Menyimpan RMSE untuk setiap fold\n    val_r2 = []  # Menyimpan R^2 untuk setiap fold\n    \n    # Proses training untuk setiap fold\n    for fold, (train_idx, val_idx) in enumerate(tqdm(skf.split(X, y), total=n_splits, desc=\"Training Folds\")):\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        # Inisialisasi model dengan parameter yang sudah diberikan\n        model = model_class(**params) if params else model_class()\n        \n        # Latih model\n        model.fit(X_train, y_train)\n        \n        # Prediksi pada data validasi\n        y_val_pred = model.predict(X_val)\n        oof_non_rounded[val_idx] = y_val_pred\n        \n        # Menghitung metrik evaluasi regresi (RMSE, R^2)\n        val_rmse_score = np.sqrt(mean_squared_error(y_val, y_val_pred))\n        val_r2_score = r2_score(y_val, y_val_pred)\n        \n        val_rmse.append(val_rmse_score)\n        val_r2.append(val_r2_score)\n        \n        print(f\"Fold {fold + 1} - Validation RMSE: {val_rmse_score:.4f}, R^2: {val_r2_score:.4f}\")\n        \n        # Prediksi pada data test\n        test_preds[:, fold] = model.predict(test_data)\n    \n    # Rata-rata prediksi dari data test\n    test_preds_mean = test_preds.mean(axis=1)\n    \n    # Menampilkan nilai rata-rata RMSE dan R^2 untuk semua fold\n    mean_rmse = np.mean(val_rmse)\n    mean_r2 = np.mean(val_r2)\n    print(f\"Mean Validation RMSE across folds: {mean_rmse:.4f}\")\n    print(f\"Mean Validation R^2 across folds: {mean_r2:.4f}\")\n    \n    # Mengembalikan prediksi rata-rata untuk data test\n    return test_preds_mean\n\n# Menggunakan parameter yang sudah didefinisikan\nparams = {\n    'learning_rate': 0.03,\n    'n_estimators': 200,\n    'num_leaves': 80,\n    'max_depth': 5,\n    'min_child_samples': 50,\n    'subsample': 0.8,\n    'colsample_bytree': 0.5,\n    'reg_alpha': 3,\n    'reg_lambda': 0.01,\n    'verbosity': -1\n}\n\n# Menggunakan LGBMRegressor sebagai model\npred = train_folds_regressor(lgb.LGBMRegressor, X_train, target, X_test, n_splits=5, params=params)\n\nprint(\"Prediksi Rata-rata untuk Data Test:\", pred)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.352197Z","iopub.status.idle":"2024-12-07T06:29:38.352783Z","shell.execute_reply.started":"2024-12-07T06:29:38.352495Z","shell.execute_reply":"2024-12-07T06:29:38.352526Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.355360Z","iopub.status.idle":"2024-12-07T06:29:38.356008Z","shell.execute_reply.started":"2024-12-07T06:29:38.355670Z","shell.execute_reply":"2024-12-07T06:29:38.355700Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_ids = test[\"id\"]\ntest_ids","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.357971Z","iopub.status.idle":"2024-12-07T06:29:38.358562Z","shell.execute_reply.started":"2024-12-07T06:29:38.358272Z","shell.execute_reply":"2024-12-07T06:29:38.358303Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({'id': test_ids.values,\n                            'sii': convert(pred)})\n\nsubmission.to_csv('submission.csv',index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.359899Z","iopub.status.idle":"2024-12-07T06:29:38.360523Z","shell.execute_reply.started":"2024-12-07T06:29:38.360216Z","shell.execute_reply":"2024-12-07T06:29:38.360246Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:29:38.362420Z","iopub.status.idle":"2024-12-07T06:29:38.363068Z","shell.execute_reply.started":"2024-12-07T06:29:38.362718Z","shell.execute_reply":"2024-12-07T06:29:38.362748Z"}},"outputs":[],"execution_count":null}]}