Động cơ Tính toán Ma trận Đánh giá Phân loại Đa lớp & ROC-AUC
Khi đánh giá mô hình học máy phân loại gian lận hoặc chẩn đoán y tế, chỉ số Accuracy thường vô nghĩa do mất cân bằng dữ liệu nghiêm trọng (Imbalanced Classes). Kỹ sư AI cần có một…
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: confusion matrix construction, precision recall f1, trapezoidal integration, roc curve.
Nội dung đề bài
Mục tiêu kiến thức
- Xây dựng hệ thống đo lường hiệu năng mô hình phân loại (Classification Metrics Engine) theo chuẩn công nghiệp AI.
- Tự thiết lập Ma trận nhầm lẫn (Confusion Matrix Cij) cho bài toán phân loại đa lớp bất kỳ (K ≥ 2).
- Tính toán chính xác độ chuẩn xác (Precision), độ nhạy (Recall), điểm F1 theo cả hai phương thức Macro-average và Micro-average, xử lý triệt để trường hợp mẫu số bằng 0.
- Tự cài đặt thuật toán tính Diện tích dưới đường cong ROC (ROC-AUC) cho bài toán nhị phân bằng tích phân hình thang (Trapezoidal Numerical Integration) không cần scikit-learn.
Mô tả bài toán
Khi đánh giá mô hình học máy phân loại gian lận hoặc chẩn đoán y tế, chỉ số Accuracy thường vô nghĩa do mất cân bằng dữ liệu nghiêm trọng (Imbalanced Classes). Kỹ sư AI cần có một công cụ đo lường toàn diện phản ánh đúng ma trận nhầm lẫn, các chỉ số F1 và khả năng phân tách của phân phối xác suất dự đoán (ROC-AUC).
Hãy viết hàm: compute_classification_evaluation(y_true: np.ndarray, y_pred: np.ndarray, y_prob: np.ndarray = None, num_classes: int = 2) -> dict
Yêu cầu thực hiện:
- Kiểm tra đầu vào:
y_truevày_predphải là mảng 1D số nguyên có cùng kích thước N ≥ 1. Các nhãn phải nằm trong khoảng [0, num_classes - 1]. Nếu không, némValueError.num_classesphải là số nguyên ≥ 2.- Ma trận nhầm lẫn (Confusion Matrix):
- Tạo ma trận C ∈ ZK × K với K = num_classes:
Cij = ∑m=1N I(ytrue[m] == i and ypred[m] == j)
- Trong đó dòng i là nhãn thực tế, cột j là nhãn dự đoán.
- Chỉ số theo từng lớp (Per-Class Metrics):
- Với mỗi lớp k ∈ [0, K - 1]:
- TPk = Ckk
- FPk = ∑i ≠ k Cik
- FNk = ∑j ≠ k Ckj
- Precisionk = TPkTPk + FPk (gán 0.0 nếu mẫu số = 0).
- Recallk = TPkTPk + FNk (gán 0.0 nếu mẫu số = 0).
- F1k = 2 × Precisionk × RecallkPrecisionk + Recallk (gán 0.0 nếu mẫu số = 0).
- Chỉ số Tổng hợp toàn cục:
- Accuracy: ∑k=0K-1 CkkN.
- Macro Metrics: Trung bình số học giản đơn của các lớp:
Macro_Precision = 1K ∑ Precisionk Macro_Recall = 1K ∑ Recallk Macro_F1 = 1K ∑ F1k.
- Micro Metrics:
Micro_Precision = Micro_Recall = Micro_F1 = Accuracy.
- Tính diện tích ROC-AUC (nếu
num_classes == 2vày_probkhácNone): y_problà mảng 1D xác suất dự đoán của lớp 1 (các giá trị ∈ [0.0, 1.0]).- Sắp xếp các giá trị xác suất duy nhất theo thứ tự giảm dần làm các ngưỡng phân loại θ. Thêm ngưỡng ∞ và -∞.
- Tại mỗi ngưỡng θ, dự đoán y = 1 nếu p ≥ θ ngược lại 0.
- Tính cặp (FPR(θ), TPR(θ)):
TPR = TPTP + FN, FPR = FPFP + TN.
- Tính diện tích tích phân bằng công thức hình thang:
AUC = ∑i=1M-1 (FPRi - FPRi-1) × TPRi + TPRi-12.
- Nếu dữ liệu chỉ có 1 lớp (không có cả 0 và 1 trong
y_true), gánroc_auc = 0.5. - Đầu ra:
- Trả về dictionary:
{
"confusion_matrix": C.tolist(),
"accuracy": round(acc, 4),
"macro_precision": round(macro_p, 4),
"macro_recall": round(macro_r, 4),
"macro_f1": round(macro_f1, 4),
"micro_f1": round(micro_f1, 4),
"roc_auc": round(auc, 4) if auc is not None else None
}Input
- Các tham số truyền vào hàm/lớp compute_classification_evaluation hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp compute_classification_evaluation hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Số mẫu: 1 ≤ N ≤ 105.
- Tuyệt đối không dùng thư viện
sklearn.metrics.
Ví dụ 1
Input
compute_classification_evaluation(y_true=[0, 1, 2, 0, 1, 2], y_pred=[0, 1, 2, 0, 2, 1], num_classes=3)Output
{'confusion_matrix': [[2, 0, 0], [0, 1, 1], [0, 1, 1]], 'accuracy': 0.6667, 'macro_f1': 0.6667, 'roc_auc': None}Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
compute_classification_evaluation(y_true=[0, 0, 1, 1], y_pred=[0, 0, 1, 1], y_prob=[0.1, 0.2, 0.8, 0.9], num_classes=2)Output
{'confusion_matrix': [[2, 0], [0, 2]], 'accuracy': 1.0, 'macro_f1': 1.0, 'roc_auc': 1.0}Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
