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:
İ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.
Görev
OrtaBir 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.
- Bölmeyi, her iki kümede de arızalı rulmanların aynı oranda bulunacağı şekilde düzeltin.
- 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.833Kendin 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
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
1İlk Modeliniz
Örneklerden ÖğrenmeEğitim ve Test KümeleriUydurma ve Tahmin EtmeBir Modeli PuanlamaÖzet: Tohum Sınıflandırıcı4Lojistik Regresyon
Evet-Hayır TahminleriKarar EşiğiKanıt Olarak AğırlıklarBirden Fazla SınıfÖzet: Spam Filtresi2En Yakın Komşular
k-NN Nasıl Karar Verirk'yi SeçmekKarar SınırlarıKomşular İçin ÖlçeklemeÖzet: Şarap Komşuları5Sınıflandırıcıları Değerlendirme
Karmaşıklık MatrisiKesinlik ve DuyarlılıkF1 SkoruDengesiz SınıflarROC EğrileriÖzet: Tarama Testi8Çapraz Doğrulama
K-Katlı DoğrulamaModelleri Adil Bir Şekilde KarşılaştırmaIzgara AramasıÖzet: Kaykay Tamiri11Proje: Penguen Türleri
Penguenlerle TanışınVerileri HazırlayınBir Model SeçinEn İyisini AyarlayınModeli Yayına AlınKendi başına pratik yap: Online Python derleyicisi