{"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":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:19.784151Z","iopub.execute_input":"2024-11-17T04:05:19.784602Z","iopub.status.idle":"2024-11-17T04:05:19.792031Z","shell.execute_reply.started":"2024-11-17T04:05:19.784560Z","shell.execute_reply":"2024-11-17T04:05:19.790699Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")\ntrain.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:19.794507Z","iopub.execute_input":"2024-11-17T04:05:19.795412Z","iopub.status.idle":"2024-11-17T04:05:19.888093Z","shell.execute_reply.started":"2024-11-17T04:05:19.795353Z","shell.execute_reply":"2024-11-17T04:05:19.886720Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/test.csv\")\ntest.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:19.889873Z","iopub.execute_input":"2024-11-17T04:05:19.890410Z","iopub.status.idle":"2024-11-17T04:05:19.931675Z","shell.execute_reply.started":"2024-11-17T04:05:19.890361Z","shell.execute_reply":"2024-11-17T04:05:19.930206Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:19.935245Z","iopub.execute_input":"2024-11-17T04:05:19.935769Z","iopub.status.idle":"2024-11-17T04:05:19.942544Z","shell.execute_reply.started":"2024-11-17T04:05:19.935712Z","shell.execute_reply":"2024-11-17T04:05:19.941198Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_columns = set(train.columns)\ntest_columns = set(test.columns)\n\ncommon_columns = train_columns.intersection(test_columns)\nprint(\"Common columns:\", common_columns)\n\ntrain_only_columns = train_columns.difference(test_columns)\nprint(\"Columns only in train:\", train_only_columns)\n\ntest_only_columns = test_columns.difference(train_columns)\nprint(\"Columns only in test:\", test_only_columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:19.944088Z","iopub.execute_input":"2024-11-17T04:05:19.944492Z","iopub.status.idle":"2024-11-17T04:05:19.957579Z","shell.execute_reply.started":"2024-11-17T04:05:19.944448Z","shell.execute_reply":"2024-11-17T04:05:19.956352Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_common = {col: train[col].isnull().sum() for col in common_columns}\nprint(\"Missing values in common columns:\")\nprint(missing_common)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:19.959364Z","iopub.execute_input":"2024-11-17T04:05:19.960648Z","iopub.status.idle":"2024-11-17T04:05:19.986445Z","shell.execute_reply.started":"2024-11-17T04:05:19.960567Z","shell.execute_reply":"2024-11-17T04:05:19.984896Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_train = {col: train[col].isnull().sum() for col in common_columns}\nmissing_test = {col: test[col].isnull().sum() for col in common_columns}\n\ntotal_train = train.shape[0]\ntotal_test = test.shape[0]\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\nbar_width = 0.4\n\nplt.figure(figsize=(16, 10))\nindex = range(len(common_columns))\n\nplt.barh(index, list(missing_train_ratio.values()), color='skyblue', height=bar_width, label='Train', alpha=0.7)\n\nplt.barh([i + bar_width for i in index], list(missing_test_ratio.values()), color='lightcoral', height=bar_width, label='Test', alpha=0.7)\n\nplt.xlabel('Proportion of Missing Values')\nplt.title('Proportion of Missing Values in Common Columns')\nplt.yticks([i + bar_width / 2 for i in index], list(missing_train.keys()))\nplt.legend()\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:19.988275Z","iopub.execute_input":"2024-11-17T04:05:19.988643Z","iopub.status.idle":"2024-11-17T04:05:21.336798Z","shell.execute_reply.started":"2024-11-17T04:05:19.988605Z","shell.execute_reply":"2024-11-17T04:05:21.335116Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_train_only = {col: train[col].isnull().sum() for col in train_only_columns}\nprint(\"\\nMissing values in columns only in train:\")\nprint(missing_train_only)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:21.338681Z","iopub.execute_input":"2024-11-17T04:05:21.339303Z","iopub.status.idle":"2024-11-17T04:05:21.354303Z","shell.execute_reply.started":"2024-11-17T04:05:21.339258Z","shell.execute_reply":"2024-11-17T04:05:21.352414Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_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\nplt.figure(figsize=(16, 10))\nplt.barh(list(missing_train_only_ratio.keys()), list(missing_train_only_ratio.values()), color='lightcoral')\nplt.xlabel('Proportion of Missing Values')\nplt.title('Proportion of Missing Values in Columns Only in Train')\nplt.xticks(rotation=45)\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:21.361380Z","iopub.execute_input":"2024-11-17T04:05:21.361931Z","iopub.status.idle":"2024-11-17T04:05:22.062291Z","shell.execute_reply.started":"2024-11-17T04:05:21.361873Z","shell.execute_reply":"2024-11-17T04:05:22.061100Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"non_numeric_columns = train.select_dtypes(exclude=['number']).columns\n\nprint(\"Non-numeric columns in train:\")\nprint(non_numeric_columns.tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.064077Z","iopub.execute_input":"2024-11-17T04:05:22.064457Z","iopub.status.idle":"2024-11-17T04:05:22.072596Z","shell.execute_reply.started":"2024-11-17T04:05:22.064417Z","shell.execute_reply":"2024-11-17T04:05:22.071125Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def data_process(data, is_train=True):\n    # Common column\n    selected_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    # If it is training data, add the target column 'sii'\n    if is_train:\n        selected_columns.append('PCIAT-PCIAT_Total') #sii\n\n    data = data[selected_columns]\n\n    # LabelEncoder\n    label_encoders = {}\n    for col in data.select_dtypes(include=['object', 'category']).columns:\n        le = LabelEncoder()\n        data[col] = le.fit_transform(data[col].astype(str))  # 转为字符串处理缺失值编码\n        label_encoders[col] = le  # 保存编码器以供将来解码\n\n    if is_train:\n        # Handle missing values: Delete columns or rows proportionally\n        missing_threshold = 0.5\n        for col in data.columns:\n            missing_ratio = data[col].isnull().mean()\n            if missing_ratio > missing_threshold:\n                # Columns with more than 50% of missing values are deleted\n                data.drop(columns=[col], inplace=True)\n\n        # Delete the remaining rows with missing values\n        data.dropna(inplace=True)\n    else:\n        # Fill in missing values in the test data\n        for col in data.columns:\n            if data[col].isnull().any():\n                if data[col].dtype in ['float64', 'int64']:\n                    # The numerical columns are filled with the mean\n                    data[col].fillna(data[col].mean(), inplace=True)\n                else:\n                    # Categorical columns are populated with the most frequent values\n                    data[col].fillna(data[col].mode()[0], inplace=True)\n\n\n    return data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.074738Z","iopub.execute_input":"2024-11-17T04:05:22.075250Z","iopub.status.idle":"2024-11-17T04:05:22.092954Z","shell.execute_reply.started":"2024-11-17T04:05:22.075201Z","shell.execute_reply":"2024-11-17T04:05:22.091669Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"processed_train = data_process(train, True)\nprocessed_test = data_process(test, False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.097652Z","iopub.execute_input":"2024-11-17T04:05:22.098164Z","iopub.status.idle":"2024-11-17T04:05:22.207366Z","shell.execute_reply.started":"2024-11-17T04:05:22.098119Z","shell.execute_reply":"2024-11-17T04:05:22.206262Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Train shape:\", processed_train.shape)\nprint(\"Test shape:\", processed_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.208722Z","iopub.execute_input":"2024-11-17T04:05:22.209184Z","iopub.status.idle":"2024-11-17T04:05:22.215739Z","shell.execute_reply.started":"2024-11-17T04:05:22.209140Z","shell.execute_reply":"2024-11-17T04:05:22.214395Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target = processed_train[\"PCIAT-PCIAT_Total\"] #sii","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.217192Z","iopub.execute_input":"2024-11-17T04:05:22.217626Z","iopub.status.idle":"2024-11-17T04:05:22.228472Z","shell.execute_reply.started":"2024-11-17T04:05:22.217583Z","shell.execute_reply":"2024-11-17T04:05:22.226721Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_columns = set(processed_train.columns)\ntest_columns = set(processed_test.columns)\n\ncommon_columns = train_columns.intersection(test_columns)\nprint(\"Common columns:\", common_columns)\n\nprocessed_test_data = processed_test[list(common_columns)]\n\nprocessed_train_data = processed_train[list(common_columns)]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.230199Z","iopub.execute_input":"2024-11-17T04:05:22.230678Z","iopub.status.idle":"2024-11-17T04:05:22.250325Z","shell.execute_reply.started":"2024-11-17T04:05:22.230619Z","shell.execute_reply":"2024-11-17T04:05:22.248625Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Train shape:\", processed_train_data.shape)\nprint(\"Test shape:\", processed_test_data.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.252179Z","iopub.execute_input":"2024-11-17T04:05:22.252641Z","iopub.status.idle":"2024-11-17T04:05:22.259995Z","shell.execute_reply.started":"2024-11-17T04:05:22.252595Z","shell.execute_reply":"2024-11-17T04:05:22.258624Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train = processed_train_data.drop(columns=[\"id\"])\nX_test = processed_test_data.drop(columns=[\"id\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.261594Z","iopub.execute_input":"2024-11-17T04:05:22.262399Z","iopub.status.idle":"2024-11-17T04:05:22.276384Z","shell.execute_reply.started":"2024-11-17T04:05:22.262341Z","shell.execute_reply":"2024-11-17T04:05:22.274930Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def 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\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')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.277938Z","iopub.execute_input":"2024-11-17T04:05:22.278504Z","iopub.status.idle":"2024-11-17T04:05:22.288500Z","shell.execute_reply.started":"2024-11-17T04:05:22.278445Z","shell.execute_reply":"2024-11-17T04:05:22.287090Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def 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))\n    test_preds = np.zeros((len(test_data), n_splits))\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        model = model_class(**params) if params else model_class()\n        model.fit(X_train, y_train)\n        \n        # Predict validation\n        y_val_pred = model.predict(X_val)\n        oof_non_rounded[val_idx] = y_val_pred\n        \n        # Round validation predictions\n        y_val_pred_rounded = y_val_pred.round(0).astype(int)\n        \n        # Compute QWK for validation data\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 test\n        test_preds[:, fold] = model.predict(test_data)\n    \n    # Average test predictions across folds\n    test_preds_mean = test_preds.mean(axis=1)\n    \n    # Print 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 test_preds_mean","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.289862Z","iopub.execute_input":"2024-11-17T04:05:22.292648Z","iopub.status.idle":"2024-11-17T04:05:22.309689Z","shell.execute_reply.started":"2024-11-17T04:05:22.292585Z","shell.execute_reply":"2024-11-17T04:05:22.308217Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"params = {\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}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.311540Z","iopub.execute_input":"2024-11-17T04:05:22.312095Z","iopub.status.idle":"2024-11-17T04:05:22.328777Z","shell.execute_reply.started":"2024-11-17T04:05:22.312033Z","shell.execute_reply":"2024-11-17T04:05:22.327307Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred = train_folds(lgb.LGBMRegressor, X_train, target, X_test, n_splits=5, params=params)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:22.330796Z","iopub.execute_input":"2024-11-17T04:05:22.331329Z","iopub.status.idle":"2024-11-17T04:05:23.104827Z","shell.execute_reply.started":"2024-11-17T04:05:22.331270Z","shell.execute_reply":"2024-11-17T04:05:23.103487Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:23.106679Z","iopub.execute_input":"2024-11-17T04:05:23.107334Z","iopub.status.idle":"2024-11-17T04:05:23.116195Z","shell.execute_reply.started":"2024-11-17T04:05:23.107274Z","shell.execute_reply":"2024-11-17T04:05:23.114856Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_ids = test[\"id\"]\ntest_ids","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:05:48.820346Z","iopub.execute_input":"2024-11-17T04:05:48.820830Z","iopub.status.idle":"2024-11-17T04:05:48.831080Z","shell.execute_reply.started":"2024-11-17T04:05:48.820784Z","shell.execute_reply":"2024-11-17T04:05:48.829878Z"}},"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)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:06:20.761322Z","iopub.execute_input":"2024-11-17T04:06:20.761810Z","iopub.status.idle":"2024-11-17T04:06:20.772401Z","shell.execute_reply.started":"2024-11-17T04:06:20.761765Z","shell.execute_reply":"2024-11-17T04:06:20.771204Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T04:06:23.664585Z","iopub.execute_input":"2024-11-17T04:06:23.665110Z","iopub.status.idle":"2024-11-17T04:06:23.685103Z","shell.execute_reply.started":"2024-11-17T04:06:23.665057Z","shell.execute_reply":"2024-11-17T04:06:23.683264Z"}},"outputs":[],"execution_count":null}]}