{ "cells": [ { "cell_type": "markdown", "id": "c9920956", "metadata": {}, "source": [ "## Step 1: Import Libraries" ] }, { "cell_type": "code", "execution_count": 1, "id": "d8d06600", "metadata": {}, "outputs": [], "source": [ "import os\n", "import json\n", "import joblib\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import LabelEncoder\n", "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, log_loss, classification_report, confusion_matrix\n", "from xgboost import XGBClassifier" ] }, { "cell_type": "markdown", "id": "88c9c95d", "metadata": {}, "source": [ "## Step 2: Load Dataset" ] }, { "cell_type": "code", "execution_count": 2, "id": "5a9b209d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset shape: (100000, 32)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
person_idagegenderoccupationbmicountrysleep_duration_hrssleep_quality_scorerem_percentagedeep_sleep_percentage...heart_rate_resting_bpmsleep_aid_usedshift_workroom_temperature_celsiusweekend_sleep_diff_hrsseasonday_typecognitive_performance_scoresleep_disorder_riskfelt_rested
0129FemaleDriver25.7Japan6.196.622.519.3...630020.11.84AutumnWeekday73.4Healthy0
1255FemaleSoftware Engineer22.0USA8.326.926.914.9...521018.00.13WinterWeekend99.4Healthy1
2342MaleNurse25.0India3.741.020.216.2...720117.91.67SpringWeekend2.5Severe0
3437FemaleStudent29.5India6.796.417.717.7...710019.12.37SummerWeekend67.8Healthy0
4523MaleLawyer23.6Spain5.023.223.318.3...710019.71.26SummerWeekday38.1Mild0
\n", "

5 rows × 32 columns

\n", "
" ], "text/plain": [ " person_id age gender occupation bmi country \\\n", "0 1 29 Female Driver 25.7 Japan \n", "1 2 55 Female Software Engineer 22.0 USA \n", "2 3 42 Male Nurse 25.0 India \n", "3 4 37 Female Student 29.5 India \n", "4 5 23 Male Lawyer 23.6 Spain \n", "\n", " sleep_duration_hrs sleep_quality_score rem_percentage \\\n", "0 6.19 6.6 22.5 \n", "1 8.32 6.9 26.9 \n", "2 3.74 1.0 20.2 \n", "3 6.79 6.4 17.7 \n", "4 5.02 3.2 23.3 \n", "\n", " deep_sleep_percentage ... heart_rate_resting_bpm sleep_aid_used \\\n", "0 19.3 ... 63 0 \n", "1 14.9 ... 52 1 \n", "2 16.2 ... 72 0 \n", "3 17.7 ... 71 0 \n", "4 18.3 ... 71 0 \n", "\n", " shift_work room_temperature_celsius weekend_sleep_diff_hrs season \\\n", "0 0 20.1 1.84 Autumn \n", "1 0 18.0 0.13 Winter \n", "2 1 17.9 1.67 Spring \n", "3 0 19.1 2.37 Summer \n", "4 0 19.7 1.26 Summer \n", "\n", " day_type cognitive_performance_score sleep_disorder_risk felt_rested \n", "0 Weekday 73.4 Healthy 0 \n", "1 Weekend 99.4 Healthy 1 \n", "2 Weekend 2.5 Severe 0 \n", "3 Weekend 67.8 Healthy 0 \n", "4 Weekday 38.1 Mild 0 \n", "\n", "[5 rows x 32 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "sleep_disorder_risk\n", "Healthy 54156\n", "Mild 33479\n", "Moderate 8299\n", "Severe 4066\n", "Name: count, dtype: int64\n" ] } ], "source": [ "data_path = r'd:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\dataset\\sleep_health_dataset.csv'\n", "df = pd.read_csv(data_path)\n", "\n", "print('Dataset shape:', df.shape)\n", "display(df.head())\n", "\n", "target_column = 'sleep_disorder_risk'\n", "print(df[target_column].value_counts())" ] }, { "cell_type": "markdown", "id": "45fc0292", "metadata": {}, "source": [ "## Step 3: Prepare Data" ] }, { "cell_type": "code", "execution_count": 3, "id": "e716742b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X_train shape: (80000, 66)\n", "X_test shape: (20000, 66)\n", "Classes: ['Healthy', 'Mild', 'Moderate', 'Severe']\n" ] } ], "source": [ "X = df.drop(columns=[target_column, 'person_id'])\n", "y_text = df[target_column].astype(str)\n", "\n", "label_encoder = LabelEncoder()\n", "y = label_encoder.fit_transform(y_text)\n", "class_names = list(label_encoder.classes_)\n", "\n", "X = pd.get_dummies(X, drop_first=False)\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " X,\n", " y,\n", " test_size=0.2,\n", " random_state=21,\n", " stratify=y\n", ")\n", "\n", "print('X_train shape:', X_train.shape)\n", "print('X_test shape:', X_test.shape)\n", "print('Classes:', class_names)" ] }, { "cell_type": "markdown", "id": "c632cb6b", "metadata": {}, "source": [ "## Step 4: Train XGBoost Model" ] }, { "cell_type": "code", "execution_count": 4, "id": "4bab4630", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model training completed\n" ] } ], "source": [ "model = XGBClassifier(\n", " objective='multi:softprob',\n", " eval_metric='mlogloss',\n", " num_class=len(class_names),\n", " n_estimators=500,\n", " learning_rate=0.05,\n", " max_depth=5,\n", " subsample=0.9,\n", " colsample_bytree=0.9,\n", " random_state=21,\n", " n_jobs=-1\n", ")\n", "\n", "model.fit(X_train, y_train)\n", "\n", "y_pred = model.predict(X_test)\n", "y_prob = model.predict_proba(X_test)\n", "\n", "print('Model training completed')" ] }, { "cell_type": "markdown", "id": "55c1bd7c", "metadata": {}, "source": [ "## Step 5: Check Model Performance" ] }, { "cell_type": "code", "execution_count": 5, "id": "edfa16c9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.9525\n", "Weighted Precision: 0.9511\n", "Weighted Recall: 0.9525\n", "Weighted F1 Score: 0.9514\n", "Weighted ROC AUC (OvR): 0.9969\n", "Log Loss: 0.1408\n", "\n", "Classification Report:\n", "\n", " precision recall f1-score support\n", "\n", " Healthy 0.9979 0.9982 0.9980 10831\n", " Mild 0.9357 0.9668 0.9510 6696\n", " Moderate 0.7439 0.6928 0.7174 1660\n", " Severe 0.8773 0.7565 0.8124 813\n", "\n", " accuracy 0.9525 20000\n", " macro avg 0.8887 0.8536 0.8697 20000\n", "weighted avg 0.9511 0.9525 0.9514 20000\n", "\n" ] } ], "source": [ "accuracy = accuracy_score(y_test, y_pred)\n", "precision = precision_score(y_test, y_pred, average='weighted', zero_division=0)\n", "recall = recall_score(y_test, y_pred, average='weighted', zero_division=0)\n", "f1 = f1_score(y_test, y_pred, average='weighted', zero_division=0)\n", "roc_auc = roc_auc_score(y_test, y_prob, multi_class='ovr', average='weighted')\n", "loss = log_loss(y_test, y_prob)\n", "\n", "print('Accuracy:', round(accuracy, 4))\n", "print('Weighted Precision:', round(precision, 4))\n", "print('Weighted Recall:', round(recall, 4))\n", "print('Weighted F1 Score:', round(f1, 4))\n", "print('Weighted ROC AUC (OvR):', round(roc_auc, 4))\n", "print('Log Loss:', round(loss, 4))\n", "\n", "print('\\nClassification Report:\\n')\n", "print(classification_report(y_test, y_pred, target_names=class_names, digits=4, zero_division=0))" ] }, { "cell_type": "markdown", "id": "eb87f90b", "metadata": {}, "source": [ "## Step 6: Plot Confusion Matrix" ] }, { "cell_type": "code", "execution_count": 6, "id": "b22a6a06", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cm = confusion_matrix(y_test, y_pred)\n", "\n", "plt.figure(figsize=(7, 6))\n", "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names)\n", "plt.xlabel('Predicted')\n", "plt.ylabel('Actual')\n", "plt.title('Confusion Matrix')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "93ace7a7", "metadata": {}, "source": [ "## Step 7: Save Model and Metrics" ] }, { "cell_type": "code", "execution_count": 7, "id": "38fd3179", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saved model: d:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\outputs\\Sleep_Health_And_Daily_Performance\\model\\model.joblib\n", "Saved columns: d:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\outputs\\Sleep_Health_And_Daily_Performance\\model\\feature_columns.json\n", "Saved labels: d:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\outputs\\Sleep_Health_And_Daily_Performance\\model\\label_classes.json\n", "Saved target info: d:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\outputs\\Sleep_Health_And_Daily_Performance\\model\\target_info.json\n", "Saved metrics: d:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\outputs\\Sleep_Health_And_Daily_Performance\\metrics\\final_metircs.csv\n", "Saved predictions: d:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\outputs\\Sleep_Health_And_Daily_Performance\\metrics\\prediction.csv\n" ] } ], "source": [ "base_output = r'd:\\B.Tech\\Semester 04\\01 Machine Learning\\LabAssginment\\outputs\\Sleep_Health_And_Daily_Performance'\n", "model_dir = os.path.join(base_output, 'model')\n", "metrics_dir = os.path.join(base_output, 'metrics')\n", "\n", "os.makedirs(model_dir, exist_ok=True)\n", "os.makedirs(metrics_dir, exist_ok=True)\n", "\n", "model_path = os.path.join(model_dir, 'model.joblib')\n", "columns_path = os.path.join(model_dir, 'feature_columns.json')\n", "labels_path = os.path.join(model_dir, 'label_classes.json')\n", "info_path = os.path.join(model_dir, 'target_info.json')\n", "metrics_path = os.path.join(metrics_dir, 'final_metircs.csv')\n", "predictions_path = os.path.join(metrics_dir, 'prediction.csv')\n", "\n", "joblib.dump(model, model_path)\n", "with open(columns_path, 'w', encoding='utf-8') as f:\n", " json.dump(list(X.columns), f, indent=2)\n", "with open(labels_path, 'w', encoding='utf-8') as f:\n", " json.dump(class_names, f, indent=2)\n", "with open(info_path, 'w', encoding='utf-8') as f:\n", " json.dump({'target_col': target_column, 'model_name': 'XGBClassifier'}, f, indent=2)\n", "\n", "final_metrics = pd.DataFrame([\n", " {'metric': 'accuracy', 'value': accuracy},\n", " {'metric': 'precision_weighted', 'value': precision},\n", " {'metric': 'recall_weighted', 'value': recall},\n", " {'metric': 'f1_weighted', 'value': f1},\n", " {'metric': 'roc_auc_ovr_weighted', 'value': roc_auc},\n", " {'metric': 'log_loss', 'value': loss}\n", "])\n", "final_metrics.to_csv(metrics_path, index=False)\n", "\n", "actual_labels = [class_names[i] for i in y_test]\n", "pred_labels = [class_names[i] for i in y_pred]\n", "prediction_df = pd.DataFrame({'Actual': actual_labels, 'Predicted': pred_labels})\n", "prediction_df.to_csv(predictions_path, index=False)\n", "\n", "print('Saved model:', model_path)\n", "print('Saved columns:', columns_path)\n", "print('Saved labels:', labels_path)\n", "print('Saved target info:', info_path)\n", "print('Saved metrics:', metrics_path)\n", "print('Saved predictions:', predictions_path)" ] }, { "cell_type": "markdown", "id": "c64bc279", "metadata": {}, "source": [ "## Step 8: Final Summary" ] }, { "cell_type": "code", "execution_count": 8, "id": "fb9802ef", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MetricValue
0Accuracy0.952500
1Weighted Precision0.951070
2Weighted Recall0.952500
3Weighted F1 Score0.951443
4Weighted ROC AUC (OvR)0.996892
5Log Loss0.140831
\n", "
" ], "text/plain": [ " Metric Value\n", "0 Accuracy 0.952500\n", "1 Weighted Precision 0.951070\n", "2 Weighted Recall 0.952500\n", "3 Weighted F1 Score 0.951443\n", "4 Weighted ROC AUC (OvR) 0.996892\n", "5 Log Loss 0.140831" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Final model used: XGBClassifier\n", "Target column: sleep_disorder_risk\n", "Classes: ['Healthy', 'Mild', 'Moderate', 'Severe']\n" ] } ], "source": [ "summary = pd.DataFrame([\n", " {'Metric': 'Accuracy', 'Value': accuracy},\n", " {'Metric': 'Weighted Precision', 'Value': precision},\n", " {'Metric': 'Weighted Recall', 'Value': recall},\n", " {'Metric': 'Weighted F1 Score', 'Value': f1},\n", " {'Metric': 'Weighted ROC AUC (OvR)', 'Value': roc_auc},\n", " {'Metric': 'Log Loss', 'Value': loss}\n", "])\n", "\n", "display(summary)\n", "print('Final model used: XGBClassifier')\n", "print('Target column:', target_column)\n", "print('Classes:', class_names)" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }