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:
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.
Aufgabe
MittelEtwa 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.
- Korrigiere die Aufteilung, sodass beide Datensätze denselben Anteil defekter Lager enthalten.
- 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.833Probier 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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Überwachtes Lernen
1Dein erstes Modell
Aus Beispielen lernenTrainings- und TestdatensätzeAnpassen und VorhersagenEin Modell bewertenRückblick: Saatgutsortierer4Logistische Regression
Ja-Nein-VorhersagenDie EntscheidungsschwelleGewichte als IndizienMehrere KlassenRückblick: Spamfilter2Nächste Nachbarn
So entscheidet k-NNk wählenEntscheidungsgrenzenSkalierung für NachbarnRückblick: Wein-Nachbarn5Klassifikatoren bewerten
Die KonfusionsmatrixPräzision und TrefferquoteDer F1-ScoreUnausgewogene KlassenROC-KurvenRückblick: Screeningtest3Lineare Regression
Zahlen vorhersagenMehrere MerkmaleFehler messenResiduenplotsZusammenfassung: Fahrradverleih6Entscheidungsbäume
Bäume stellen FragenEinen Baum lesenBaumtiefeMerkmalswichtigkeitRückblick: Kreditentscheidungen9Ensembleverfahren
Random ForestsWarum Random Forests funktionierenGradient BoostingRückblick: Förster des Waldes12Abschließende Herausforderungen
Diabetes-FortschrittKreditgenehmigungHandgeschriebene ZiffernKundenabwanderungÜbe selbstständig: Online-Python-Compiler