Confusion Matrix
Ma trận nhầm lẫn thống kê dự đoán của model đối chiếu với nhãn thực tế theo từng lớp. Tìm hiểu cách đọc ma trận, các metric thu được và dạng dùng cho phát hiện.
Ma trận nhầm lẫn là bảng đếm mức độ khớp giữa dự đoán của model phân loại với nhãn thực. Một trục liệt kê các lớp thực tế, trục còn lại liệt kê các lớp được dự đoán, và mỗi ô đếm số mẫu thuộc cặp lớp tương ứng. Dự đoán đúng nằm trên đường chéo, còn mọi lỗi nằm ngoài đường chéo, tại ô chỉ rõ chính xác lớp nào bị nhầm thành lớp nào. Vì vậy, ma trận nhầm lẫn là cách xem đầu tiên tiêu chuẩn về lỗi của model và là cơ sở để tính accuracy, precision, recall và F1-score.
Cách đọc ma trận nhầm lẫn nhị phân#
Với hai lớp, ma trận có bốn ô:
- Dương tính thật (TP): mẫu dương tính được dự đoán là dương tính, chẳng hạn một linh kiện lỗi được đánh dấu là bị lỗi.
- Dương tính giả (FP): mẫu âm tính được dự đoán là dương tính, còn gọi là lỗi loại I hoặc cảnh báo sai.
- Âm tính giả (FN): mẫu dương tính được dự đoán là âm tính, còn gọi là lỗi loại II hoặc bỏ sót.
- Âm tính thật (TN): mẫu âm tính được dự đoán là âm tính.
Hầu hết metric nhị phân là tỷ số được tính từ bốn số đếm này. Precision bằng TP / (TP + FP), recall bằng TP / (TP + FN), còn accuracy bằng (TP + TN) chia cho tổng của cả bốn số đếm. Ô ngoài đường chéo nào quan trọng hơn tùy thuộc vào ứng dụng: sàng lọc ung thư được tinh chỉnh để giữ số âm tính giả ở mức thấp, còn bộ lọc thư rác được tinh chỉnh để giảm số dương tính giả.
Ma trận nhầm lẫn đa lớp#
Với N lớp, ma trận có kích thước N × N. Theo cách sắp xếp được dùng trong scikit-learn's confusion_matrix, mỗi hàng là một lớp thực và mỗi cột là một lớp được dự đoán. Đọc theo hàng cho biết các mẫu của lớp đó được phân loại thành lớp nào, vì vậy ô đường chéo chia cho tổng hàng là recall của lớp. Đọc theo cột cho biết các dự đoán của model về lớp đó thực sự thuộc lớp nào, vì vậy ô đường chéo chia cho tổng cột là precision của lớp. Một số công cụ hiển thị ma trận chuyển vị, do đó nhãn trục quyết định cách đọc biểu đồ.
from sklearn.metrics import confusion_matrix
# Nhãn thực và nhãn được dự đoán cho 10 ảnh
y_true = ["cat", "cat", "cat", "dog", "dog", "dog", "dog", "fox", "fox", "fox"]
y_pred = ["cat", "cat", "dog", "dog", "dog", "dog", "cat", "fox", "dog", "fox"]
# Các hàng là lớp thực và các cột là lớp được dự đoán, theo thứ tự nhãn này
labels = ["cat", "dog", "fox"]
matrix = confusion_matrix(y_true, y_pred, labels=labels)
print(matrix)Các hàng được in cho cat, dog và fox lần lượt là [2 1 0], [1 3 0] và [0 1 2]. Đường chéo chứa 7 trong số 10 ảnh, nên accuracy là 0.7. Cột dog gồm một cat và một fox, khiến precision của dog là 3 / 5 = 0.6; hàng dog có một ảnh bị nhầm thành cat, khiến recall của dog là 3 / 4 = 0.75. Ma trận chuẩn hóa chia mỗi ô cho tổng số mẫu của lớp thực tương ứng, nên đường chéo thể hiện recall theo lớp và các lớp có quy mô rất khác nhau trở nên có thể so sánh.
Ma trận nhầm lẫn trong object detection#
Detection bổ sung một lớp nền vì detector có thể dự đoán một bounding box tại vị trí không có đối tượng hoặc bỏ sót hoàn toàn một đối tượng. Trước tiên, dự đoán được ghép với nhãn bằng tỷ lệ giao trên hợp (IoU), sau đó được đếm: các cặp đã ghép nằm trong ô của lớp tương ứng, dự đoán không được ghép được tính là dương tính giả đối với lớp nền, còn nhãn không được ghép được tính là âm tính giả dự đoán thành lớp nền. Ô nền-nền luôn để trống vì không thể đếm các vùng trống trong ảnh, nên ma trận detection không có âm tính thật. Validation của YOLO26 tạo ma trận này với thêm một hàng và một cột cho lớp nền, ghép dự đoán với nhãn tại IoU trên 0.45, rồi lưu thành confusion_matrix.png với các lớp được dự đoán trên trục dọc và các lớp thực trên trục ngang.
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validation builds the confusion matrix and saves it as confusion_matrix.png
metrics = model.val(data="coco8.yaml")
matrix = metrics.confusion_matrix.matrix # rows: predicted class, columns: true class
# 80 COCO classes plus one background row and column
print(matrix.shape)
# Class 0 is "person": correct detections and people the model missed
print(f"Person TP: {matrix[0, 0]:.0f}, missed: {matrix[-1, 0]:.0f}")Kích thước ma trận là (81, 81), và hàng cuối cùng đếm số người có nhãn nhưng không được dự đoán nào khớp.
Ma trận nhầm lẫn và các công cụ liên quan#
- Đường cong ROC: mỗi ngưỡng quyết định tương ứng với một điểm; mỗi điểm tóm tắt ma trận nhầm lẫn tại ngưỡng đó bằng tỷ lệ dương tính thật và tỷ lệ dương tính giả.
- Độ chính xác trung bình (mAP): điểm số chính dùng trong detection, được tính từ cùng các quyết định TP và FP trên mọi mức độ tin cậy mà không cho biết những lớp nào bị nhầm lẫn.
- Accuracy: ma trận được rút gọn thành một con số, bằng tổng các ô trên đường chéo chia cho tổng số mẫu. Với dataset có 95% mẫu âm tính, model luôn dự đoán "âm tính" sẽ đạt accuracy 95%, trong khi ma trận cho thấy không có dương tính thật nào.










