Implementacja i ewaluacja klasyfikatora zespołowego Naive Bayes Forest (NB-Forest): las złożony z wielu klasyfikatorów Gaussian Naive Bayes, gdzie każdy członek zespołu uczy się na:
- bootstrapie próbek (bagging),
- losowym podzbiorze cech (parametr k z d).
Projekt działa na Ubuntu/Linux (i ogólnie na systemach z Pythonem 3.x).
.
├── main.py
├── requirements.txt
├── nb_forest/
│ ├── nb_forest.py # NaiveBayesForest (fit/predict/predict_proba, agregacja, wagi, align proba)
│ ├── naive_bayes.py # własna minimalna implementacja GaussianNB (opcjonalnie)
│ ├── metrics.py # accuracy, f1_macro, log_loss
│ └── experiments.py # procedury eksperymentalne (CV, grid, smoothing, baseline RF)
└── tests/
├── test_nb_forest.py
├── test_naive_bayes.py
└── test_experiments.py
- Python 3.x
pip+ (zalecane)venv- Pakiety z
requirements.txt:numpyscikit-learnpytest
Zbiory danych są wbudowane w
sklearn.datasets(Wine, Iris, Breast Cancer) — nie trzeba nic pobierać.
W katalogu projektu:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtpython main.pyCo się dzieje:
- uruchamia 5-fold StratifiedKFold (domyślnie
--splits 5, seed=42), - wypisuje tabelę wyników dla 3 datasetów:
- Wine
- Iris
- Breast Cancer
- porównuje warianty:
- agregacja vote (głosowanie),
- agregacja proba_mean (średnia prawdopodobieństw),
- wagi członków:
none,val_accuracy,val_log_loss, - dodatkowo baseline:
RandomForestClassifier.
python main.py --grid- przeszukuje siatkę parametrów (liczba estymatorów
M, liczba cechk, tryb agregacji, tryb wag), - wypisuje Top-5 konfiguracji wg accuracy i wg log-loss (dla każdego datasetu).
python main.py --smoothing- wykonuje sweep po
var_smoothingi porównuje wpływ na metryki.
python main.py --grid --smoothingpython main.py --splits 10W katalogu projektu:
PYTHONPATH=. pytest -q
PYTHONPATH=.jest potrzebne, żeby testy poprawnie importowały moduły z katalogu projektu.
import numpy as np
from sklearn.datasets import load_wine
from nb_forest.nb_forest import NaiveBayesForest
X, y = load_wine(return_X_y=True)
y = y.astype(int)
model = NaiveBayesForest(
n_estimators=25,
max_features="sqrt",
agg="proba_mean", # albo "vote"
weight_mode="none", # albo "val_accuracy" / "val_log_loss"
base_estimator="sklearn",# albo "custom"
random_state=42
)
model.fit(X, y)
pred = model.predict(X[:5])
proba = model.predict_proba(X[:5])
print(pred)
print(proba)- W eksperymentach (
nb_forest/experiments.py) warianty są tworzone jawnie zbase_estimator="sklearn"lubbase_estimator="custom". - Jeśli ktoś tworzy obiekt
NaiveBayesForest()bez podaniabase_estimator, to domyślnie użyta zostanie wartość ustawiona w konstruktorze klasy (zob.nb_forest/nb_forest.py). Domyślnie jestbase_estimator="sklearn".
Najbezpieczniej jest zawsze podawać jawnie:
NaiveBayesForest(base_estimator="sklearn")- NB-Forest:
- losowanie próbek (bootstrap) + losowanie cech (k z d),
- agregacja:
vote— głosowanie (opcjonalnie ważone),proba_mean— średnia prawdopodobieństw,
- wagi członków liczone na walidacji:
val_accuracy,val_log_loss(waga = exp(-logloss)).
- Baseline:
RandomForestClassifierze scikit-learn.
- Jeśli
pythonwskazuje na Pythona 2 lub innego niż 3.x, użyjpython3. - Jeśli importy z
nb_forestnie działają w testach: uruchamiajpytestzPYTHONPATH=.(jak w sekcji 5). - Jeśli brakuje pakietów: aktywuj venv (
source .venv/bin/activate) i ponówpip install -r requirements.txt.