{"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":"https://youtu.be/ZOfokoMGFO4?si=xnEvjVU4Eb61vYA0","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import classification_report, confusion_matrix\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.decomposition import PCA","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-11-16T04:05:04.349773Z","iopub.execute_input":"2024-11-16T04:05:04.350224Z","iopub.status.idle":"2024-11-16T04:05:04.357533Z","shell.execute_reply.started":"2024-11-16T04:05:04.350182Z","shell.execute_reply":"2024-11-16T04:05:04.356182Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:04.361069Z","iopub.execute_input":"2024-11-16T04:05:04.362152Z","iopub.status.idle":"2024-11-16T04:05:04.452102Z","shell.execute_reply.started":"2024-11-16T04:05:04.362107Z","shell.execute_reply":"2024-11-16T04:05:04.450934Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.describe().transpose()","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:04.454302Z","iopub.execute_input":"2024-11-16T04:05:04.454710Z","iopub.status.idle":"2024-11-16T04:05:04.628241Z","shell.execute_reply.started":"2024-11-16T04:05:04.454668Z","shell.execute_reply":"2024-11-16T04:05:04.627121Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.info()","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:04.629630Z","iopub.execute_input":"2024-11-16T04:05:04.629977Z","iopub.status.idle":"2024-11-16T04:05:04.654198Z","shell.execute_reply.started":"2024-11-16T04:05:04.629942Z","shell.execute_reply":"2024-11-16T04:05:04.652915Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data['sii'].value_counts()\n\n#This shows us the dataset is inbalanced, most results fall into lower categories","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:04.657452Z","iopub.execute_input":"2024-11-16T04:05:04.657900Z","iopub.status.idle":"2024-11-16T04:05:04.670836Z","shell.execute_reply.started":"2024-11-16T04:05:04.657859Z","shell.execute_reply":"2024-11-16T04:05:04.669590Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#select columns with more than 50% non null values\nthreshold = 0.5 * len(train_data)\ncolumns_with_data = train_data.columns[train_data.isnull().sum() < threshold]\ntrain_data = train_data[columns_with_data]\n#insert 0 for missing values\ntrain_data = train_data.fillna(0)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:04.672204Z","iopub.execute_input":"2024-11-16T04:05:04.672624Z","iopub.status.idle":"2024-11-16T04:05:04.698657Z","shell.execute_reply.started":"2024-11-16T04:05:04.672560Z","shell.execute_reply":"2024-11-16T04:05:04.697457Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target_column = 'sii'\n#remove columns with missing target values\ntrain_data_cleaned = train_data.dropna(subset=[target_column])\ntrain_data_cleaned.head()\ntrain_data_cleaned.info()\n#look how nice that data looks now","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:04.700180Z","iopub.execute_input":"2024-11-16T04:05:04.700678Z","iopub.status.idle":"2024-11-16T04:05:04.727648Z","shell.execute_reply.started":"2024-11-16T04:05:04.700625Z","shell.execute_reply":"2024-11-16T04:05:04.726391Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Exploratory Data Analysis**","metadata":{}},{"cell_type":"code","source":"#columns with categorical data include various seasonal and demographic features\ncategorical_columns = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', 'FGC-Season', 'BIA-Season', 'PCIAT-Season', 'SDS-Season', 'PreInt_EduHx-Season']\nplt.figure(figsize=(16, 24))\nfor i, col in enumerate(categorical_columns, 1):\n    plt.subplot(4, 2, i)\n    sns.boxplot(x=col, y='sii', data=train_data_cleaned)\n    plt.xticks(rotation=45)\n    plt.title(f\"'sii' cs {col}\")\nplt.tight_layout()\nplt.show()\n\n#shows relationship between target variable and each categorical column","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:04.729117Z","iopub.execute_input":"2024-11-16T04:05:04.730681Z","iopub.status.idle":"2024-11-16T04:05:07.140875Z","shell.execute_reply.started":"2024-11-16T04:05:04.730611Z","shell.execute_reply":"2024-11-16T04:05:07.139569Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"numerical_cols = train_data_cleaned.select_dtypes(include=['float64', 'int64']).columns\nplots_per_row = 5\nn_rows = (len(numerical_cols) + plots_per_row - 1)\nplt.figure(figsize=(20, 4 * n_rows))\nfor i, col in enumerate(numerical_cols):\n    plt.subplot(n_rows, plots_per_row, i + 1)\n    sns.boxplot(x='sii', y=col, data=train_data_cleaned)\n    plt.title(col)\n    plt.tight_layout()\nplt.show()\n\n#shows relationship between target variable and each numerical column","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:05:07.142534Z","iopub.execute_input":"2024-11-16T04:05:07.143004Z","iopub.status.idle":"2024-11-16T04:06:11.964732Z","shell.execute_reply.started":"2024-11-16T04:05:07.142954Z","shell.execute_reply":"2024-11-16T04:06:11.963500Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#encode columns related to seasons in our dataset\nseason_cols = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', 'FGC-Season', 'BIA-Season', 'PCIAT-Season', 'SDS-Season', 'PreInt_EduHx-Season']\nseason_mapping = {\n    'Spring': 0,\n    'Summer': 1,\n    'Fall': 2,\n    'Winter': 3\n}\nfor col in season_cols:\n    if col in train_data_cleaned.columns:\n        train_data_cleaned[col] = train_data_cleaned[col].replace(season_mapping)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:11.966161Z","iopub.execute_input":"2024-11-16T04:06:11.966594Z","iopub.status.idle":"2024-11-16T04:06:12.013939Z","shell.execute_reply.started":"2024-11-16T04:06:11.966528Z","shell.execute_reply":"2024-11-16T04:06:12.012749Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#drop the ID because its useless\ntrain_data_no_id = train_data_cleaned.drop(columns=['id'], errors='ignore')\n#how strongly are pairs of values related to eachother (+ = directRelationship, - = inverse relationship)\ncorrelation_matrix = train_data_no_id.corr()\nplt.figure(figsize=(30, 30))\nsns.heatmap(correlation_matrix, annot=True, fmt='.1f', cmap='coolwarm', square=True)\nplt.title('Correlation Heatmap')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:12.017696Z","iopub.execute_input":"2024-11-16T04:06:12.018083Z","iopub.status.idle":"2024-11-16T04:06:23.733054Z","shell.execute_reply.started":"2024-11-16T04:06:12.018043Z","shell.execute_reply":"2024-11-16T04:06:23.731458Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#some train data isn't in the testing data, so we only use shared columns\ncommon_columns = train_data_cleaned.columns.intersection(test_data.columns)\n#feature matrix\nX = train_data_cleaned[common_columns].drop(columns=['id'])\n#target vector\ny = train_data_cleaned['sii']","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:23.734635Z","iopub.execute_input":"2024-11-16T04:06:23.735116Z","iopub.status.idle":"2024-11-16T04:06:23.746572Z","shell.execute_reply.started":"2024-11-16T04:06:23.735069Z","shell.execute_reply":"2024-11-16T04:06:23.745151Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:23.748195Z","iopub.execute_input":"2024-11-16T04:06:23.748661Z","iopub.status.idle":"2024-11-16T04:06:23.761255Z","shell.execute_reply.started":"2024-11-16T04:06:23.748612Z","shell.execute_reply":"2024-11-16T04:06:23.759850Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#feature scaling\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.transform(X_test)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:23.762759Z","iopub.execute_input":"2024-11-16T04:06:23.763180Z","iopub.status.idle":"2024-11-16T04:06:23.783102Z","shell.execute_reply.started":"2024-11-16T04:06:23.763140Z","shell.execute_reply":"2024-11-16T04:06:23.781705Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#use principle component analysis to reduce the dimentionality of scaled training and testing sets\n#preserve 95% of variance in data\npca = PCA(n_components=0.95)\nX_train_pca = pca.fit_transform(X_train_scaled)\nX_test_pca = pca.transform(X_test_scaled)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:23.784598Z","iopub.execute_input":"2024-11-16T04:06:23.784946Z","iopub.status.idle":"2024-11-16T04:06:23.834111Z","shell.execute_reply.started":"2024-11-16T04:06:23.784910Z","shell.execute_reply":"2024-11-16T04:06:23.831521Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#instance of random forest classifier, use 100 trees, limit the max depth of each tree to 10\nrf_model = RandomForestClassifier(n_estimators=100, random_state=42, max_depth=10, min_samples_split=10, min_samples_leaf=4)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:23.837292Z","iopub.execute_input":"2024-11-16T04:06:23.842003Z","iopub.status.idle":"2024-11-16T04:06:23.853890Z","shell.execute_reply.started":"2024-11-16T04:06:23.841944Z","shell.execute_reply":"2024-11-16T04:06:23.852691Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"rf_model.fit(X_train_pca, y_train)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:23.856713Z","iopub.execute_input":"2024-11-16T04:06:23.858243Z","iopub.status.idle":"2024-11-16T04:06:25.087327Z","shell.execute_reply.started":"2024-11-16T04:06:23.858166Z","shell.execute_reply":"2024-11-16T04:06:25.086200Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model Evaluation","metadata":{}},{"cell_type":"code","source":"y_pred = rf_model.predict(X_test_pca)\n\nprint(\"Classification Report:\")\nprint(classification_report(y_test, y_pred))\n\n#visualize correct and incorrect predictions for each class, helping us identify where the model struggles\nprint(\"Confusion Matrix:\")\nprint(confusion_matrix(y_test, y_pred))\naccuracy = rf_model.score(X_test_pca, y_test)\nprint(f\"Model Accuracy: {accuracy}\")","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:25.088934Z","iopub.execute_input":"2024-11-16T04:06:25.089324Z","iopub.status.idle":"2024-11-16T04:06:25.150979Z","shell.execute_reply.started":"2024-11-16T04:06:25.089283Z","shell.execute_reply":"2024-11-16T04:06:25.149588Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#submission\nseason_cols = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', 'FGC-Season', 'BIA-Season', 'PCIAT-Season', 'SDS-Season', 'PreInt_EduHx-Season']\nseason_mapping = {'Spring': 0, 'Summer': 1, 'Fall': 2, 'Winter': 3}\nfor col in season_cols:\n    if col in test_data.columns:\n        test_data[col] = test_data[col].map(season_mapping)","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:25.152488Z","iopub.execute_input":"2024-11-16T04:06:25.153023Z","iopub.status.idle":"2024-11-16T04:06:25.167903Z","shell.execute_reply.started":"2024-11-16T04:06:25.152966Z","shell.execute_reply":"2024-11-16T04:06:25.166668Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data.fillna(0, inplace=True)\ncommon_columns = train_data_cleaned.columns.intersection(test_data.columns)\nX_test_data = test_data[common_columns].drop(columns=['id'])\nX_test_scaled = scaler.transform(X_test_data)\nX_test_pca = pca.transform(X_test_scaled)\npredictions = rf_model.predict(X_test_pca)\nsubmission = pd.DataFrame({\n    'id': test_data['id'],\n    'sii': predictions\n})\nsubmission.to_csv('submission.csv', index=False)\nprint(submission.head())","metadata":{"execution":{"iopub.status.busy":"2024-11-16T04:06:25.169487Z","iopub.execute_input":"2024-11-16T04:06:25.169917Z","iopub.status.idle":"2024-11-16T04:06:25.204343Z","shell.execute_reply.started":"2024-11-16T04:06:25.169877Z","shell.execute_reply":"2024-11-16T04:06:25.203116Z"},"trusted":true},"outputs":[],"execution_count":null}]}