{"metadata":{"kernelspec":{"display_name":"deep_learning","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.13"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30775,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# HP\ntrain_path = '/kaggle/input/child-mind-institute-problematic-internet-use/train.csv'\ntest_path = '/kaggle/input/child-mind-institute-problematic-internet-use/test.csv'\nrandom_state = 42","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load data\ntrain_pd = pd.read_csv(train_path)\ntest_pd = pd.read_csv(test_path)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_pd.drop(columns=['PCIAT-PCIAT_01', 'PCIAT-PCIAT_02', 'PCIAT-PCIAT_03', 'PCIAT-PCIAT_04', 'PCIAT-PCIAT_05', \n                       'PCIAT-PCIAT_06', 'PCIAT-PCIAT_07', 'PCIAT-PCIAT_08', 'PCIAT-PCIAT_09', 'PCIAT-PCIAT_10', \n                       'PCIAT-PCIAT_11', 'PCIAT-PCIAT_12', 'PCIAT-PCIAT_13', 'PCIAT-PCIAT_14', 'PCIAT-PCIAT_15', \n                       'PCIAT-PCIAT_16', 'PCIAT-PCIAT_17', 'PCIAT-PCIAT_18', 'PCIAT-PCIAT_19', 'PCIAT-PCIAT_20',\n                       'PCIAT-PCIAT_Total', 'PCIAT-Season'], \ninplace=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# lets have a look at the data\ntrain_pd.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Demographics - Information about age and sex of participants.\n# Internet Use - Number of hours of using computer/internet per day.\n# Children's Global Assessment Scale - Numeric scale used by mental health clinicians to rate the general functioning of youths under the age of 18.\n# Physical Measures - Collection of blood pressure, heart rate, height, weight and waist, and hip measurements.\n# FitnessGram Vitals and Treadmill - Measurements of cardiovascular fitness assessed using the NHANES treadmill protocol.\n# FitnessGram Child - Health related physical fitness assessment measuring five different parameters including aerobic capacity, muscular strength, muscular endurance, flexibility, and body composition.\n# Bio-electric Impedance Analysis - Measure of key body composition elements, including BMI, fat, muscle, and water content.\n# Physical Activity Questionnaire - Information about children's participation in vigorous activities over the last 7 days.\n# Sleep Disturbance Scale - Scale to categorize sleep disorders in children.\n# Actigraphy - Objective measure of ecological physical activity through a research-grade biotracker.\n# Parent-Child Internet Addiction Test - 20-item scale that measures characteristics and behaviors associated with compulsive use of the Internet including compulsivity, escapism, and dependency.\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# where are the NaNs\nprint(train_pd.isna().sum())","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# split the data into train and val\nfrom sklearn.model_selection import train_test_split\n\ntrain, val = train_test_split(train_pd, test_size=0.2, random_state=random_state)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# define X and y\nX_train = train.drop(columns=['sii', 'id'])\ny_train = train['sii']\n\nX_val = val.drop(columns=['sii', 'id'])\ny_val = val['sii']","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# fill the NaNs in X_train with the most common value\nX_train = X_train.fillna(X_train.mode().iloc[0])\nX_val = X_val.fillna(X_train.mode().iloc[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# trans the seasons to One-hot\nX_train_encoded = pd.get_dummies(X_train, \n                                 columns=['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', 'FGC-Season', \n                                          'BIA-Season', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', 'PreInt_EduHx-Season'],\n                                          drop_first=True)\ntrain_columns = X_train_encoded.columns\nX_val_encoded = pd.get_dummies(X_val, \n                               columns=['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', \n                                               'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', \n                                               'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', \n                                               'PreInt_EduHx-Season'], \n                               drop_first=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# split the  train data into y_nan and y_notnan\nX_train_y_nan = X_train_encoded[y_train.isna()]\ny_train_nan = y_train[y_train.isna()]\n\nX_train_y_notnan = X_train_encoded[~y_train.isna()]\ny_train_notnan = y_train[~y_train.isna()]\n\nprint(\"y train is nan:\", len(X_train_y_nan))\nprint(\"y train is not nan:\", len(X_train_y_notnan))\n\n# split the val data\nX_val_y_nan = X_val_encoded[y_val.isna()]\ny_val_nan = y_val[y_val.isna()]\n\nX_val_y_notnan = X_val_encoded[~y_val.isna()]\ny_val_notnan = y_val[~y_val.isna()]\n\nprint(\"y val is nan:\", len(X_val_y_nan))\nprint(\"y val is not nan:\", len(X_val_y_notnan))\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train_y_notnan.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# try MI score\nfrom sklearn.feature_selection import mutual_info_classif\n\nmi_scores = mutual_info_classif(X_train_y_notnan, y_train_notnan, random_state=random_state)\nmi_scores = pd.Series(mi_scores, name=\"MI Scores\", index=X_train_y_notnan.columns)\nmi_scores = mi_scores.sort_values(ascending=False)\n\nprint(mi_scores)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# how many features are there with MI score > 0.006\nmi_scores_threshold = 0.006\nmi_scores_filtered = mi_scores[mi_scores > mi_scores_threshold]\nprint(mi_scores_filtered)\nprint(len(mi_scores_filtered))\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# try PCA\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.decomposition import PCA\n\nstd = StandardScaler()\nX_train_std = std.fit_transform(X_train_y_notnan)\npca_0 = PCA(n_components=0.95, random_state=random_state)\nX_train_pca = pca_0.fit_transform(X_train_std)\n\nprint(pca_0.n_components_)\nprint(pca_0.explained_variance_ratio_.cumsum())","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#  OK, i will drop the features with MI score < 0.006\nmi_scores_drop = mi_scores[mi_scores < mi_scores_threshold]\nX_train_y_notnan.drop(columns=mi_scores_drop.index, inplace=True)\nX_val_y_notnan.drop(columns=mi_scores_drop.index, inplace=True)\n\nX_train_y_notnan.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# try XGBoost\nfrom xgboost import XGBClassifier\nfrom sklearn.metrics import accuracy_score\n\nxgb_0 = XGBClassifier(random_state=random_state)\nxgb_0.fit(X_train_y_notnan, y_train_notnan)\n\ny_pred_train_0 = xgb_0.predict(X_train_y_notnan)\ny_pred_val_0 = xgb_0.predict(X_val_y_notnan)\n\naccuracy_train_0 = accuracy_score(y_train_notnan, y_pred_train_0)\naccuracy_val_0 = accuracy_score(y_val_notnan, y_pred_val_0)\n\nprint(f\"Accuracy train: {accuracy_train_0:.2f}\")\nprint(f\"Accuracy val: {accuracy_val_0:.2f}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"param_grid = {\n    'max_depth': [3, 5, 7, 10],\n    'learning_rate': [0.01, 0.1, 0.3],\n    'n_estimators': [100, 200, 300],\n    'subsample': [0.8, 1.0],\n    'colsample_bytree': [0.8, 1.0]\n}\n\nfrom sklearn.model_selection import GridSearchCV\n\nxgb = XGBClassifier(random_state=random_state)\ngrid_search = GridSearchCV(estimator=xgb, param_grid=param_grid, cv=5, scoring='accuracy', n_jobs=-1)\ngrid_search.fit(X_train_y_notnan, y_train_notnan)\n\nbest_params = grid_search.best_params_\nprint(\"best params:\", best_params)\n\nxgb_best = XGBClassifier(**best_params, random_state=random_state)\nxgb_best.fit(X_train_y_notnan, y_train_notnan)\n\ny_pred_train_best = xgb_best.predict(X_train_y_notnan)\ny_pred_val_best = xgb_best.predict(X_val_y_notnan)\n\naccuracy_train_best = accuracy_score(y_train_notnan, y_pred_train_best)\naccuracy_val_best = accuracy_score(y_val_notnan, y_pred_val_best)\n\nprint(f\"train accuracy: {accuracy_train_best:.2f}\")\nprint(f\"val accuracy: {accuracy_val_best:.2f}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# index the y\ny_pred_train = pd.Series(y_pred_train_best, index=X_train_y_notnan.index)\ny_pred_val = pd.Series(y_pred_val_best, index=X_val_y_notnan.index)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train_y_nan.drop(columns=mi_scores_drop.index, inplace=True)\nX_val_y_nan.drop(columns=mi_scores_drop.index, inplace=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_nan_pred_train = xgb_best.predict(X_train_y_nan)\ny_nan_pred_val = xgb_best.predict(X_val_y_nan)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# index the y\ny_nan_pred_train = pd.Series(y_nan_pred_train, index=X_train_y_nan.index)\ny_nan_pred_val = pd.Series(y_nan_pred_val, index=X_val_y_nan.index)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_pd.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = test_pd.drop(columns=['id'])\ntest = test.fillna(X_train.mode().iloc[0])\n\ntest_encoded = pd.get_dummies(test, \n                               columns=['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', \n                                               'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', \n                                               'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', \n                                               'PreInt_EduHx-Season'], \n                               drop_first=True)\n\ntest_encoded.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# compare the columns\ntrain_columns = set(X_train_encoded.columns)\ntest_columns = set(test_encoded.columns)\n\n# find the missing columns\nmissing_columns = train_columns - test_columns\nprint(\"missing columns:\")\nprint(missing_columns)\n\n# fill the missing columns with 0\nfor col in missing_columns:\n    test_encoded[col] = 0\n\n# make sure the columns are in the same order\ntest_encoded = test_encoded.reindex(columns=X_train_encoded.columns)\n\nprint(f\"train columns: {len(X_train_encoded.columns)}\")\nprint(f\"test columns: {len(test_encoded.columns)}\")\nprint(f\"columns are the same: {list(X_train_encoded.columns) == list(test_encoded.columns)}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# drop the features with MI score < 0.006\ntest_encoded.drop(columns=mi_scores_drop.index, inplace=True)\n\ntest_encoded.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predict\ny_pred_test = xgb_best.predict(test_encoded)\n\ny_pred_test","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# output the result\noutput = pd.DataFrame({'id': test_pd['id'], 'sii': y_pred_test})\noutput.to_csv('submission.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}