Các lớp mất cân bằng
Thuộc phần Học có giám sát trong hành trình Machine Learning của Coddy. Bài học 24 trên 58.
Khi 95 trong số 100 bệnh nhân khỏe mạnh, một mô hình luôn dự đoán là khỏe mạnh sẽ đạt độ chính xác 95% nhưng không phát hiện được ai. Với các lớp mất cân bằng, độ chính xác có thể gây hiểu lầm:
Hai cách khắc phục. stratify=y giữ tỷ lệ 95 trên 5 ở cả hai tập, nên tập kiểm tra có bệnh nhân bị bệnh để phát hiện. class_weight="balanced" giúp mỗi dòng thuộc lớp hiếm có trọng số lớn hơn:
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")Mô hình cân bằng đánh đổi một chút độ chính xác tổng thể (accuracy) để phát hiện được nhiều trường hợp hơn. Với các trường hợp hiếm, hãy xem độ thu hồi (recall) và độ chính xác (precision), đừng chỉ xem độ chính xác tổng thể.
Thử thách
Trung bìnhKhoảng 5% vòng bi trong một nhà máy bị hỏng sớm. Đoạn code ban đầu chia hồ sơ từ băng thử và đánh giá một mô hình thông thường, nhưng tập kiểm tra chỉ có 2 vòng bi bị lỗi, nên con số 0.993 không có nhiều ý nghĩa.
- Sửa cách chia để cả hai tập đều giữ cùng tỷ lệ vòng bi bị lỗi.
- Huấn luyện mô hình thứ hai, tăng trọng số cho các hàng bị lỗi, rồi in dòng kết quả như bên dưới.
Với một băng thử khác:
Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833Tự làm thử
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
# Mỗi hàng tương ứng với một vòng bi trên băng thử: giá trị 1 trong faulty nghĩa là vòng bi đó hỏng ngay sau đó
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]
# Sửa cách chia dữ liệu này
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}")
# Viết code của bạn bên dưới
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Học có giám sát
1Mô hình đầu tiên của bạn
Học từ ví dụTập huấn luyện và tập kiểm traHuấn luyện và dự đoánChấm điểm mô hìnhÔn tập: Bộ sắp xếp hạt giống2Láng giềng gần nhất
Cách k-NN đưa ra quyết địnhChọn kRanh giới quyết địnhChuẩn hóa dữ liệu cho láng giềngÔn tập: láng giềng với dữ liệu rượu vang5Đánh giá bộ phân loại
Ma trận nhầm lẫnĐộ chính xác và độ thu hồiĐiểm F1Các lớp mất cân bằngĐường cong ROCÔn tập: Bài kiểm tra sàng lọc11Dự án: Các loài chim cánh cụt
Làm quen với chim cánh cụtChuẩn bị dữ liệuChọn mô hìnhTinh chỉnh mô hình tốt nhấtĐưa mô hình vào sử dụng3Hồi quy tuyến tính
Dự đoán các con sốNhiều đặc trưngĐo lường sai sốBiểu đồ phần dưÔn tập: Thuê xe đạp6Cây quyết định
Cây đặt câu hỏiĐọc câyĐộ sâu của câyTầm quan trọng của đặc trưngÔn tập: quyết định cho vay9Các mô hình tổ hợp
Rừng ngẫu nhiênVì sao rừng hoạt động hiệu quảTăng cường độ dốcÔn tập: Người kiểm lâm rừng12Thử thách cuối cùng
Tiến triển của bệnh tiểu đườngPhê duyệt tín dụngChữ số viết tayKhách hàng rời bỏTự luyện tập: Trình biên dịch Python online