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:
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ść.
Wyzwanie
ŚredniOkoł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.
- Popraw podział, aby oba zbiory zachowały taki sam udział wadliwych łożysk.
- 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.833Spró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
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Uczenie nadzorowane
1Twój pierwszy model
Uczenie się na przykładachZbiory treningowe i testoweDopasowywanie i przewidywanieOcena modeluPodsumowanie: Sortownik nasion4Regresja logistyczna
Przewidywanie „tak” lub „nie”Próg decyzyjnyWagi jako dowodyWiele klasPodsumowanie: filtr spamu2Najbliżsi sąsiedzi
Jak działa k-NNWybór kGranice decyzyjneSkalowanie dla sąsiadówPodsumowanie: sąsiedzi w zbiorze Wine5Ocena klasyfikatorów
Macierz pomyłekPrecyzja i czułośćWynik F1Niezrównoważone klasyKrzywe ROCPodsumowanie: test przesiewowy8Walidacja krzyżowa
Walidacja k-krotnaUczciwe porównywanie modeliPrzeszukiwanie siatkiPodsumowanie: naprawa deskorolki11Projekt: Gatunki pingwinów
Poznaj pingwinyPrzygotuj daneWybierz modelDopracuj zwycięski modelWdróż modelPoćwicz samodzielnie: Kompilator Python online