Kelas Tidak Seimbang
Termasuk bagian Pembelajaran Terawasi dalam perjalanan Machine Learning di Coddy. Pelajaran 24 dari 58.
Ketika 95 dari 100 pasien sehat, model yang selalu menyatakan pasien sehat mendapat akurasi 95% dan tidak menemukan satu pun pasien yang sakit. Pada kelas yang tidak seimbang, akurasi memberikan gambaran yang menyesatkan:
Dua perbaikan. stratify=y mempertahankan proporsi 95 banding 5 di kedua set, sehingga set pengujian memiliki pasien yang sakit untuk dideteksi. class_weight="balanced" membuat setiap baris yang langka dihitung lebih besar:
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")Model yang seimbang mengorbankan sedikit akurasi demi menangkap lebih banyak kasus. Untuk kasus yang jarang terjadi, perhatikan recall dan presisi, bukan akurasi.
Tantangan
SedangSekitar 5% bantalan di pabrik mengalami kegagalan lebih awal. Kode awal membagi catatan dari bangku uji dan menilai model biasa, tetapi test set-nya hanya berisi 2 bantalan yang gagal, jadi nilai 0.993-nya tidak banyak berarti.
- Perbaiki pembagiannya agar kedua set memiliki proporsi bantalan yang gagal yang sama.
- Latih model kedua yang memberi bobot lebih besar pada baris yang gagal, lalu cetak barisnya seperti di bawah.
Untuk bangku uji lain:
Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833Coba sendiri
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
# Satu baris untuk setiap bantalan dari alat uji: 1 pada faulty berarti bantalan itu rusak tak lama kemudian
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]
# Perbaiki pembagian data ini
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}")
# Tulis kodemu di bawah ini
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pembelajaran Terawasi
1Model Pertamamu
Belajar dari ContohData Latih dan Data UjiMelatih dan MemprediksiMenilai ModelRangkuman: Penyortir Benih4Regresi Logistik
Prediksi Ya atau TidakAmbang KeputusanBobot sebagai BuktiBeberapa KelasRangkuman: Filter Spam2Tetangga Terdekat
Cara k-NN MenentukanMemilih kBatas KeputusanPenskalaan untuk TetanggaRingkasan: Tetangga Wine5Mengukur Model Klasifikasi
Matriks KonfusiPresisi dan RecallSkor F1Kelas Tidak SeimbangKurva ROCRangkuman: Tes SkriningLatihan sendiri: Compiler Python online