Kurs uczenia maszynowego od zera · Lekcja 5.4 · 29 z 33 gotowych lekcji · 12 min
Naiwny Bayes: fałszywe założenie, dobre decyzje
W skrócie
Naiwny Bayes zakłada niezależne cechy. Na płatkach irysów (r = 0,80) trafia 93,3%, a na 171 guzach walidacyjnych deklaruje 98,3% pewności przy 88,3% trafności.
Rozgrzewka Dwa pytania z wcześniejszych lekcji. Minuta, a lekcji nie blokuje.
Lekarz widzi gorączkę i kaszel. Na ile to wskazuje na grypę? Naiwny Bayes odpowiada tak: weź, jak częsta jest grypa w ogóle (to prior), pomnóż przez to, jak typowa jest gorączka u chorych na grypę, i przez to, jak typowy jest u nich kaszel. To samo policz dla innych chorób i wybierz największy iloczyn. Model jest „naiwny”, bo mnoży objawy tak, jakby w obrębie każdej choroby były od siebie niezależne. W prawdziwych danych prawie nigdy nie są.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
Eksperyment
Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać.
Pokaż odpowiedź
Poprawna odpowiedź: Nie, bo do decyzji wystarczy, że właściwy gatunek dostaje największy iloczyn
Nie: na płatkach model trafia 93,3% kwiatów testowych, 3 pomyłki na 45. Fałszywe założenie psuje za to procenty. W lekcji 2.4 naiwny Bayes na 171 biopsjach walidacyjnych deklarował średnio 98,3% pewności, a trafiał w 88,3%.
Spróbuj
- Zacznij od działek kielicha. Jak ułożone są elipsy gatunków i gdzie leży sonda, gdy model się waha?
- Przełącz na płatki. U którego gatunku pomiary korelują najmocniej i ile model trafia na walidacji?
- Przejdź do guzów. Porównaj sam promień z trójką: promień, obwód, pole. Co dzieje się z pewnością, a co z trafnością?
- Przy wszystkich 10 pomiarach policz, ile guzów kalibracyjnych dostaje pewność powyżej 99%.
Gdy już sprawdzisz to w labie, nazwijmy, co widzisz.
Pomysł w prostych słowach
Dla każdego gatunku naiwny Bayes zapamiętuje tylko dwie liczby na pomiar: średnią i rozrzut (wariancję). Z nich robi krzywą dzwonową: jak typowa jest dana długość płatka u setosy, u versicolor, u virginiki. Nowy kwiat dostaje dla każdego gatunku iloczyn: prior × gęstość długości × gęstość szerokości. Wygrywa największy. Gdy podzielisz każdy iloczyn przez sumę trzech, dostajesz prawdopodobieństwa gatunków, czyli posterior.
Niezależność to założenie o kształcie: elipsy gatunków leżą wzdłuż osi, a nie skośnie. Na płatkach to nieprawda, u versicolor r = 0,80. A jednak model trafia 97,1% na walidacji i 93,3% na teście. Do decyzji nie potrzeba dokładnych iloczynów, wystarczy, że właściwy gatunek ma największy. Gatunki są na płatkach na tyle rozdzielone, że nawet krzywo narysowane elipsy zwykle wskazują dobrze.
Gorzej z procentami. Na guzach piersi promień, obwód i pole to prawie jeden pomiar: promień koreluje z obwodem z r = 0,998, a z polem z r = 0,987. Naiwny Bayes mnoży je jak trzy niezależne dowody, więc ten sam dowód liczy trzy razy. Na 132 biopsjach kalibracyjnych z lekcji 2.4 sam promień daje trafność 88,6% i średnią deklarowaną pewność 89,2%. Promień, obwód i pole razem: trafność 86,4%, a pewność 96,5%. Trzy kopie podnoszą więc pewność, a trafności nie. Wszystkie 10 pomiarów niesie też nową informację, np. teksturę i gładkość: trafność rośnie do 93,9%, ale pewność (98,5%) nadal ją przewyższa.
Jak to policzono
- Irysy: Iris (Fisher, 1936; UCI, licencja CC BY 4.0), 150 kwiatów, 3 gatunki. Podział stratyfikowany: 105 kwiatów do nauki, 45 do testu. Walidacja: walidacja krzyżowa na 5 części wewnątrz 105 kwiatów.
- Guzy: Breast Cancer Wisconsin (Diagnostic) (Wolberg i in., 1993; UCI, licencja CC BY 4.0), 569 biopsji, 10 pomiarów „mean”. Podział i nazwy jak w lekcji 2.4: 266 biopsji do nauki, 132 kalibracyjne (na nich lab porównuje zestawy pomiarów) i 171 walidacyjnych, tylko do wglądu.
- Model: naiwny Bayes z rozkładem normalnym, jak
GaussianNBz scikit-learn; liczby z labu zgadzają się z nim.
Dlaczego to działa
Klasyfikator myli się tylko wtedy, gdy zły gatunek dostaje największy iloczyn. Domingos i Pazzani (1997) pokazali, że naiwny Bayes bywa przy takiej ocenie najlepszy możliwy nawet przy mocno zależnych cechach: liczy się kolejność iloczynów, nie ich wartość. Założenie ma jednak cenę. Model, który uwzględnia korelację (elipsy pochylone, tak zwana kwadratowa analiza dyskryminacyjna, QDA), na 20 innych podziałach trafia na płatkach średnio 97,1% wobec 95,8% naiwnego Bayesa. Lepszy jest w 11 podziałach, gorszy w żadnym. Na działkach kielicha naiwny Bayes wypada średnio lepiej: 80,0% wobec 78,8%. Zwykle tłumaczy się to tym, że ma mniej liczb do oszacowania ze 105 kwiatów.
Przesadna pewność to nie przypadek jednego podziału. Na 20 innych podziałach guzów sam promień daje różnicę między pewnością a trafnością od −3,6 do 2,2 pkt proc. Promień, obwód i pole razem dają za każdym razem więcej pewności niż trafności: od 4,9 do 11,5 pkt proc. Wszystkie 10 pomiarów: od 4,7 do 10,8 pkt proc.
Częsty błąd
Prawda czy fałsz: „fałszywe założenie to bezużyteczny model”. Fałsz. Na płatkach założenie niezależności jest wyraźnie fałszywe, a model trafia 93,3% kwiatów testowych. W kodzie niżej trafia w walidacji krzyżowej 0,960, prawie tyle co model z korelacjami (0,973). Fałszywe założenie psuje za to procenty: przy wszystkich 10 pomiarach guza model deklaruje 0,990, a trafia w 0,906.
Wniosek praktyczny: decyzji naiwnego Bayesa możesz ufać tyle, ile pokazuje walidacja. Jego procentom nie ufaj bez kalibracji na osobnych danych (lekcja 2.4).
Quiz
Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.
Najważniejsze wnioski
- Naiwny Bayes mnoży prior i gęstości pojedynczych cech, jakby w obrębie klasy były niezależne.
- Fałszywe założenie nie przekreśla decyzji: na płatkach irysów (r = 0,80) model trafia 93,3% kwiatów testowych.
- Psuje za to procenty: skorelowane cechy liczą ten sam dowód kilka razy, więc na 171 biopsjach walidacyjnych model deklaruje 98,3% przy 88,3% trafności.
- Decyzjom ufaj tyle, ile pokazuje walidacja; procentom dopiero po kalibracji na osobnych danych.
Głębiej: wzór, kod, praktyka
Matematyka
Twierdzenie Bayesa z założeniem niezależności: P(c | x) ∝ P(c) · ∏ⱼ p(xⱼ | c), a w rozkładzie normalnym p(xⱼ | c) = N(xⱼ; μ_cj, σ²_cj). Model wybiera klasę z największym log P(c) + Σⱼ log p(xⱼ | c).
Kopie jednej cechy: jeśli ta sama informacja wchodzi k razy, jej wkład do różnicy logarytmów między klasami rośnie k razy. Kolejność wyników zostaje podobna, ale różnice rosną, więc posterior ucieka do 0 albo 1.
W kodzie (Python)
Ten sam eksperyment w scikit-learn: naiwny Bayes i model z korelacjami (QDA) na dwóch parach pomiarów irysów w walidacji krzyżowej, potem pewność i trafność na guzach przy 1, 3 i 10 pomiarach.
from sklearn.datasets import load_iris, load_breast_cancer
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
iris = load_iris(as_frame=True)
for part in ["sepal", "petal"]:
cols = [f"{part} length (cm)", f"{part} width (cm)"]
r = iris.data[iris.target == 1][cols].corr().iloc[0, 1] # korelacja w obrębie versicolor
nb = cross_val_score(GaussianNB(), iris.data[cols], iris.target, cv=10).mean()
qda = cross_val_score(QuadraticDiscriminantAnalysis(), iris.data[cols], iris.target, cv=10).mean()
print(f"{part}s: versicolor r = {r:.2f}; 10-fold CV accuracy: naive Bayes {nb:.3f}, with correlations (QDA) {qda:.3f}")
bc = load_breast_cancer(as_frame=True)
X, y = bc.data.iloc[:, :10], 1 - bc.target
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, stratify=y, random_state=0)
for cols in [["mean radius"], ["mean radius", "mean perimeter", "mean area"], list(X.columns)]:
p = GaussianNB().fit(X_tr[cols], y_tr).predict_proba(X_te[cols])
acc, conf = (p.argmax(1) == y_te).mean(), p.max(1).mean()
print(f"{len(cols):2d} of 10 measurements: accuracy {acc:.3f}, mean declared confidence {conf:.3f}, over 99% sure: {(p.max(1) > 0.99).sum()} of {len(y_te)}")
Wynik
sepals: versicolor r = 0.53; 10-fold CV accuracy: naive Bayes 0.793, with correlations (QDA) 0.773
petals: versicolor r = 0.79; 10-fold CV accuracy: naive Bayes 0.960, with correlations (QDA) 0.973
1 of 10 measurements: accuracy 0.883, mean declared confidence 0.884, over 99% sure: 26 of 171
3 of 10 measurements: accuracy 0.895, mean declared confidence 0.969, over 99% sure: 127 of 171
10 of 10 measurements: accuracy 0.906, mean declared confidence 0.990, over 99% sure: 150 of 171
Podziały są inne niż w labie, a korelację liczymy tu na wszystkich 50 kwiatach versicolor (0,79), więc liczby są trochę inne. Obraz jest ten sam: na płatkach naiwny Bayes trafia 0,960, prawie jak QDA (0,973), a na działkach nawet lepiej (0,793 wobec 0,773). Na guzach pewność rośnie z 0,884 do 0,990, a trafność tylko z 0,883 do 0,906.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- W scikit-learn:
GaussianNBdla liczb,MultinomialNBiComplementNBdla zliczeń słów w tekście,BernoulliNBdla cech tak/nie. Model uczy się w jednym przejściu po danych, więc to szybki punkt odniesienia, zwłaszcza dla tekstu (filtry spamu). - Gdy procenty mają znaczenie, kalibruj:
CalibratedClassifierCV(GaussianNB(), method="sigmoid")dopasowuje kalibrację w walidacji krzyżowej. - Prawie identyczne cechy (promień, obwód, pole) zostaw jedną albo połącz w jedną. Naiwny Bayes każdą kopię policzy jako osobny dowód.
var_smoothingdodaje odrobinę do każdej wariancji, żeby pomiar, który w klasie prawie się nie zmienia, nie dawał gęstości bliskiej zeru dla każdego nowego przykładu.
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.
Więcej w Atlasie
Hasła encyklopedii o pojęciach z tej lekcji: