bci-mvp / src /deep_baseline.py
WilliamK112
feat: add deep baseline (MLP) and unified model result merger
31c39b3
Raw
History Blame Contribute Delete
1.71 kB
"""
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()