| """Build a stub EEG classifier (sklearn RF) for tests. |
| |
| Demo-time placeholder — produces a 2-class probability output matching the |
| eeg_model.predict_features contract. Replace with the real artifact when |
| the user provides it; tests don't change. |
| """ |
| from __future__ import annotations |
|
|
| from pathlib import Path |
|
|
| import joblib |
| import numpy as np |
| from sklearn.ensemble import RandomForestClassifier |
|
|
|
|
| def build(path: Path, n_features: int = 16, seed: int = 0) -> Path: |
| """Save a fitted RandomForestClassifier at `path` and return the path.""" |
| path = Path(path) |
| if path.exists(): |
| return path |
| path.parent.mkdir(parents=True, exist_ok=True) |
|
|
| rng = np.random.default_rng(seed) |
| n = 200 |
| n_alz = n // 2 |
| X_ctrl = rng.normal(0.0, 1.0, size=(n - n_alz, n_features)) |
| X_alz = rng.normal(2.0, 1.0, size=(n_alz, n_features)) |
| X = np.vstack([X_ctrl, X_alz]) |
| y = np.array([0] * (n - n_alz) + [1] * n_alz) |
|
|
| clf = RandomForestClassifier(n_estimators=12, max_depth=6, random_state=seed) |
| clf.fit(X, y) |
| joblib.dump(clf, str(path)) |
| return path |
|
|