python-056Đọc toàn bộ đề miễn phí

Độ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…

PythonNâng cao35 phú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ủ đề

machine learningmodel evaluationconfusion matrixroc aucf1 score

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_true và y_pred phả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ém ValueError.
  • num_classes phả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 == 2 và y_prob khác None):
  • y_prob là 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án roc_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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.