{"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":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **Dominant Factor** - Problematic Internet Use","metadata":{}},{"cell_type":"markdown","source":"I wanted to explore whether it could be all be explained by a few key variables.","metadata":{}},{"cell_type":"code","source":"# Packages \n# Data Processing \nimport numpy as np \nimport pandas as pd \n# Visualization \nimport matplotlib.pyplot as plt \nplt.rcParams['figure.dpi'] = 200 \nimport seaborn as sns \n# Statistics \nimport math \nfrom scipy import stats \nfrom scipy.stats import norm \n# File Path \nimport os \nfor dirname, _, filenames in os.walk('/kaggle/input'): \n    for filename in filenames: \n        print(os.path.join(dirname, filename))\n \nimport re\nfrom colorama import Fore, Style\nfrom tqdm import tqdm\nfrom IPython.display import clear_output\nfrom concurrent.futures import ThreadPoolExecutor\nimport polars as pl\nfrom sklearn.base import clone\nfrom copy import deepcopy\nimport optuna\nfrom scipy.optimize import minimize","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-10-26T03:32:47.491401Z","iopub.execute_input":"2024-10-26T03:32:47.491952Z","iopub.status.idle":"2024-10-26T03:32:48.810072Z","shell.execute_reply.started":"2024-10-26T03:32:47.491891Z","shell.execute_reply":"2024-10-26T03:32:48.808923Z"},"_kg_hide-output":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Version check\nprint(f\"numpy version: {np.__version__}\")\nprint(f\"pandas version: {pd.__version__}\")","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:32:48.812279Z","iopub.execute_input":"2024-10-26T03:32:48.812627Z","iopub.status.idle":"2024-10-26T03:32:48.818603Z","shell.execute_reply.started":"2024-10-26T03:32:48.812591Z","shell.execute_reply":"2024-10-26T03:32:48.817358Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Ignore Warning\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:32:48.820399Z","iopub.execute_input":"2024-10-26T03:32:48.820834Z","iopub.status.idle":"2024-10-26T03:32:48.831586Z","shell.execute_reply.started":"2024-10-26T03:32:48.820786Z","shell.execute_reply":"2024-10-26T03:32:48.830170Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# setting\npath_root = \"/kaggle/input/\"\nseed = 394\npd.set_option('display.max_rows', 200)\npd.set_option('display.max_columns', 200)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:32:48.833251Z","iopub.execute_input":"2024-10-26T03:32:48.833666Z","iopub.status.idle":"2024-10-26T03:32:48.845200Z","shell.execute_reply.started":"2024-10-26T03:32:48.833617Z","shell.execute_reply":"2024-10-26T03:32:48.843606Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 1. Overview","metadata":{}},{"cell_type":"markdown","source":"## 1.1. Preprocess","metadata":{}},{"cell_type":"code","source":"%%time\n\ndef process_file(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    df.drop('step', axis=1, inplace=True)\n    return df.describe().values.reshape(-1), filename.split('=')[1]\n\ndef load_time_series(dirname) -> pd.DataFrame:\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    stats, indexes = zip(*results)\n    \n    df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))])\n    df['id'] = indexes\n    \n    return df\n\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\ntrain_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\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\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)\n\nfeaturesCols = ['Basic_Demos-Enroll_Season', 'Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-Season', 'CGAS-CGAS_Score', 'Physical-Season', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Season', 'Fitness_Endurance-Max_Stage',\n                'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                'FGC-Season', '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', 'BIA-Season',\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-Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-Season',\n                'PAQ_C-PAQ_C_Total', 'SDS-Season', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T', 'PreInt_EduHx-Season',\n                'PreInt_EduHx-computerinternet_hoursday', 'sii']\n\nfeaturesCols += time_series_cols\n\ntrain = train[featuresCols]\ntrain = train.dropna(subset='sii')\n\ncat_c = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', \n          'FGC-Season', 'BIA-Season', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', 'PreInt_EduHx-Season']\n\ndef update(df):\n    for c in cat_c: \n        df[c] = df[c].fillna('Missing')\n        df[c] = df[c].astype('category')\n    return df\n        \ntrain = update(train)\ntest = update(test)\n\ndef create_mapping(column, dataset):\n    unique_values = dataset[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\n\nfor col in cat_c:\n    mapping_train = create_mapping(col, train)\n    mapping_test = create_mapping(col, test)\n    \n    train[col] = train[col].replace(mapping_train).astype(int)\n    test[col] = test[col].replace(mapping_test).astype(int)\n\nprint(f'Train Shape : {train.shape} || Test Shape : {test.shape}')","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:32:48.849597Z","iopub.execute_input":"2024-10-26T03:32:48.850255Z","iopub.status.idle":"2024-10-26T03:34:24.431876Z","shell.execute_reply.started":"2024-10-26T03:32:48.850215Z","shell.execute_reply":"2024-10-26T03:34:24.430665Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train = train\ndf_test = test","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:24.433290Z","iopub.execute_input":"2024-10-26T03:34:24.433645Z","iopub.status.idle":"2024-10-26T03:34:24.439640Z","shell.execute_reply.started":"2024-10-26T03:34:24.433609Z","shell.execute_reply":"2024-10-26T03:34:24.438517Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1.2. Overview","metadata":{}},{"cell_type":"code","source":"display(df_train.head())\ndisplay(df_train.tail())","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:24.441079Z","iopub.execute_input":"2024-10-26T03:34:24.441516Z","iopub.status.idle":"2024-10-26T03:34:24.693141Z","shell.execute_reply.started":"2024-10-26T03:34:24.441478Z","shell.execute_reply":"2024-10-26T03:34:24.691965Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"display(df_test.head())\ndisplay(df_test.tail())","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:24.694371Z","iopub.execute_input":"2024-10-26T03:34:24.694701Z","iopub.status.idle":"2024-10-26T03:34:24.920643Z","shell.execute_reply.started":"2024-10-26T03:34:24.694666Z","shell.execute_reply":"2024-10-26T03:34:24.919444Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.columns","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:24.922256Z","iopub.execute_input":"2024-10-26T03:34:24.922734Z","iopub.status.idle":"2024-10-26T03:34:24.930446Z","shell.execute_reply.started":"2024-10-26T03:34:24.922682Z","shell.execute_reply":"2024-10-26T03:34:24.929296Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_datadict = pd.read_csv(path_root + \"child-mind-institute-problematic-internet-use/data_dictionary.csv\")\n# df_datadict","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:24.931820Z","iopub.execute_input":"2024-10-26T03:34:24.932231Z","iopub.status.idle":"2024-10-26T03:34:24.967169Z","shell.execute_reply.started":"2024-10-26T03:34:24.932194Z","shell.execute_reply":"2024-10-26T03:34:24.965889Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.info()","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:24.968616Z","iopub.execute_input":"2024-10-26T03:34:24.969036Z","iopub.status.idle":"2024-10-26T03:34:24.987645Z","shell.execute_reply.started":"2024-10-26T03:34:24.968995Z","shell.execute_reply":"2024-10-26T03:34:24.986278Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# descriptive statistics\ndisplay(df_train.describe().round(3).T) # numerical\n# display(df_train.describe(include = ['object', 'bool', 'category']).T) # categorical","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:24.989349Z","iopub.execute_input":"2024-10-26T03:34:24.989902Z","iopub.status.idle":"2024-10-26T03:34:25.369731Z","shell.execute_reply.started":"2024-10-26T03:34:24.989826Z","shell.execute_reply":"2024-10-26T03:34:25.368359Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df_train.to_csv(\"/kaggle/working/child-mind-institute-problematic-internet-use_train_241022.csv\", index = False)\n# df_test.to_csv(\"/kaggle/working/child-mind-institute-problematic-internet-use_test_241022.csv\", index = False)\n# df_datadict.to_csv(\"/kaggle/working/child-mind-institute-problematic-internet-use_dict_241022.csv\", index = False)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:25.371368Z","iopub.execute_input":"2024-10-26T03:34:25.371814Z","iopub.status.idle":"2024-10-26T03:34:25.377383Z","shell.execute_reply.started":"2024-10-26T03:34:25.371766Z","shell.execute_reply":"2024-10-26T03:34:25.376064Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2. Data Cleaning","metadata":{}},{"cell_type":"code","source":"# # missing values\n# df_train.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:25.383412Z","iopub.execute_input":"2024-10-26T03:34:25.383889Z","iopub.status.idle":"2024-10-26T03:34:25.400421Z","shell.execute_reply.started":"2024-10-26T03:34:25.383795Z","shell.execute_reply":"2024-10-26T03:34:25.399233Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize = (8, 8), facecolor = \"white\")\n\nsns.heatmap(\n    df_train.isnull(), vmin = 0, vmax = 1\n)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:25.401803Z","iopub.execute_input":"2024-10-26T03:34:25.402606Z","iopub.status.idle":"2024-10-26T03:34:26.758237Z","shell.execute_reply.started":"2024-10-26T03:34:25.402556Z","shell.execute_reply":"2024-10-26T03:34:26.757083Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize = (8, 4), facecolor = \"white\")\n\nsns.heatmap(\n    df_test.isnull(), vmin = 0, vmax = 1\n)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:26.759476Z","iopub.execute_input":"2024-10-26T03:34:26.759834Z","iopub.status.idle":"2024-10-26T03:34:27.432009Z","shell.execute_reply.started":"2024-10-26T03:34:26.759782Z","shell.execute_reply":"2024-10-26T03:34:27.430812Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# duplicated rows\ndf_train.loc[df_train.duplicated()]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:34:27.433618Z","iopub.execute_input":"2024-10-26T03:34:27.434096Z","iopub.status.idle":"2024-10-26T03:34:27.496124Z","shell.execute_reply.started":"2024-10-26T03:34:27.434040Z","shell.execute_reply":"2024-10-26T03:34:27.494655Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Many null values, no duplicated rows.","metadata":{}},{"cell_type":"markdown","source":"# 3. LGBM Model Inspection","metadata":{}},{"cell_type":"markdown","source":"## 3.1. Modeling","metadata":{}},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.naive_bayes import GaussianNB\nimport lightgbm as lgbm\nfrom xgboost import XGBClassifier","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:37:01.034668Z","iopub.execute_input":"2024-10-26T03:37:01.035215Z","iopub.status.idle":"2024-10-26T03:37:01.514661Z","shell.execute_reply.started":"2024-10-26T03:37:01.035158Z","shell.execute_reply":"2024-10-26T03:37:01.513421Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# model_lr = LogisticRegression()\n# model_dt = DecisionTreeClassifier(random_state = seed)\n# model_rf = RandomForestClassifier(random_state = seed)\n# model_knn = KNeighborsClassifier()\n# model_nb = GaussianNB()\nmodel_lgbm = lgbm.LGBMClassifier(verbose = -1, random_state = seed)\n# model_xgb = XGBClassifier(random_state = seed)\n\nlist_model = [\n#     model_lr, model_dt, model_rf, model_knn, model_nb, \n    model_lgbm\n#     model_xgb\n]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:37:01.517289Z","iopub.execute_input":"2024-10-26T03:37:01.517803Z","iopub.status.idle":"2024-10-26T03:37:01.524584Z","shell.execute_reply.started":"2024-10-26T03:37:01.517747Z","shell.execute_reply":"2024-10-26T03:37:01.523236Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\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)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:37:01.526038Z","iopub.execute_input":"2024-10-26T03:37:01.526415Z","iopub.status.idle":"2024-10-26T03:37:01.542612Z","shell.execute_reply.started":"2024-10-26T03:37:01.526378Z","shell.execute_reply":"2024-10-26T03:37:01.541376Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_X = df_train.drop(['sii'], axis = 1)\n# df_X = pd.get_dummies(df_X, columns = [\n#     'Gender', 'Family_History_with_Overweight', 'Freq_High_Caloric_Foods', 'Consumption_Food_between_Meals', 'Smoker', \n#     'Calories_Consumption', 'Consumption_Alcohol', 'Using_Transportation'\n# ])\n\ndf_y = df_train['sii']","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:37:01.543972Z","iopub.execute_input":"2024-10-26T03:37:01.544339Z","iopub.status.idle":"2024-10-26T03:37:01.558539Z","shell.execute_reply.started":"2024-10-26T03:37:01.544303Z","shell.execute_reply":"2024-10-26T03:37:01.557329Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_X.shape","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:37:01.561249Z","iopub.execute_input":"2024-10-26T03:37:01.561969Z","iopub.status.idle":"2024-10-26T03:37:01.570327Z","shell.execute_reply.started":"2024-10-26T03:37:01.561823Z","shell.execute_reply":"2024-10-26T03:37:01.569356Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score, classification_report, confusion_matrix","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:57:39.522484Z","iopub.execute_input":"2024-10-26T03:57:39.523010Z","iopub.status.idle":"2024-10-26T03:57:39.529056Z","shell.execute_reply.started":"2024-10-26T03:57:39.522963Z","shell.execute_reply":"2024-10-26T03:57:39.527690Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"n_folds = 4\nSKF = StratifiedKFold(n_splits = n_folds, shuffle = True, random_state = seed)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:45:18.374758Z","iopub.execute_input":"2024-10-26T03:45:18.375289Z","iopub.status.idle":"2024-10-26T03:45:18.381642Z","shell.execute_reply.started":"2024-10-26T03:45:18.375244Z","shell.execute_reply":"2024-10-26T03:45:18.380283Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nlist_oof_train = [np.zeros((len(df_X), 1)) for i in range(len(list_model))]\n# list_oof_train_proba = [np.zeros((len(df_X), 7)) for i in range(len(list_model))]\nlist_model_scores = [[[] for i in range(n_folds)] for i in range(len(list_model))]\n\nfor i, model in enumerate(list_model):\n    print()\n    print(\"=\"*40)\n    print(f\"{i}: {str(model)}\")\n    \n    n_this_fold = 1\n    \n    for tr_idx, val_idx in SKF.split(df_X, df_y):\n\n        # split\n        temp_X_tr, temp_X_val = df_X.iloc[tr_idx].to_numpy(), df_X.iloc[val_idx].to_numpy()\n        temp_y_tr, temp_y_val = df_y.iloc[tr_idx].to_numpy(), df_y.iloc[val_idx].to_numpy()\n\n        # fitting\n        model.fit(temp_X_tr, temp_y_tr)\n        \n        # prediction\n        list_oof_train[i][val_idx] = model.predict(temp_X_val).reshape(-1, 1)\n#         list_oof_train_proba[i][val_idx] = model.predict_proba(temp_X_val)\n        \n        # save auc and accuracy\n        list_model_scores[i][n_this_fold - 1] = [\n#             roc_auc_score(temp_y_val, model.predict(temp_X_val)), \n            quadratic_weighted_kappa(temp_y_val, model.predict(temp_X_val).round(0).astype(int))\n#             accuracy_score(temp_y_val, model.predict(temp_X_val))\n#             f1_score(temp_y_val, model.predict(temp_X_val))\n        ]\n        \n        print(\"-\"*20)\n        print(f\"Fold {n_this_fold} completed,\")\n#         print(f\"AUC: {list_model_scores[i][n_this_fold - 1][0]}\")\n        print(f\"Train_QWK: {quadratic_weighted_kappa(temp_y_tr, model.predict(temp_X_tr).round(0).astype(int))}\")\n        print(f\"Validation_QWK: {list_model_scores[i][n_this_fold - 1][0]}\")\n#         print(f\"F1 Score: {list_model_scores[i][n_this_fold - 1][2]}\")\n        n_this_fold += 1\n\nprint(\"=\"*40 + \" fin.\")","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:55:13.847602Z","iopub.execute_input":"2024-10-26T03:55:13.848211Z","iopub.status.idle":"2024-10-26T03:55:41.314381Z","shell.execute_reply.started":"2024-10-26T03:55:13.848153Z","shell.execute_reply":"2024-10-26T03:55:41.312957Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3.2. Inspection","metadata":{}},{"cell_type":"code","source":"for i, model in enumerate(list_model):\n    \n    print(\"\")\n    print(str(model))\n\n    report = classification_report(df_y.to_numpy(), list_oof_train[i])\n    print(report)\n\n    # confusion matrix\n    temp_confusion_matrix = confusion_matrix(df_y.to_numpy(), list_oof_train[i])\n    plt.figure(figsize = (3, 3), facecolor = \"white\")\n    sns.heatmap(\n        temp_confusion_matrix,\n        annot = True, fmt = 'd', cmap = 'Blues'\n    )\n    plt.xlabel('Predicted')\n    plt.ylabel('Actual')\n    plt.title('Confusion Matrix')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-26T03:58:22.349356Z","iopub.execute_input":"2024-10-26T03:58:22.349822Z","iopub.status.idle":"2024-10-26T03:58:22.714239Z","shell.execute_reply.started":"2024-10-26T03:58:22.349776Z","shell.execute_reply":"2024-10-26T03:58:22.713162Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"feature_importance_df = pd.DataFrame({\n    'Feature': df_X.columns,\n    'Importance': model_lgbm.booster_.feature_importance(importance_type = 'gain')\n})\n\nfeature_importance_df = feature_importance_df.sort_values(by = 'Importance', ascending = False)\n\nplt.figure(figsize = (20, 30))\nsns.barplot(x = 'Importance', y = 'Feature', data = feature_importance_df.head(100)) \nplt.title(\"Feature Importance\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-26T04:00:15.942083Z","iopub.execute_input":"2024-10-26T04:00:15.942580Z","iopub.status.idle":"2024-10-26T04:00:19.119626Z","shell.execute_reply.started":"2024-10-26T04:00:15.942533Z","shell.execute_reply":"2024-10-26T04:00:19.118229Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn.inspection import permutation_importance","metadata":{"execution":{"iopub.status.busy":"2024-10-26T04:02:34.304375Z","iopub.execute_input":"2024-10-26T04:02:34.304819Z","iopub.status.idle":"2024-10-26T04:02:34.310661Z","shell.execute_reply.started":"2024-10-26T04:02:34.304782Z","shell.execute_reply":"2024-10-26T04:02:34.309423Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\ndf_X_tr, df_X_val, df_y_tr, df_y_val = train_test_split(\n    df_X, df_y, \n    test_size = 0.1, random_state = seed, \n    stratify = df_y\n)\n\nPMI = permutation_importance(\n    list_model[0], df_X_val, df_y_val,\n    random_state = seed\n)\n\nfor i in PMI.importances_mean.argsort()[::-1]:\n    print(f\"{PMI.importances_mean[i]:.3f} +/- {PMI.importances_std[i]:.3f}: {df_X_val.columns[i]:<8}\")","metadata":{"execution":{"iopub.status.busy":"2024-10-26T04:03:42.243030Z","iopub.execute_input":"2024-10-26T04:03:42.243586Z","iopub.status.idle":"2024-10-26T04:03:56.342291Z","shell.execute_reply.started":"2024-10-26T04:03:42.243542Z","shell.execute_reply":"2024-10-26T04:03:56.341155Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3.3. Are some factors dominating?","metadata":{}},{"cell_type":"code","source":"model_lgbm_dim = lgbm.LGBMClassifier(verbose = -1, random_state = seed)\n\nlist_model_dim = [\n    model_lgbm_dim\n]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T04:30:53.741565Z","iopub.execute_input":"2024-10-26T04:30:53.742079Z","iopub.status.idle":"2024-10-26T04:30:53.748114Z","shell.execute_reply.started":"2024-10-26T04:30:53.742030Z","shell.execute_reply":"2024-10-26T04:30:53.746681Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_X_dim = df_train[[\n    'SDS-SDS_Total_Raw', 'PreInt_EduHx-computerinternet_hoursday', 'Basic_Demos-Age', 'PAQ_C-PAQ_C_Total',\n    'BIA-BIA_SMM', 'Physical-Height', 'CGAS-CGAS_Score', 'FGC-FGC_CU'\n]]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T04:30:21.412982Z","iopub.execute_input":"2024-10-26T04:30:21.413406Z","iopub.status.idle":"2024-10-26T04:30:21.424732Z","shell.execute_reply.started":"2024-10-26T04:30:21.413369Z","shell.execute_reply":"2024-10-26T04:30:21.422970Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nlist_oof_train = [np.zeros((len(df_X_dim), 1)) for i in range(len(list_model_dim))]\n# list_oof_train_proba = [np.zeros((len(df_X_dim), 7)) for i in range(len(list_model_dim))]\nlist_model_scores = [[[] for i in range(n_folds)] for i in range(len(list_model_dim))]\n\nfor i, model in enumerate(list_model_dim):\n    print()\n    print(\"=\"*40)\n    print(f\"{i}: {str(model)}\")\n    \n    n_this_fold = 1\n    \n    for tr_idx, val_idx in SKF.split(df_X_dim, df_y):\n\n        # split\n        temp_X_tr, temp_X_val = df_X_dim.iloc[tr_idx].to_numpy(), df_X_dim.iloc[val_idx].to_numpy()\n        temp_y_tr, temp_y_val = df_y.iloc[tr_idx].to_numpy(), df_y.iloc[val_idx].to_numpy()\n\n        # fitting\n        model.fit(temp_X_tr, temp_y_tr)\n        \n        # prediction\n        list_oof_train[i][val_idx] = model.predict(temp_X_val).reshape(-1, 1)\n#         list_oof_train_proba[i][val_idx] = model.predict_proba(temp_X_val)\n        \n        # save auc and accuracy\n        list_model_scores[i][n_this_fold - 1] = [\n#             roc_auc_score(temp_y_val, model.predict(temp_X_val)), \n            quadratic_weighted_kappa(temp_y_val, model.predict(temp_X_val).round(0).astype(int))\n#             accuracy_score(temp_y_val, model.predict(temp_X_val))\n#             f1_score(temp_y_val, model.predict(temp_X_val))\n        ]\n        \n        print(\"-\"*20)\n        print(f\"Fold {n_this_fold} completed,\")\n#         print(f\"AUC: {list_model_scores[i][n_this_fold - 1][0]}\")\n        print(f\"Train_QWK: {quadratic_weighted_kappa(temp_y_tr, model.predict(temp_X_tr).round(0).astype(int))}\")\n        print(f\"Validation_QWK: {list_model_scores[i][n_this_fold - 1][0]}\")\n#         print(f\"F1 Score: {list_model_scores[i][n_this_fold - 1][2]}\")\n        n_this_fold += 1\n\nprint(\"=\"*40 + \" fin.\")","metadata":{"execution":{"iopub.status.busy":"2024-10-26T04:34:23.235106Z","iopub.execute_input":"2024-10-26T04:34:23.235585Z","iopub.status.idle":"2024-10-26T04:34:25.445001Z","shell.execute_reply.started":"2024-10-26T04:34:23.235542Z","shell.execute_reply":"2024-10-26T04:34:25.443791Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i, model in enumerate(list_model):\n    \n    print(\"\")\n    print(str(model))\n\n    report = classification_report(df_y.to_numpy(), list_oof_train[i])\n    print(report)\n\n    # confusion matrix\n    temp_confusion_matrix = confusion_matrix(df_y.to_numpy(), list_oof_train[i])\n    plt.figure(figsize = (3, 3), facecolor = \"white\")\n    sns.heatmap(\n        temp_confusion_matrix,\n        annot = True, fmt = 'd', cmap = 'Blues'\n    )\n    plt.xlabel('Predicted')\n    plt.ylabel('Actual')\n    plt.title('Confusion Matrix')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-26T04:35:01.557747Z","iopub.execute_input":"2024-10-26T04:35:01.558800Z","iopub.status.idle":"2024-10-26T04:35:01.934609Z","shell.execute_reply.started":"2024-10-26T04:35:01.558746Z","shell.execute_reply":"2024-10-26T04:35:01.933373Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 4. Conclusion","metadata":{}},{"cell_type":"markdown","source":"Compare Average Validation QWK:  \n\nAll Features vs. 8 Top Features  \n0.326 vs. 0.315","metadata":{}},{"cell_type":"markdown","source":"I cannot say for sure that some features are dominant.  \nBut it doesn't seem like there is a huge difference in performance between two models.","metadata":{}}]}