| """ |
| Lightweight deep baseline using sklearn MLPClassifier. |
| Serves as a stronger nonlinear baseline when full EEGNet stack is unavailable. |
| """ |
| from pathlib import Path |
| import numpy as np |
| import pandas as pd |
| from sklearn.model_selection import train_test_split |
| from sklearn.pipeline import Pipeline |
| from sklearn.preprocessing import StandardScaler |
| from sklearn.neural_network import MLPClassifier |
| from sklearn.metrics import accuracy_score, f1_score, roc_auc_score |
|
|
| from src.preprocess import build_dataset_from_folder |
|
|
|
|
| def main(): |
| X0, y0 = build_dataset_from_folder("data/relaxed", label=0) |
| X1, y1 = build_dataset_from_folder("data/focused", label=1) |
| X = np.vstack([X0, X1]) |
| y = np.concatenate([y0, y1]) |
|
|
| X_train, X_test, y_train, y_test = train_test_split( |
| X, y, test_size=0.2, random_state=42, stratify=y |
| ) |
|
|
| model = Pipeline([ |
| ("scaler", StandardScaler()), |
| ("mlp", MLPClassifier( |
| hidden_layer_sizes=(128, 64), |
| activation="relu", |
| alpha=1e-4, |
| batch_size=64, |
| learning_rate_init=1e-3, |
| max_iter=200, |
| random_state=42, |
| early_stopping=True, |
| )) |
| ]) |
|
|
| model.fit(X_train, y_train) |
| pred = model.predict(X_test) |
| proba = model.predict_proba(X_test)[:, 1] |
|
|
| metrics = { |
| "model": "MLP", |
| "accuracy": float(accuracy_score(y_test, pred)), |
| "f1": float(f1_score(y_test, pred)), |
| "auc": float(roc_auc_score(y_test, proba)), |
| } |
|
|
| out = Path("outputs") |
| out.mkdir(exist_ok=True) |
| pd.DataFrame([metrics]).to_csv(out / "deep_baseline_results.csv", index=False) |
| print(metrics) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|