Menu
CoddyTech

Unausgewogene Klassen

Teil des Abschnitts Überwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 24 von 58.

Wenn 95 von 100 Patienten gesund sind, erzielt ein Modell, das immer „gesund“ sagt, eine Genauigkeit von 95 % und erkennt niemanden. Bei unausgeglichenen Klassen schmeichelt die Genauigkeit:

Balken für Genauigkeit und Trefferquote für drei Modelle bei Daten mit 5 % kranken Patienten. Immer gesund: Genauigkeit 0.95, Trefferquote 0.00. Einfaches Modell: 0.98 und 0.62. Ausgeglichenes Modell: 0.94 und 0.92

Zwei Korrekturen. stratify=y hält den Anteil von 95 zu 5 in beiden Datensätzen konstant, sodass der Testsatz kranke Patienten enthält, die erkannt werden können. class_weight="balanced" gewichtet jede seltene Zeile stärker:

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=0, stratify=y)
model = LogisticRegression(max_iter=1000, class_weight="balanced")

Das ausgewogene Modell tauscht ein wenig Genauigkeit gegen deutlich mehr erkannte Fälle ein. Bei seltenen Fällen solltest du Recall und Präzision betrachten, nicht die Genauigkeit.

challenge icon

Aufgabe

Mittel

Etwa 5 % der Lager in einer Fabrik fallen frühzeitig aus. Der Starter teilt die Aufzeichnungen eines Prüfstands auf und bewertet ein einfaches Modell, aber sein Testsatz enthält nur 2 defekte Lager, daher sagt der Wert 0.993 wenig aus.

  1. Korrigiere die Aufteilung, sodass beide Datensätze denselben Anteil defekter Lager enthalten.
  2. Trainiere ein zweites Modell, das defekte Zeilen stärker gewichtet, und gib seine Zeile wie unten aus.

Für einen anderen Prüfstand:

Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833

Probier es selbst

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score

# Eine Zeile pro Lager vom Prüfstand: 1 in faulty bedeutet, dass es kurz darauf ausgefallen ist
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]

# Korrigiere diese Aufteilung
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"Faulty bearings: train {y_train.mean() * 100:.1f}%, test {y_test.mean() * 100:.1f}%")

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

plain = LogisticRegression(max_iter=1000)
plain.fit(X_train, y_train)
pred = plain.predict(X_test)
print(f"Plain: accuracy {accuracy_score(y_test, pred):.3f}, recall {recall_score(y_test, pred):.3f}")

# Schreibe deinen Code unten
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Überwachtes Lernen

Übe selbstständig: Online-Python-Compiler