Machine Learning von Grund auf · Lektion 5.4 · 29 von 33 fertigen Lektionen · 12 Min.
Naive Bayes: falsche Annahme, gute Entscheidungen
Kurz gesagt
Naive Bayes nimmt unabhängige Merkmale an. Bei Iris-Kronblättern (r = 0,80) trifft es 93,3 %, bei 171 Validierungstumoren erklärt es 98,3 % und trifft 88,3 %.
Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Eine Ärztin sieht Fieber und Husten. Wie stark deutet das auf Grippe hin? Naive Bayes antwortet so: Nimm, wie häufig Grippe überhaupt ist (das ist der Prior), multipliziere damit, wie typisch Fieber bei Grippekranken ist, und damit, wie typisch bei ihnen Husten ist. Rechne dasselbe für andere Krankheiten und wähle das größte Produkt. Das Modell ist „naiv“, weil es die Symptome so multipliziert, als wären sie innerhalb jeder Krankheit voneinander unabhängig. In echten Daten sind sie das fast nie.
Wähle eine Antwort und wie sicher du bist.
Antworte, um das Labor freizuschalten.
Interaktives Labor
Dieses interaktive Labor läuft im Browser mit aktiviertem JavaScript. Der Text drumherum beschreibt, was es zeigt.
Antwort anzeigen
Richtige Antwort: Nein, denn für die Entscheidung reicht es, dass die richtige Art das größte Produkt bekommt
Nein: Mit den Kronblättern erkennt das Modell 93,3 % der Testblüten richtig, 3 Fehler bei 45. Was die falsche Annahme verdirbt, sind die Prozente. In Lektion 2.4 erklärte Naive Bayes bei 171 Validierungsbiopsien im Mittel 98,3 % Sicherheit und lag zu 88,3 % richtig.
Probier es aus
- Beginne mit den Kelchblättern. Wie liegen die Ellipsen der Arten, und wo ist die Sonde, wenn das Modell zögert?
- Wechsle zu den Kronblättern. Bei welcher Art korrelieren die Messungen am stärksten, und wie viel trifft das Modell in der Validierung?
- Geh zu den Tumoren. Vergleiche den Radius allein mit dem Trio Radius, Umfang, Fläche. Was passiert mit der Sicherheit, was mit der Genauigkeit?
- Zähle bei allen 10 Messungen, wie viele Kalibrierungstumoren eine Sicherheit über 99 % bekommen.
Wenn du es im Lab geprüft hast, geben wir dem, was du siehst, einen Namen.
Die Idee in einfachen Worten
Für jede Art merkt sich Naive Bayes nur zwei Zahlen pro Messung: den Mittelwert und die Streuung (Varianz). Daraus macht es eine Glockenkurve: wie typisch eine bestimmte Kronblattlänge für Setosa, für Versicolor, für Virginica ist. Eine neue Blüte bekommt für jede Art ein Produkt: Prior × Dichte der Länge × Dichte der Breite. Das größte gewinnt. Teilst du jedes Produkt durch die Summe der drei, erhältst du die Wahrscheinlichkeiten der Arten, den Posterior.
Unabhängigkeit ist eine Annahme über die Form: Die Ellipsen der Arten liegen entlang der Achsen, nicht schräg. Bei den Kronblättern stimmt das nicht, bei Versicolor ist r = 0,80. Und doch trifft das Modell in der Validierung 97,1 % und im Test 93,3 %. Eine Entscheidung braucht keine genauen Produkte, nur dass die richtige Art das größte hat. Bei den Kronblättern sind die Arten so gut getrennt, dass selbst schief gezeichnete Ellipsen meist richtig zeigen.
Schlechter steht es um die Prozente. Bei Brusttumoren sind Radius, Umfang und Fläche fast eine Messung: Der Radius korreliert mit dem Umfang mit r = 0,998 und mit der Fläche mit r = 0,987. Naive Bayes multipliziert sie als drei unabhängige Belege, zählt also denselben Beleg dreimal. Bei den 132 Kalibrierungsbiopsien aus Lektion 2.4 ergibt der Radius allein eine Genauigkeit von 88,6 % und eine mittlere erklärte Sicherheit von 89,2 %. Radius, Umfang und Fläche zusammen: Genauigkeit 86,4 %, Sicherheit 96,5 %. Drei Kopien heben also die Sicherheit, nicht die Genauigkeit. Alle 10 Messungen bringen zudem neue Information, etwa Textur und Glätte: Die Genauigkeit steigt auf 93,9 %, aber die Sicherheit (98,5 %) liegt weiter darüber.
Jak to policzono
- Iris: Iris (Fisher, 1936; UCI, Lizenz CC BY 4.0), 150 Blüten, 3 Arten. Geschichtete Aufteilung: 105 Blüten zum Lernen, 45 für den Test. Validierung: 5-fache Kreuzvalidierung innerhalb der 105 Blüten.
- Tumoren: Breast Cancer Wisconsin (Diagnostic) (Wolberg et al., 1993; UCI, Lizenz CC BY 4.0), 569 Biopsien, 10 „mean“-Messungen. Aufteilung und Namen wie in Lektion 2.4: 266 Biopsien zum Lernen, 132 Kalibrierungsbiopsien (an ihnen vergleicht das Labor die Sätze von Messungen) und 171 Validierungsbiopsien, nur zum Ansehen.
- Modell: Naive Bayes mit Normalverteilung, wie
GaussianNBaus scikit-learn; die Zahlen des Labors stimmen damit überein.
Warum es funktioniert
Ein Klassifikator liegt nur dann falsch, wenn eine falsche Art das größte Produkt bekommt. Domingos und Pazzani (1997) haben gezeigt, dass Naive Bayes nach diesem Maßstab selbst bei stark abhängigen Merkmalen das bestmögliche Modell sein kann: Es zählt die Reihenfolge der Produkte, nicht ihr Wert. Die Annahme hat aber einen Preis. Ein Modell, das die Korrelation berücksichtigt (schräge Ellipsen, die sogenannte quadratische Diskriminanzanalyse, QDA), trifft bei 20 anderen Aufteilungen mit den Kronblättern im Mittel 97,1 % gegen 95,8 % für Naive Bayes. Es ist in 11 Aufteilungen besser und in keiner schlechter. Bei den Kelchblättern schneidet Naive Bayes im Mittel besser ab: 80,0 % gegen 78,8 %. Meist erklärt man das damit, dass es aus 105 Blüten weniger Zahlen schätzen muss.
Die Übersicherheit ist keine Laune einer Aufteilung. Bei 20 anderen Aufteilungen der Tumoren ergibt der Radius allein eine Differenz zwischen Sicherheit und Genauigkeit von −3,6 bis 2,2 Prozentpunkten. Radius, Umfang und Fläche zusammen ergeben jedes Mal mehr Sicherheit als Genauigkeit: von 4,9 bis 11,5 Prozentpunkten. Alle 10 Messungen: von 4,7 bis 10,8 Prozentpunkten.
Ein häufiger Fehler
Richtig oder falsch: „Eine falsche Annahme bedeutet ein nutzloses Modell.“ Falsch. Bei den Kronblättern ist die Unabhängigkeitsannahme klar falsch, und das Modell erkennt 93,3 % der Testblüten richtig. Im Code unten erreicht es in der Kreuzvalidierung 0,960, fast so viel wie das Modell mit Korrelationen (0,973). Was die falsche Annahme verdirbt, sind die Prozente: Mit allen 10 Tumormessungen erklärt das Modell 0,990 und liegt zu 0,906 richtig.
Die praktische Folgerung: Vertraue den Entscheidungen von Naive Bayes so weit, wie die Validierung zeigt. Seinen Prozenten vertraue nicht ohne Kalibrierung auf eigenen Daten (Lektion 2.4).
Quiz
Drei Fragen zur Selbstkontrolle. Wähle eine Antwort oder klappe die Lösung unter der Frage auf. Mit der Tastatur: Pfeiltasten wählen, Enter oder Leertaste bestätigt.
Das Wichtigste
- Naive Bayes multipliziert den Prior und die Dichten einzelner Merkmale, als wären sie innerhalb einer Klasse unabhängig.
- Eine falsche Annahme ruiniert die Entscheidungen nicht: Bei Iris-Kronblättern (r = 0,80) erkennt das Modell 93,3 % der Testblüten.
- Sie verdirbt dafür die Prozente: Korrelierte Merkmale zählen denselben Beleg mehrfach, also erklärt das Modell auf 171 Validierungsbiopsien 98,3 % bei 88,3 % Genauigkeit.
- Vertraue den Entscheidungen so weit, wie die Validierung zeigt; den Prozenten erst nach Kalibrierung auf eigenen Daten.
Tiefer: Formel, Code, Praxis
Die Mathematik
Der Satz von Bayes mit der Unabhängigkeitsannahme: P(c | x) ∝ P(c) · ∏ⱼ p(xⱼ | c), und mit Normalverteilung p(xⱼ | c) = N(xⱼ; μ_cj, σ²_cj). Das Modell wählt die Klasse mit dem größten log P(c) + Σⱼ log p(xⱼ | c).
Kopien eines Merkmals: Geht dieselbe Information k-mal ein, wächst ihr Beitrag zur Differenz der Logarithmen zwischen den Klassen k-fach. Die Reihenfolge der Werte bleibt ähnlich, aber die Differenzen wachsen, also läuft der Posterior gegen 0 oder 1.
Im Code (Python)
Dasselbe Experiment in scikit-learn: Naive Bayes und ein Modell mit Korrelationen (QDA) auf zwei Paaren von Iris-Messungen in der Kreuzvalidierung, dann Sicherheit und Genauigkeit bei den Tumoren mit 1, 3 und 10 Messungen.
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] # Korrelation innerhalb von 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)}")
Ausgabe
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
Die Aufteilungen sind andere als im Lab, und die Korrelation wird hier aus allen 50 Versicolor-Blüten berechnet (0,79), also sind die Zahlen etwas anders. Das Bild ist dasselbe: Bei den Kronblättern erreicht Naive Bayes 0,960, fast so viel wie QDA (0,973), bei den Kelchblättern sogar mehr (0,793 gegen 0,773). Bei den Tumoren steigt die Sicherheit von 0,884 auf 0,990, die Genauigkeit nur von 0,883 auf 0,906.
Notebook herunterladen (.ipynb). Öffne es in Jupyter oder lade es in Google Colab hoch; fehlende Daten lädt es selbst.
Für die Praxis
- In scikit-learn:
GaussianNBfür Zahlen,MultinomialNBundComplementNBfür Wortzählungen in Texten,BernoulliNBfür Ja/Nein-Merkmale. Das Modell lernt in einem Durchgang über die Daten, also ist es eine schnelle Vergleichsbasis, besonders für Text (Spamfilter). - Wenn die Prozente wichtig sind, kalibriere:
CalibratedClassifierCV(GaussianNB(), method="sigmoid")passt die Kalibrierung in einer Kreuzvalidierung an. - Von fast identischen Merkmalen (Radius, Umfang, Fläche) behalte eines oder fasse sie zu einem zusammen. Naive Bayes zählt jede Kopie als eigenen Beleg.
var_smoothingaddiert zu jeder Varianz ein wenig, damit eine Messung, die innerhalb einer Klasse kaum schwankt, nicht für jedes neue Beispiel eine Dichte nahe null liefert.
War das hilfreich?
Danke! Das hilft uns, besser zu werden.
Mehr im Atlas
Einträge der Enzyklopädie zu den Ideen dieser Lektion: