Aktives Modul
Modul 1 startet hier
Leitmetapher
Der Türsteher-Simulator
0 Prozent abgeschlossen 0 Punkte gesammelt
8 Module · Übungen aus den Notebooks · lokale Fortschrittsspeicherung

Was lernst du in 10 Minuten pro Abschnitt?

Du verstehst, warum logistische Regression Wahrscheinlichkeiten statt freier Zahlen ausgibt, wie eine Entscheidungsgrenze entsteht und wie du Threshold, Log-Loss und Multiclass-Fälle praktisch liest.

AlltagPost, Club-Tür, Alarmanlage und Uni-Zulassung statt trockener Formeln.
DidaktikErst Bild im Kopf, dann Formel, dann Python, dann Demo, dann Quiz.
SelbststudiumJeder Schritt ist alleine lösbar und bleibt nach dem Schließen des Browsers gespeichert.

Türsteher-Simulator: dein Spielstand

Jede erstmals richtig gelöste Quizfrage bringt 10 Punkte. Jede ausprobierte Demo bringt 5 Punkte.
Wenn ein Quiz bei 100 % steht, wird das Modul als sicher markiert. Erst dann zählt es als erledigt.
Die Seite nutzt den gemeinsamen Lernstand im Data-Science-Pfad. Du kannst also später genau an derselben Stelle weitermachen.
Modul 1 von 8

Warum Klassifikation?

Du unterscheidest Zahlenvorhersagen von Ja/Nein-Entscheidungen und spürst sofort, warum lineare Regression hier nicht reicht.

⚪ Offen

Alltagsszene

Stell dir vor, du arbeitest bei der Post. Vor dir landen Sendungen auf dem Tisch: Brief oder Paket? Du musst nicht den exakten Wert ausrechnen, sondern eine Kategorie vergeben. Genau so arbeitet ein Klassifikationsmodell.

ML-Sprache

Bei Regression ist die Zielvariable eine Zahl, etwa ein Hauspreis. Bei Klassifikation ist die Zielvariable eine Klasse, zum Beispiel Spam oder kein Spam. Für binäre Klassifikation gilt oft y ∈ {0, 1}.

Merksatz

Die logistische Regression sagt nicht direkt „Ja“ oder „Nein“, sondern zuerst eine Wahrscheinlichkeit für Klasse 1. Erst danach wird diese Wahrscheinlichkeit über einen Schwellenwert in eine Entscheidung übersetzt.

Code-Beispiel

# Zwei Probleme klar unterscheiden
temperature_tomorrow = 18.7   # Regression: Zahl vorhersagen
will_rain = 1                 # Klassifikation: Klasse 0 oder 1

print("Regression:", temperature_tomorrow)
print("Klassifikation:", will_rain)
Was passiert hier? Die erste Variable ist eine echte Zahl. Die zweite Variable steht für eine Klasse. Genau diese andere Zielstruktur macht einen anderen Modelltyp nötig.

Interaktion: Sortiere die Probleme

Ordne die Situationen der passenden Problemart zu. So spürst du sofort den Unterschied zwischen „Zahl schätzen“ und „Klasse entscheiden“.

🗣️ Übersetze den Output in Alltagssprache

Was ist gemessen? In unserem Fall keine freie Zahl, sondern eine Klassenentscheidung: etwa „Brief oder Paket“ beziehungsweise 0 oder 1.

So liest man den Wert: Eine 1 heißt in unserem Fall nicht „mehr“, sondern einfach: Das Modell ordnet den Fall der Zielklasse zu.

Was ist hier der schlimmste Fehler? Den Fall in die falsche Schublade zu legen, obwohl die eigentliche Aufgabe nur eine klare Kategorie war.

✅ Mini-Check (30 Sekunden)
  1. Was ist „positiv“ (=1) in deinem aktuellen Beispiel?
  2. Was wäre ein True Positive hier als ganzer Satz?
  3. Ab welcher Wahrscheinlichkeit würdest du aus einem Bauchgefühl eine harte Ja/Nein-Entscheidung machen?

Was nimmst du mit? Wenn du nur zwischen Klassen unterscheiden willst, ist eine saubere Wahrscheinlichkeit oft hilfreicher als eine freie Zahl.

Modul 2 von 8

Die Sigmoid-Funktion

Du verstehst, wie aus einem beliebigen Score eine Wahrscheinlichkeit zwischen 0 und 1 wird.

⚪ Offen

Alltagsszene

Ein normaler Lichtschalter kennt nur an oder aus. Ein Dimmer kennt viele Zwischenstufen. Die Sigmoid-Funktion ist der Dimmer des Modells: Sie übersetzt jeden Rohwert in eine Wahrscheinlichkeit zwischen 0 % und 100 %.

ML-Sprache

Das Modell berechnet zunächst einen Score t = b₀ + b₁x₁ + .... Dieser Score kann jede Zahl annehmen. Erst die Sigmoid-Funktion macht daraus eine sinnvolle Wahrscheinlichkeit.

Formel

\sigma(t) = \frac{1}{1 + e^{-t}}

Für sehr kleine Werte geht die Kurve gegen 0. Für sehr große Werte geht sie gegen 1. Bei t = 0 liegt sie genau bei 0,5.

Code-Beispiel aus dem Notebook

from scipy.special import expit

score = -1.2                     # Rohwert des Modells
probability = expit(score)       # Sigmoid macht daraus 0 bis 1

print(round(probability, 3))     # 0.231
Was passiert hier? expit ist die Sigmoid-Funktion aus dem Notebook. Ein negativer Score führt zu einer kleinen Wahrscheinlichkeit.

Interaktive Demo: Ziehe am Dimmer

Wahrscheinlichkeit50.0 %
Deutung50:50, der Türsteher ist unsicher.
Grenzfall linkst → -∞, fast sicher Nein
Grenzfall rechtst → +∞, fast sicher Ja

🗣️ Übersetze die Zahl in Alltagssprache

Was ist gemessen? In unserem Fall die Wahrscheinlichkeit für Klasse 1, also für „Ja“ oder „rein“.

So liest man den Wert: Wenn hier zum Beispiel 0.731 steht, heißt das: In unserem Fall sieht das Modell etwa 73 % Wahrscheinlichkeit für Klasse 1.

Was ist hier der schlimmste Fehler? Eine mittlere Wahrscheinlichkeit wie eine sichere Wahrheit zu behandeln, obwohl das Modell noch deutlich unsicher ist.

✅ Mini-Check (30 Sekunden)
  1. Was ist „positiv“ (=1) in unserem Türsteher-Beispiel?
  2. Was bedeutet ein True Positive hier als ganzer Satz?
  3. Würdest du bei 0.52 schon „Ja“ sagen oder lieber einen strengeren Threshold setzen?

🏋️ Übung: Sigmoid-Werte prüfen

Übertrage die Sigmoid-Idee in ein minimales Python-Beispiel. Ergänze genau die eine Zeile, die den Score in eine Wahrscheinlichkeit umwandelt.

📓 Öffne dein Jupyter Notebook oder Google Colab und probiere es selbst aus.

from math import exp

def sigmoid(t):
    return # ??? DEINE LÖSUNG ???

score = 1.0
print(round(sigmoid(score), 3))
💡 Tipp anzeigen

In Python schreibst du die Formel mit exp(-t), also zum Beispiel 1 / (1 + exp(-t)).

✅ Lösung anzeigen
from math import exp

def sigmoid(t):
    return 1 / (1 + exp(-t))

score = 1.0
print(round(sigmoid(score), 3))

Erwartete Ausgabe: 0.731

Was nimmst du mit? Die Sigmoid-Funktion ist keine Deko, sondern der entscheidende Schritt, der eine freie Rechenwelt in eine Wahrscheinlichkeitswelt übersetzt.

Modul 3 von 8

Entscheidungsgrenze

Du siehst geometrisch, wie aus Wahrscheinlichkeiten eine Ja/Nein-Grenze wird.

⚪ Offen

Alltagsszene

Stell dir einen Türsteher vor. Wenn sein Bauchgefühl mindestens 50 % sagt, darf jemand rein. Sonst nicht. Diese unsichtbare Linie zwischen „rein“ und „nicht rein“ ist die Entscheidungsgrenze.

ML-Sprache

Mit zwei Merkmalen ist die eine Gerade. Sie hängt nur von den Modellparametern ab, nicht von einer einzelnen Beobachtung. Die Grenze liegt also nicht fertig in den Daten, sondern entsteht erst durch die gelernten Gewichte.

Formel

b₀ + b₁x₁ + b₂x₂ = 0

Genau auf dieser Linie ist der Score null. Die Sigmoid-Funktion liefert dort 0,5. Damit liegt genau dort die Grenze zwischen beiden Klassen.

Code-Beispiel aus dem Notebook

# Wahrscheinlichkeiten statt nur harter Klassen
proba = lr.predict_proba(X_test)[:, 1]

# Ab 0.5 wird Klasse 1 vorhergesagt
y_pred = (proba >= 0.5).astype(int)

print(proba[:3])
print(y_pred[:3])
Was passiert hier? predict_proba liefert die Wahrscheinlichkeit für Klasse 1. Erst der gewählte Threshold macht daraus eine 0 oder 1. Wichtig: Das Modell selbst bleibt dabei gleich, nur die Entscheidungsregel danach ändert sich.

Interaktive Demo: Grenze verschieben

Bewege Achsenabschnitt und Steigungen. Du siehst sofort, wie viele Beispiele auf der falschen Seite landen.

Korrekt0
Fehler0
Threshold0.5
Faustregelx₁ + x₂ ≈ 3

🗣️ Übersetze Grenze und Klassen in Alltagssprache

Was ist gemessen? In unserem Fall, auf welcher Seite der Entscheidungsgrenze ein Punkt landet und damit, ob er Klasse 0 oder 1 bekommt.

So liest man den Wert: Alles auf der „Ja“-Seite der Grenze wird in unserem Fall zu Klasse 1. Alles auf der anderen Seite bleibt Klasse 0.

Was ist hier der schlimmste Fehler? Eine Person auf die falsche Seite zu schieben, etwa jemanden hereinzulassen, der in unserem Fall nicht hereinsollte.

✅ Mini-Check (30 Sekunden)
  1. Was ist „positiv“ (=1) in diesem Grenz-Beispiel?
  2. Was wäre ein True Positive hier als ganzer Satz?
  3. Würdest du den Threshold strenger machen, wenn dir falsches Hereinlassen wichtiger erscheint als falsches Abweisen?

🏋️ Übung: Threshold anwenden

Im Notebook taucht predict_proba auf. Ergänze die Zeile, die aus Wahrscheinlichkeiten mit einem Threshold von 0,5 harte Klassen macht.

📓 Öffne dein Jupyter Notebook oder Google Colab und probiere es selbst aus.

import numpy as np

proba = np.array([0.18, 0.52, 0.77, 0.41])
y_pred = # ??? DEINE LÖSUNG ???

print(y_pred.tolist())
💡 Tipp anzeigen

Alles ab 0,5 wird zu Klasse 1, alles darunter zu Klasse 0.

✅ Lösung anzeigen
import numpy as np

proba = np.array([0.18, 0.52, 0.77, 0.41])
y_pred = (proba >= 0.5).astype(int)

print(y_pred.tolist())

Erwartete Ausgabe: [0, 1, 1, 0]

Was nimmst du mit? Die Grenze liegt nicht „in den Daten“, sondern im Modell. Ein anderer Threshold oder andere Gewichte verschieben sie sofort.

Modul 4 von 8

Kostenfunktion: Log-Loss

Du verstehst, warum falsche Selbstsicherheit härter bestraft wird als vorsichtige Unsicherheit.

⚪ Offen

Alltagsszene

Ein Wettermoderator sagt mit 99 % Sicherheit Sonne voraus. Dann regnet es. Das ist peinlicher als eine ehrliche 55:45-Vorhersage. Genau dieses Verhalten modelliert Log-Loss.

ML-Sprache

Bei der logistischen Regression wollen wir Wahrscheinlichkeiten lernen, die zu den echten Klassen passen. Ein Modell soll besonders dann hohe Strafen bekommen, wenn es mit großer Sicherheit falsch liegt. Log-Loss bewertet also nicht nur richtig oder falsch, sondern auch, wie selbstsicher die Vorhersage war.

Formel

J(b) = -\frac{1}{n}\sum [y_i \ln(p_i) + (1-y_i)\ln(1-p_i)]

Für y = 1 zählt nur -ln(p). Für y = 0 zählt nur -ln(1-p). Wenn die falsche Wahrscheinlichkeit extrem wird, explodiert der Verlust.

Code-Beispiel

import numpy as np

p = 0.91                  # Modell ist sehr sicher
y = 1                     # echte Klasse

log_loss = -(y * np.log(p) + (1 - y) * np.log(1 - p))
print(round(log_loss, 3))
Was passiert hier? Liegt das Modell richtig und ist sicher, bleibt der Log-Loss klein. Würde hier statt 0.91 eine 0.01 stehen, wäre die Strafe riesig.

Interaktive Demo: Strafzettel für falsche Sicherheit

Log-Loss0.693
LesartMittlere Unsicherheit
Klasse1
WarnungBei falscher Selbstsicherheit steigt die Strafe steil.

🗣️ Übersetze die Zahl in Alltagssprache

Was ist gemessen? In unserem Fall, wie teuer eine Wahrscheinlichkeitsaussage war, nachdem man sie mit der echten Klasse vergleicht.

So liest man den Wert: Ein kleiner Log-Loss heißt: Das Modell lag passend und nicht peinlich selbstsicher daneben. Ein großer Log-Loss heißt: sicher falsch war hier besonders schlimm.

Was ist hier der schlimmste Fehler? Mit fast voller Sicherheit die falsche Klasse vorherzusagen.

✅ Mini-Check (30 Sekunden)
  1. Was ist „positiv“ (=1) in deinem aktuellen Beispiel?
  2. Was wäre ein True Positive hier als ganzer Satz?
  3. Würdest du bei sehr unsicherem p lieber einen vorsichtigeren Threshold wählen als bei p nahe 0.99?

Was nimmst du mit? Nicht jeder Fehler ist gleich schlimm. Log-Loss gewichtet vor allem die gefährliche Mischung aus „sicher“ und „falsch“.

Modul 5 von 8

Training mit Gradient Descent

Du siehst live, wie Gewichte angepasst werden, damit der Log-Loss sinkt und die Sigmoid-Kurve besser zu den Daten passt.

⚪ Offen

Alltagsszene

Stell dir vor, du wanderst im Nebel bergab. Du siehst nicht das ganze Tal, aber du spürst in jeder Runde die lokale Steigung. Genau so justiert Gradient Descent die Parameter des Modells.

ML-Sprache

Für logistische Regression gibt es keine bequeme geschlossene OLS-Lösung. Deshalb wird der Log-Loss Schritt für Schritt minimiert, bis die Gewichte eine gute Trennkurve ergeben.

Update-Idee

b_j := b_j - \alpha \cdot \frac{\partial J(b)}{\partial b_j}

Die Lernrate \alpha steuert, wie groß ein Schritt ist. Zu klein ist langsam, zu groß kann über das Ziel hinausschießen.

Code-Beispiel

score = b0 + b1 * x
p = 1 / (1 + np.exp(-score))

gradient_b1 = (p - y) * x
b1 = b1 - alpha * gradient_b1
Was passiert hier? Erst wird aus dem linearen Score eine Wahrscheinlichkeit. Danach misst der Gradient, in welche Richtung das Gewicht verschoben werden muss.

Interaktive Demo: Bergab auf dem Log-Loss-Berg

Schritte0
b₀0.000
b₁0.000
Log-Loss0.693

🗣️ Übersetze den Verlauf in Alltagssprache

Was ist gemessen? In unserem Fall, wie sich der Log-Loss über viele kleine Trainingsschritte verändert.

So liest man den Wert: Wenn der Log-Loss sinkt, lernt das Modell gerade so, dass seine Wahrscheinlichkeiten besser zu den echten Klassen passen.

Was ist hier der schlimmste Fehler? Nicht nur ein einzelner Fehlgriff, sondern ein Training, das gar nicht besser wird oder wegen zu großer Schritte hin und her springt.

✅ Mini-Check (30 Sekunden)
  1. Was ist hier überhaupt „besser“: ein höherer oder ein niedrigerer Loss?
  2. Was wäre ein praktischer Satz für einen True Positive im Trainingsdatensatz?
  3. Würdest du zuerst die Lernrate oder den Threshold anfassen, wenn der Loss kaum sinkt?

Was nimmst du mit? Das Modell wird nicht magisch „klug“, sondern tastet sich in kleinen Updates zu besseren Gewichten vor.

Modul 6 von 8

Der sklearn-Workflow

Du verbindest Daten, Modell, Vorhersage und Konfusionsmatrix zu einem vollständigen Praxisablauf.

⚪ Offen

Alltagsszene

Eine Hochschule bewertet Bewerbungen. GMAT, GPA und Berufserfahrung fließen in die Frage ein: Zulassen oder ablehnen? Das ist ein typisches binäres Klassifikationsproblem.

ML-Sprache

Im Workflow trennst du zuerst Merkmale und Zielvariable, teilst in Train und Test, trainierst das Modell und prüfst anschließend die Ergebnisse mit einer Konfusionsmatrix. Merkmale sind hier die Eingangsspalten in X, die Zielvariable ist die Ja/Nein-Spalte in y.

Praxisfolge

Daten → X und y → train_test_split → LogisticRegression().fit() → predict() → confusion_matrix()

Code-Beispiel aus dem Notebook

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix

df = pd.DataFrame({
    "gmat": [520, 540, 560, 580, 600, 620, 640, 660, 680, 700, 720, 740, 530, 610, 690, 750],
    "gpa": [2.2, 2.4, 2.5, 2.7, 2.9, 3.0, 3.1, 3.3, 3.4, 3.6, 3.7, 3.9, 2.3, 3.0, 3.5, 4.0],
    "work_experience": [0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 0, 2, 3, 5],
    "admitted": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1]
})

X = df[["gmat", "gpa", "work_experience"]]
y = df["admitted"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print(confusion_matrix(y_test, y_pred, labels=[0, 1]))
Was passiert hier? Das ist die kompakte sklearn-Kette direkt aus dem Notebook: Daten vorbereiten, Modell fitten, Vorhersagen erzeugen und anschließend die Fehlerarten zählen. fit() lernt die Gewichte auf dem Trainingssatz, predict() wendet sie auf neue Zeilen an.

Interaktive Demo: Workflow zum Anklicken

Gehe den Ablauf in der richtigen Reihenfolge durch. Nach dem letzten Schritt baut sich die Konfusionsmatrix auf.

Schritt 1 wartet auf dich.

Konfusionsmatrix

Vorhersage 0 Vorhersage 1
Tatsächlich 0 - -
Tatsächlich 1 - -

🗣️ Übersetze die Matrix in Alltagssprache

Was ist gemessen? In unserem Fall, wie oft Bewerbungen korrekt zugelassen oder abgelehnt wurden und welche Fehlerarten dabei entstehen.

So liest man den Wert: Die Konfusionsmatrix zeigt in unserem Fall, wie viele echte Zulassungen das Modell gefunden hat und wo es zu streng oder zu locker war.

Was ist hier der schlimmste Fehler? Das hängt am Fall. Für die Hochschule kann ein fälschlich abgelehnter guter Bewerber genauso kritisch sein wie eine unpassende Zulassung.

✅ Mini-Check (30 Sekunden)
  1. Was ist „positiv“ (=1) in unserem Zulassungs-Beispiel?
  2. Was bedeutet ein True Positive hier als ganzer Satz?
  3. Würdest du den Threshold eher senken oder erhöhen, wenn du lieber mehr passende Kandidaten zulassen möchtest?

🏋️ Übung: Kompletter Workflow

Hier ist der sklearn-Ablauf aus dem Notebook stark vereinfacht. Ergänze die Modellzeile so, dass Training und Vorhersage möglich werden.

📓 Öffne dein Jupyter Notebook oder Google Colab und probiere es selbst aus.

import pandas as pd
from sklearn.linear_model import LogisticRegression

df = pd.DataFrame({
    "gmat": [580, 620, 690, 710, 520, 640],
    "gpa": [2.8, 3.1, 3.6, 3.8, 2.4, 3.2],
    "work_experience": [1, 2, 4, 5, 0, 3],
    "admitted": [0, 0, 1, 1, 0, 1]
})

X = df[["gmat", "gpa", "work_experience"]]
y = df["admitted"]
model = # ??? DEINE LÖSUNG ???
model.fit(X, y)

print(model.predict(X).tolist())
💡 Tipp anzeigen

Das Modell stammt direkt aus sklearn und trägt denselben Namen wie das Kapitel.

✅ Lösung anzeigen
import pandas as pd
from sklearn.linear_model import LogisticRegression

df = pd.DataFrame({
    "gmat": [580, 620, 690, 710, 520, 640],
    "gpa": [2.8, 3.1, 3.6, 3.8, 2.4, 3.2],
    "work_experience": [1, 2, 4, 5, 0, 3],
    "admitted": [0, 0, 1, 1, 0, 1]
})

X = df[["gmat", "gpa", "work_experience"]]
y = df["admitted"]
model = LogisticRegression()
model.fit(X, y)

print(model.predict(X).tolist())

Erwartete Ausgabe: [0, 0, 1, 1, 0, 1]

Was nimmst du mit? Ein gutes Verständnis von X, y und der Trennung zwischen Training und Test ist oft wichtiger als tausend Parameteroptionen.

Modul 7 von 8

Threshold und Metriken

Du lernst, dass der Threshold ein Geschäftsentscheid ist und Metriken immer vom Kontext abhängen.

⚪ Offen

Alltagsszene

Ein Rauchmelder kann empfindlich oder streng eingestellt werden. Bei einem sehr niedrigen Threshold löst er oft Alarm aus. Bei einem hohen Threshold übersieht er eher echte Brände.

ML-Sprache

Threshold senken erhöht meist den Recall, weil mehr echte Positivfälle gefunden werden. Dafür steigen oft die False Positives. Threshold erhöhen macht häufig das Gegenteil.

Merksatz

ist kein Naturgesetz. Er ist eine Entscheidung darüber, welche Art von Fehler im jeweiligen Geschäftsfall teurer ist.

Code-Beispiel

proba = model.predict_proba(X_test)[:, 1]
threshold = 0.30
y_pred = (proba >= threshold).astype(int)

print(confusion_matrix(y_test, y_pred))
Was passiert hier? Du änderst nicht das Modell, sondern nur die Schwelle, ab der du „Ja“ sagst. Dadurch verschieben sich alle Metriken.

Interaktive Demo: Alarmanlage justieren

Precision0.00
Recall0.00
F10.00
Accuracy0.00

Konfusionsmatrix

Vorhersage 0 Vorhersage 1
Tatsächlich 0 0 0
Tatsächlich 1 0 0

🗣️ Übersetze die Kennzahlen in Alltagssprache

Was ist gemessen? In unserem Fall, wie sich Precision, Recall, F1 und Accuracy verändern, wenn du den Alarm-Regler verschiebst.

So liest man den Wert: Precision heißt: „Wenn das Modell 1 sagt, stimmt das in X % der Fälle.“ Recall heißt: „Von allen echten 1-Fällen findet das Modell X %.“

Was ist hier der schlimmste Fehler? In unserem Rauchmelder-Beispiel ein echter Brand, der nicht gemeldet wird. Das ist ein False Negative.

✅ Mini-Check (30 Sekunden)
  1. Was ist „positiv“ (=1) in unserem Fall?
  2. Was wäre ein True Positive hier als ganzer Satz?
  3. Würdest du den Threshold senken oder erhöhen, wenn du lieber einen Fehlalarm mehr akzeptierst als einen Brand zu übersehen?

🏋️ Übung: Threshold ändern

Erzeuge harte Vorhersagen mit einem niedrigeren Threshold. So siehst du direkt, wie mehr Fälle positiv werden.

📓 Öffne dein Jupyter Notebook oder Google Colab und probiere es selbst aus.

import numpy as np

proba = np.array([0.18, 0.33, 0.44, 0.76, 0.91])
threshold = 0.40
y_pred = # ??? DEINE LÖSUNG ???

print(y_pred.tolist())
💡 Tipp anzeigen

Wieder gilt: Alles ab dem Threshold wird zu 1.

✅ Lösung anzeigen
import numpy as np

proba = np.array([0.18, 0.33, 0.44, 0.76, 0.91])
threshold = 0.40
y_pred = (proba >= threshold).astype(int)

print(y_pred.tolist())

Erwartete Ausgabe: [0, 0, 1, 1, 1]

Was nimmst du mit? Der beste Threshold hängt vom Schadenprofil ab. In Medizin, Betrugserkennung oder Bewerbungsfiltern kann dieselbe Metrik zu ganz anderen Entscheidungen führen.

Modul 8 von 8

Multiclass-Klassifikation

Du siehst, wie aus vielen binären Entscheidungen ein Modell für drei Klassen wird.

⚪ Offen

Alltagsszene

Der Türsteher entscheidet nicht nur über „rein“ oder „nicht rein“. Auf dem Wochenmarkt sortiert er jetzt Äpfel, Birnen und Bananen. Dafür braucht er mehrere kleine Ja/Nein-Modelle.

ML-Sprache

Bei One-vs-Rest bekommt jede Klasse ihr eigenes binäres Modell. Alle Modelle liefern Wahrscheinlichkeiten. Gewonnen hat die Klasse mit dem höchsten Wert. Für drei Klassen heißt das praktisch: drei getrennte Ja/Nein-Fragen und am Ende ein Vergleich der drei Scores.

Merksatz

zerlegt ein Problem mit vielen Klassen in mehrere binäre Fragen: „Ist es meine Klasse oder nicht?“

Code-Beispiel aus dem Notebook

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, stratify=data.target, random_state=42
)

model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print(classification_report(y_test, y_pred))
Was passiert hier? Die Iris-Daten haben drei Klassen. sklearn übernimmt die One-vs-Rest-Logik intern und liefert am Ende Kennzahlen pro Klasse.

Interaktive Demo: Drei Klassen auf einen Blick

VorhersageVersicolor
Score Setosa0.00
Score Versicolor0.00
Score Virginica0.00
Setosa Versicolor Virginica Dein Punkt

🗣️ Übersetze die Scores in Alltagssprache

Was ist gemessen? In unserem Fall drei konkurrierende Klassen-Scores, aus denen am Ende genau eine Klasse gewinnt.

So liest man den Wert: Der höchste Score gewinnt. In unserem Fall heißt das: Die Blume wird der Klasse mit dem stärksten Ja-Signal zugeordnet.

Was ist hier der schlimmste Fehler? Nicht nur „falsch“, sondern falsch mit scheinbar großem Abstand, obwohl die falsche Klasse in Wahrheit nur knapp vorne lag.

✅ Mini-Check (30 Sekunden)
  1. Was ist hier „positiv“ nicht mehr nur als 0 oder 1, sondern als Gewinnerklasse?
  2. Was wäre ein richtiger Treffer hier als ganzer Satz?
  3. Welche Klasse würdest du wählen, wenn zwei Scores fast gleichauf liegen und warum?

🏋️ Übung: Iris klassifizieren

Hier übernimmst du den Kern aus dem Multiclass-Notebook. Ergänze die Datenlade-Zeile und trainiere anschließend das Modell.

📓 Öffne dein Jupyter Notebook oder Google Colab und probiere es selbst aus.

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

data = # ??? DEINE LÖSUNG ???
X = data.data
y = data.target

model = LogisticRegression(max_iter=200)
model.fit(X, y)

print(model.predict(X[:3]).tolist())
💡 Tipp anzeigen

Die Funktion heißt genauso wie der Datensatz.

✅ Lösung anzeigen
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

data = load_iris()
X = data.data
y = data.target

model = LogisticRegression(max_iter=200)
model.fit(X, y)

print(model.predict(X[:3]).tolist())

Erwartete Ausgabe: [0, 0, 0]

Was nimmst du mit? Multiclass bedeutet nicht automatisch ein völlig neues Modell. Oft ist es dieselbe Grundidee, nur mehrfach parallel gestellt.