{"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-06T13:23:26.594922Z","iopub.execute_input":"2024-12-06T13:23:26.595735Z","iopub.status.idle":"2024-12-06T13:23:28.304099Z","shell.execute_reply.started":"2024-12-06T13:23:26.595689Z","shell.execute_reply":"2024-12-06T13:23:28.303262Z"}},"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-06T13:23:28.306140Z","iopub.execute_input":"2024-12-06T13:23:28.307058Z","iopub.status.idle":"2024-12-06T13:23:28.314922Z","shell.execute_reply.started":"2024-12-06T13:23:28.306983Z","shell.execute_reply":"2024-12-06T13:23:28.314064Z"}},"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-06T13:23:28.316209Z","iopub.execute_input":"2024-12-06T13:23:28.316833Z","iopub.status.idle":"2024-12-06T13:23:28.372619Z","shell.execute_reply.started":"2024-12-06T13:23:28.316784Z","shell.execute_reply":"2024-12-06T13:23:28.371798Z"}},"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-12-06T13:23:28.377313Z","iopub.execute_input":"2024-12-06T13:23:28.377616Z","iopub.status.idle":"2024-12-06T13:23:28.382846Z","shell.execute_reply.started":"2024-12-06T13:23:28.377587Z","shell.execute_reply":"2024-12-06T13:23:28.381817Z"}},"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-12-06T13:23:28.384234Z","iopub.execute_input":"2024-12-06T13:23:28.384544Z","iopub.status.idle":"2024-12-06T13:23:28.394782Z","shell.execute_reply.started":"2024-12-06T13:23:28.384513Z","shell.execute_reply":"2024-12-06T13:23:28.393845Z"}},"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-12-06T13:23:28.396272Z","iopub.execute_input":"2024-12-06T13:23:28.396967Z","iopub.status.idle":"2024-12-06T13:23:28.416309Z","shell.execute_reply.started":"2024-12-06T13:23:28.396919Z","shell.execute_reply":"2024-12-06T13:23:28.415222Z"}},"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-12-06T13:23:28.417722Z","iopub.execute_input":"2024-12-06T13:23:28.418144Z","iopub.status.idle":"2024-12-06T13:23:29.373215Z","shell.execute_reply.started":"2024-12-06T13:23:28.418101Z","shell.execute_reply":"2024-12-06T13:23:29.372078Z"}},"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-12-06T13:23:29.374721Z","iopub.execute_input":"2024-12-06T13:23:29.375101Z","iopub.status.idle":"2024-12-06T13:23:29.385679Z","shell.execute_reply.started":"2024-12-06T13:23:29.375051Z","shell.execute_reply":"2024-12-06T13:23:29.384565Z"}},"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-12-06T13:23:29.386975Z","iopub.execute_input":"2024-12-06T13:23:29.387317Z","iopub.status.idle":"2024-12-06T13:23:29.932076Z","shell.execute_reply.started":"2024-12-06T13:23:29.387286Z","shell.execute_reply":"2024-12-06T13:23:29.931011Z"}},"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-12-06T13:23:29.935331Z","iopub.execute_input":"2024-12-06T13:23:29.935653Z","iopub.status.idle":"2024-12-06T13:23:29.942258Z","shell.execute_reply.started":"2024-12-06T13:23:29.935621Z","shell.execute_reply":"2024-12-06T13:23:29.941222Z"}},"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-12-06T13:23:29.943476Z","iopub.execute_input":"2024-12-06T13:23:29.943777Z","iopub.status.idle":"2024-12-06T13:23:29.958613Z","shell.execute_reply.started":"2024-12-06T13:23:29.943747Z","shell.execute_reply":"2024-12-06T13:23:29.957520Z"}},"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-12-06T13:23:29.959975Z","iopub.execute_input":"2024-12-06T13:23:29.960345Z","iopub.status.idle":"2024-12-06T13:23:30.044936Z","shell.execute_reply.started":"2024-12-06T13:23:29.960313Z","shell.execute_reply":"2024-12-06T13:23:30.043852Z"}},"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-12-06T13:23:30.046245Z","iopub.execute_input":"2024-12-06T13:23:30.046570Z","iopub.status.idle":"2024-12-06T13:23:30.052093Z","shell.execute_reply.started":"2024-12-06T13:23:30.046538Z","shell.execute_reply":"2024-12-06T13:23:30.051085Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target = processed_train[\"PCIAT-PCIAT_Total\"] #sii","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T13:23:30.053198Z","iopub.execute_input":"2024-12-06T13:23:30.053484Z","iopub.status.idle":"2024-12-06T13:23:30.065410Z","shell.execute_reply.started":"2024-12-06T13:23:30.053455Z","shell.execute_reply":"2024-12-06T13:23:30.064303Z"}},"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-12-06T13:23:30.066452Z","iopub.execute_input":"2024-12-06T13:23:30.066750Z","iopub.status.idle":"2024-12-06T13:23:30.084493Z","shell.execute_reply.started":"2024-12-06T13:23:30.066706Z","shell.execute_reply":"2024-12-06T13:23:30.083467Z"}},"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-12-06T13:23:30.085690Z","iopub.execute_input":"2024-12-06T13:23:30.085993Z","iopub.status.idle":"2024-12-06T13:23:30.096794Z","shell.execute_reply.started":"2024-12-06T13:23:30.085961Z","shell.execute_reply":"2024-12-06T13:23:30.095754Z"}},"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-12-06T13:23:30.098021Z","iopub.execute_input":"2024-12-06T13:23:30.098354Z","iopub.status.idle":"2024-12-06T13:23:30.109639Z","shell.execute_reply.started":"2024-12-06T13:23:30.098325Z","shell.execute_reply":"2024-12-06T13:23:30.108659Z"}},"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-12-06T13:23:30.110940Z","iopub.execute_input":"2024-12-06T13:23:30.111296Z","iopub.status.idle":"2024-12-06T13:23:30.120872Z","shell.execute_reply.started":"2024-12-06T13:23:30.111265Z","shell.execute_reply":"2024-12-06T13:23:30.119910Z"}},"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-12-06T13:23:30.122167Z","iopub.execute_input":"2024-12-06T13:23:30.122553Z","iopub.status.idle":"2024-12-06T13:23:30.135470Z","shell.execute_reply.started":"2024-12-06T13:23:30.122509Z","shell.execute_reply":"2024-12-06T13:23:30.134476Z"}},"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-12-06T13:23:30.136612Z","iopub.execute_input":"2024-12-06T13:23:30.136917Z","iopub.status.idle":"2024-12-06T13:23:30.155455Z","shell.execute_reply.started":"2024-12-06T13:23:30.136888Z","shell.execute_reply":"2024-12-06T13:23:30.154525Z"}},"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-12-06T13:23:30.156511Z","iopub.execute_input":"2024-12-06T13:23:30.156791Z","iopub.status.idle":"2024-12-06T13:23:30.745765Z","shell.execute_reply.started":"2024-12-06T13:23:30.156762Z","shell.execute_reply":"2024-12-06T13:23:30.744780Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T13:23:30.747252Z","iopub.execute_input":"2024-12-06T13:23:30.747663Z","iopub.status.idle":"2024-12-06T13:23:30.755282Z","shell.execute_reply.started":"2024-12-06T13:23:30.747617Z","shell.execute_reply":"2024-12-06T13:23:30.754253Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_ids = test[\"id\"]\ntest_ids","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T13:23:30.756647Z","iopub.execute_input":"2024-12-06T13:23:30.757101Z","iopub.status.idle":"2024-12-06T13:23:30.769741Z","shell.execute_reply.started":"2024-12-06T13:23:30.757053Z","shell.execute_reply":"2024-12-06T13:23:30.768700Z"}},"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-12-06T13:23:30.771187Z","iopub.execute_input":"2024-12-06T13:23:30.771603Z","iopub.status.idle":"2024-12-06T13:23:30.781407Z","shell.execute_reply.started":"2024-12-06T13:23:30.771558Z","shell.execute_reply":"2024-12-06T13:23:30.780605Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-06T13:23:30.782429Z","iopub.execute_input":"2024-12-06T13:23:30.782727Z","iopub.status.idle":"2024-12-06T13:23:30.805411Z","shell.execute_reply.started":"2024-12-06T13:23:30.782695Z","shell.execute_reply":"2024-12-06T13:23:30.804499Z"}},"outputs":[],"execution_count":null}]}