Menu
CoddyTech

Dengesiz Sınıflar

Coddy'nin Machine Learning Journey'sinin Denetimli Öğrenme bölümünün bir parçası. Ders 24 / 58.

100 hastanın 95'i sağlıklı olduğunda, her zaman sağlıklı diyen bir model %95 doğruluk elde eder ve hiç kimseyi yakalayamaz. Dengesiz sınıflarda doğruluk yanıltıcı olabilir:

%5'i hasta olan verilerde üç modelin doğruluk ve duyarlılık çubukları. Her zaman sağlıklı: doğruluk 0.95, duyarlılık 0.00. Basit model: 0.98 ve 0.62. Dengeli model: 0.94 ve 0.92

İki düzeltme. stratify=y, her iki kümede de 95'e 5 oranını korur; böylece test kümesinde yakalanacak hasta hastalar bulunur. class_weight="balanced", nadir görülen her satırın ağırlığını artırır:

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

Dengeli model, çok daha fazla vakayı yakalamak için doğruluktan biraz ödün verir. Nadir vakalarda doğruluğa değil, duyarlılık ve kesinlik değerlerine bakın.

challenge icon

Görev

Orta

Bir fabrikanın rulmanlarının yaklaşık %5'i erken arızalanır. Başlangıç kodu bir test tezgâhının kayıtlarını böler ve ağırlıklandırılmamış bir modelin puanını hesaplar, ancak test kümesinde yalnızca 2 arızalı rulman vardır; bu yüzden 0.993 değeri pek bir şey ifade etmez.

  1. Bölmeyi, her iki kümede de arızalı rulmanların aynı oranda bulunacağı şekilde düzeltin.
  2. Arızalı satırlara daha fazla ağırlık veren ikinci bir model eğitin ve aşağıdaki satırı yazdırın.

Başka bir test tezgâhı için:

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

Kendin dene

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

# Test düzeneğindeki her rulman için bir satır: faulty alanındaki 1, rulmanın kısa süre sonra arızalandığı anlamına gelir
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]

# Bu bölmeyi düzelt
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}")

# Kodunu aşağıya yaz
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Denetimli Öğrenme bölümündeki tüm dersler

Kendi başına pratik yap: Online Python derleyicisi