{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":53666,"databundleVersionId":6589269,"sourceType":"competition"}],"dockerImageVersionId":30626,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## <font color=darkred>Detect sleep onset and wake from wrist-worn accelerometer data</font>","metadata":{}},{"cell_type":"markdown","source":"\n# <center><font color=darkred>Sleep State| Baseline | Basic Feature Engineering | LogisticRegression | SVM</font></center>\n","metadata":{}},{"cell_type":"markdown","source":"## <font color=darkred>Detect sleep onset and wake from wrist-worn accelerometer data</font>","metadata":{}},{"cell_type":"markdown","source":"# **Import Important Libraries**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# Data Visualization\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom seaborn import pairplot\nplt.style.use('ggplot') \nimport seaborn as sb\nimport plotly.express as px\nfrom matplotlib import rcParams\nfrom scipy.fft import fft\n\n# Some addinal libraries\n#from fastbook import *\nfrom datetime import datetime\nfrom pandas.api.types import is_string_dtype, is_numeric_dtype, is_categorical_dtype\nfrom pandas.plotting import scatter_matrix\nfrom fastai.tabular.all import *\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.tree import DecisionTreeRegressor\nimport plotly.express as px\n\n# Machine Learning\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.svm import SVC\n# from sklearn.impute import SimpleImputer\n# from sklearn.neighbors import KNeighborsClassifier\n# from sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score, classification_report\n# from sklearn.linear_model import LinearRegression\n# from sklearn.metrics import mean_squared_error\nfrom sklearn.preprocessing import PolynomialFeatures\n# from sklearn.compose import ColumnTransformer\n# from sklearn.preprocessing import OneHotEncoder\n# from sklearn.cluster import KMeans\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import make_pipeline\n\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import accuracy_score, classification_report\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.model_selection import GridSearchCV\n\n# Jupyter Notebooks (Optional)\n%matplotlib inline\n","metadata":{"execution":{"iopub.status.busy":"2024-01-02T11:21:40.322615Z","iopub.execute_input":"2024-01-02T11:21:40.323175Z","iopub.status.idle":"2024-01-02T11:21:47.670056Z","shell.execute_reply.started":"2024-01-02T11:21:40.323140Z","shell.execute_reply":"2024-01-02T11:21:47.669142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Loading the Data and Basic EDA on CSV File**","metadata":{}},{"cell_type":"code","source":"data = pd.read_csv('/kaggle/input/child-mind-institute-detect-sleep-states/train_events.csv')\ndataset = data.copy()\ndata.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The column names \nprint(data.columns)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.describe()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Data Visualization:\nsns.countplot(x='event', data=data)\nplt.title('Distribution of Sleep Events')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"null_count = data.isnull().sum().sum()\nprint('Number of null values:', null_count)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"# Number of nulls in each columns\ndata.isna().sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.heatmap(data.isnull(), cbar=False, cmap='viridis')\nplt.title('Missing Data: Yellow Lines Indicate Missing Values')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data preprocessing\n## Handling Missing Values","metadata":{}},{"cell_type":"code","source":"# data.dropna(inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data['step'].fillna(data['step'].mean(), inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Convert to datetime format\ndata['timestamp'] = pd.to_datetime(data['timestamp'], format='%Y-%m-%dT%H:%M:%S%z')\n\n# Group by 'series_id' and fill null values in 'timestamp' using the forward fill method within each group\ndata['timestamp'] = data.groupby('series_id')['timestamp'].ffill()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.isna().sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Group by 'series_id' and fill null values in 'timestamp' using the backward fill method within each group\n#data['timestamp'] = data.groupby('series_id')['timestamp'].bfill()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.dropna(inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.isna().sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Engineering","metadata":{}},{"cell_type":"markdown","source":"**Extracting Time Features:**","metadata":{}},{"cell_type":"code","source":"data['timestamp'] = pd.to_datetime(data['timestamp'], format='%Y-%m-%dT%H:%M:%S%z', utc=True)\ndata['hour'] = data['timestamp'].dt.hour","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Apply label encoding to the 'event' column**","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nlabel_encoder = LabelEncoder()\ndata['event'] = label_encoder.fit_transform(data['event'])\n\n# data = pd.get_dummies(data, columns=['event'], prefix='event') #--> for onehot encoding","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Calculate statistics for numerical features for each 'series_id'**","metadata":{}},{"cell_type":"code","source":"series_stats = data.groupby('series_id')['step'].agg(['mean', 'std', 'max', 'min']).reset_index()\ndata = pd.merge(data, series_stats, on='series_id', suffixes=('', '_series_stats'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Handling Cyclical Features: encoding time appropriately to account for circular patterns**","metadata":{}},{"cell_type":"code","source":"data['hour_sin'] = np.sin(2 * np.pi * data['hour'] / 24)\ndata['hour_cos'] = np.cos(2 * np.pi * data['hour'] / 24)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.isna().sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# SVM","metadata":{}},{"cell_type":"code","source":"X = data[['step', 'hour', 'hour_sin', 'night']]\ny = data['event']\n\n# For one hot incodeing\n# X = data.drop(['series_id', 'timestamp', 'event_1', 'event_0'], axis=1)\n# y = data['event_1']  # Assuming 'onset' is the positive class","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Standard Scaling\n# scaler = StandardScaler()\n# X_train_scaled = scaler.fit_transform(X_train)\n# X_test_scaled = scaler.transform(X_test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Model Training\nsvm_model = SVC(kernel='linear', C=0.1)\nsvm_model.fit(X_train, y_train)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Model Evaluation\ny_pred = svm_model.predict(X_test)\naccuracy = accuracy_score(y_test, y_pred)\nclassification_rep = classification_report(y_test, y_pred)\n\nprint(f'Accuracy: {accuracy}')\nprint(f'Classification Report:\\n{classification_rep}')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score\n\n# Model Evaluation for Training Set\ny_train_pred = svm_model.predict(X_train)\naccuracy_train = accuracy_score(y_train, y_train_pred)\n\n# Model Evaluation for Test Set\ny_test_pred = svm_model.predict(X_test)\naccuracy_test = accuracy_score(y_test, y_test_pred)\n\n# Print accuracies\nprint(f'Training Accuracy: {accuracy_train}')\nprint(f'Test Accuracy: {accuracy_test}')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import cross_val_score\n# Perform cross-validation (e.g., 5-fold cross-validation)\ncv_scores = cross_val_score(svm_model, X_train, y_train, cv=5)\n\n# Print cross-validation scores\nprint(\"Cross-Validation Scores:\", cv_scores)\nprint(\"Mean CV Accuracy:\", np.mean(cv_scores))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# LogisticRegression Model","metadata":{}},{"cell_type":"code","source":"# Model Initialization\nlogistic_model = LogisticRegression(random_state=42)\n\n# Model Training\nlogistic_model.fit(X_train, y_train)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Model Evaluation on Test Set\ny_pred_test = logistic_model.predict(X_test)\naccuracy_test = accuracy_score(y_test, y_pred_test)\nclassification_rep_test = classification_report(y_test, y_pred_test)\n\nprint(f'Test Accuracy: {accuracy_test}')\nprint(f'Classification Report (Test Set):\\n{classification_rep_test}')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define hyperparameter grid\nparam_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}\n\n# Initialize logistic regression model\nlogistic_model_tuned = LogisticRegression(random_state=42)\n\n# Perform grid search with cross-validation\ngrid_search = GridSearchCV(logistic_model_tuned, param_grid, cv=5)\ngrid_search.fit(X_train, y_train)\n\n# Get the best hyperparameters\nbest_params = grid_search.best_params_\n\nprint(f'Best Hyperparameters: {best_params}')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Perform cross-validation (e.g., 5-fold cross-validation)\ncv_scores = cross_val_score(logistic_model, X_train, y_train, cv=5)\n\n# Print cross-validation scores\nprint(\"Cross-Validation Scores:\", cv_scores)\nprint(\"Mean CV Accuracy:\", np.mean(cv_scores))\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}