Menu
CoddyTech

Niezrównoważone klasy

Część sekcji Uczenie nadzorowane ścieżki Machine Learning w Coddy. Lekcja 24 z 58.

Gdy 95 ze 100 pacjentów jest zdrowych, model, który zawsze odpowiada „zdrowy”, osiąga dokładność 95% i nie wykrywa żadnego chorego. Przy niezrównoważonych klasach dokładność schlebia:

Słupki dokładności i czułości dla trzech modeli na danych, w których 5% pacjentów jest chorych. Zawsze zdrowy: dokładność 0.95, czułość 0.00. Zwykły model: 0.98 i 0.62. Zrównoważony model: 0.94 i 0.92

Dwie poprawki. stratify=y zachowuje proporcję 95 do 5 w obu zbiorach, dzięki czemu w zbiorze testowym są chorzy pacjenci, których można wykryć. class_weight="balanced" sprawia, że każdy rzadki wiersz ma większą wagę:

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")

Zrównoważony model poświęca nieco dokładności, aby wykryć znacznie więcej przypadków. W przypadku rzadkich zdarzeń zwracaj uwagę na czułość i precyzję, a nie na dokładność.

challenge icon

Wyzwanie

Średni

Około 5% łożysk w fabryce ulega przedwczesnej awarii. Kod początkowy dzieli rekordy ze stanowiska testowego i ocenia zwykły model, ale w jego zbiorze testowym są tylko 2 wadliwe łożyska, więc wynik 0.993 niewiele znaczy.

  1. Popraw podział, aby oba zbiory zachowały taki sam udział wadliwych łożysk.
  2. Wytrenuj drugi model, który przypisuje większą wagę wadliwym wierszom, i wyświetl jego wynik tak jak poniżej.

Dla innego stanowiska:

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

Spróbuj swoich sił

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

# Jeden wiersz na każde łożysko ze stanowiska testowego: 1 w faulty oznacza, że łożysko wkrótce potem uległo awarii
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]

# Popraw ten podział
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}")

# Wpisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nadzorowane

Poćwicz samodzielnie: Kompilator Python online