{"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 libraries\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split, GridSearchCV\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder\nfrom imblearn.over_sampling import SMOTE\nfrom sklearn.metrics import classification_report, roc_auc_score, roc_curve, accuracy_score\n\n# Load the training dataset\ndata = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\nprint(data.head(2))\n\n# Check for class imbalance in the target variable\nprint(data['sii'].value_counts())\n\n# Data Analysis\nprint(data.shape)\nprint(data.describe())\nprint(data.info())\n\n# Data Cleaning\nprint(\"Null Values in Columns:\", dict(data.isna().sum()))\n\n# Fill numeric columns with their median\nnumeric_columns = data.select_dtypes(include=['number']).columns\ndata[numeric_columns] = data[numeric_columns].fillna(data[numeric_columns].median())\n\n# Fill non-numeric columns with the mode\nnon_numeric_columns = data.select_dtypes(exclude=['number']).columns\ndata[non_numeric_columns] = data[non_numeric_columns].fillna(data[non_numeric_columns].mode().iloc[0])\n\n# Verify no missing values\nprint(\"Null Values After Filling:\", data.isna().sum())\n\n# Feature Engineering\ndata = data.drop(['id', 'Fitness_Endurance-Season', 'Fitness_Endurance-Max_Stage', \n                  'Fitness_Endurance-Time_Mins', 'PAQ_A-Season', 'PAQ_A-PAQ_A_Total'], axis=1)\n\n# Encode categorical variables\nlabel_encoder = LabelEncoder()\nfor col in data.select_dtypes(include=['object']).columns:\n    if data[col].nunique() == 2:  # Binary encoding\n        data[col] = label_encoder.fit_transform(data[col])\ndata = pd.get_dummies(data, drop_first=True)\n\n# Ensure no boolean columns are left\ndata = data.astype(int)\n\n# Splitting data into features (X) and target (y)\nX = data.drop('sii', axis=1)\ny = data['sii']\n\n# Train-test split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n\n# Handle class imbalance with SMOTE\nsmote = SMOTE(random_state=42)\nX_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)\n\n# Standardize the features\nscaler = StandardScaler()\nX_train_smote_scaled = scaler.fit_transform(X_train_smote)\nX_test_scaled = scaler.transform(X_test)\n\n# Train Logistic Regression\nfrom sklearn.linear_model import LogisticRegression\nLogisticRegressionModel = LogisticRegression(penalty='l2', solver='sag', C=1.0, random_state=33)\nLogisticRegressionModel.fit(X_train_smote_scaled, y_train_smote)\n\n# Evaluate Logistic Regression\nprint('Train Score:', LogisticRegressionModel.score(X_train_smote_scaled, y_train_smote))\nprint('Test Score:', LogisticRegressionModel.score(X_test_scaled, y_test))\nprint(\"Classification Report:\\n\", classification_report(y_test, LogisticRegressionModel.predict(X_test_scaled)))\n\n# Calculate ROC-AUC\nroc_auc = roc_auc_score(y_test, LogisticRegressionModel.predict_proba(X_test_scaled), multi_class='ovr')\nprint(\"ROC-AUC Score:\", roc_auc)\n\n# Plot ROC Curve for Multiclass\nfrom sklearn.preprocessing import label_binarize\nclasses = np.unique(y_test)\ny_test_bin = label_binarize(y_test, classes=classes)\ny_pred_prob = LogisticRegressionModel.predict_proba(X_test_scaled)\n\nplt.figure(figsize=(10, 8))\nfor i, class_label in enumerate(classes):\n    fpr, tpr, _ = roc_curve(y_test_bin[:, i], y_pred_prob[:, i])\n    auc = roc_auc_score(y_test_bin[:, i], y_pred_prob[:, i])\n    plt.plot(fpr, tpr, label=f\"Class {class_label} (AUC = {auc:.2f})\", lw=2)\nplt.plot([0, 1], [0, 1], linestyle='--', color='gray', lw=2)\nplt.xlabel(\"False Positive Rate\")\nplt.ylabel(\"True Positive Rate\")\nplt.title(\"Multiclass ROC Curve\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n\n# GridSearchCV for Hyperparameter Tuning\nparam_grid = {\n    'penalty': ['l2'],\n    'C': [1, 10],\n    'solver': ['liblinear']\n}\ngrid_search = GridSearchCV(estimator=LogisticRegression(random_state=33), \n                           param_grid=param_grid, scoring='roc_auc', cv=3, verbose=1, n_jobs=-1)\ngrid_search.fit(X_train_smote_scaled, y_train_smote)\n\n# Best Model\nprint(\"Best Parameters:\", grid_search.best_params_)\nprint(\"Best ROC-AUC Score (CV):\", grid_search.best_score_)\n\n# Load the test dataset\ntest_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\n\n# Save 'id' column\ntest_ids = test_data['id'] if 'id' in test_data.columns else None\n\n# Handle missing values in test data\ntest_numeric_columns = test_data.select_dtypes(include=['number']).columns\ntest_data[test_numeric_columns] = test_data[test_numeric_columns].fillna(test_data[test_numeric_columns].median())\ntest_non_numeric_columns = test_data.select_dtypes(exclude=['number']).columns\ntest_data[test_non_numeric_columns] = test_data[test_non_numeric_columns].fillna(test_data[test_non_numeric_columns].mode().iloc[0])\n\n# Encode and align features with training\nfor col in test_data.select_dtypes(include=['object']).columns:\n    if test_data[col].nunique() == 2:\n        test_data[col] = label_encoder.fit_transform(test_data[col])\ntest_data = pd.get_dummies(test_data, drop_first=True)\nmissing_cols = set(X_train.columns) - set(test_data.columns)\nfor col in missing_cols:\n    test_data[col] = 0\ntest_data = test_data[X_train.columns]\n\n# Standardize test data\nX_test_processed = scaler.transform(test_data)\n\n# Generate predictions\ntest_predictions = LogisticRegressionModel.predict(X_test_processed)\n\n# Create a submission file\nsubmission = pd.DataFrame({'id': test_ids, 'sii': test_predictions})\nsubmission.to_csv('submission.csv', index=False)\nprint(\"Submission file created successfully!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-26T01:58:42.433071Z","iopub.execute_input":"2024-11-26T01:58:42.433486Z"}},"outputs":[],"execution_count":null}]}