ML Atlas

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.
Z lekcji 5.3: Gradient boosting: drzewa, które poprawiają błędy Czego uczy się drugie drzewo w gradient boostingu?

Pokaż odpowiedź

Poprawna odpowiedź: Reszt pierwszego drzewa, czyli tego, o ile ono wciąż się myli

Każde kolejne drzewo dostaje reszty zespołu przed nim i dokłada poprawkę razy krok uczenia. Losowe próbki i niezależne drzewa to las losowy.

Z lekcji 5.2: Zespoły modeli: czemu wiele drzew bije jedno Czym jest próba bootstrapowa?

Pokaż odpowiedź

Poprawna odpowiedź: Wierszami wylosowanymi ze zbioru treningowego ze zwracaniem

Losowanie ze zwracaniem daje każdemu drzewu trochę inny zbiór danych, przez co drzewa różnią się w użyteczny sposób.

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ą.

Przewidź, potem sprawdź Naiwny Bayes ma rozpoznać gatunek irysa po długości i szerokości płatka. Zakłada, że w obrębie gatunku te dwa pomiary są niezależne. U irysów versicolor korelują jednak z r = 0,80: dłuższy płatek to zwykle szerszy płatek. Czy założenie musi być prawdziwe, żeby model dobrze rozpoznawał gatunki?
Jak bardzo jesteś pewny(-a)?

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 GaussianNB z 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.

1. Co naiwny Bayes mnoży, żeby ocenić, czy kwiat to versicolor?
Pokaż odpowiedź

Poprawna odpowiedź: Prior versicolor i gęstość każdego pomiaru u versicolor, osobno

Prior × gęstość długości × gęstość szerokości, każda liczona tylko ze średniej i wariancji tego pomiaru u versicolor. Wygrywa gatunek z największym iloczynem.

2. U versicolor długość i szerokość płatka korelują z r = 0,80, a model trafia 93,3% kwiatów testowych. Co z tego wynika?
Pokaż odpowiedź

Poprawna odpowiedź: Do decyzji wystarczy, że właściwy gatunek dostaje największy iloczyn

Fałszywe założenie zmienia wartości iloczynów, ale rzadko ich kolejność, gdy gatunki leżą daleko od siebie. Model z korelacjami trafia średnio tylko trochę więcej.

3. Prawda czy fałsz: „fałszywe założenie to bezużyteczny model”.
Pokaż odpowiedź

Poprawna odpowiedź: Fałsz, bo trafność bywa wysoka, choć założenie psuje podawane procenty

Na płatkach model trafia 93,3% mimo r = 0,80. Kłamie za to w procentach: przy 10 pomiarach na 171 biopsjach walidacyjnych z lekcji 2.4 deklaruje 98,3%, a trafia w 88,3%.

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.

Dla praktyka
  • W scikit-learn: GaussianNB dla liczb, MultinomialNB i ComplementNB dla zliczeń słów w tekście, BernoulliNB dla 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_smoothing dodaje 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.

Więcej w Atlasie

Hasła encyklopedii o pojęciach z tej lekcji: