Trong các bài toán phân loại, confusion matrix là một bảng đặc biệt được dùng để minh họa hiệu quả của các thuật toán. Bài viết này sẽ cố gắng hiểu hơn về confusion matrix.
Math2IT ưu tiên giữ lại thuật ngữ trong tiếng Anh để bạn đọc dễ dàng tìm kiếm tài liệu tham khảo mà không dịch ra tiếng Việt.
Để dễ dàng trong việc hiểu hơn về CM, chúng ta hãy xem xét một ví dụ đơn giản. Giả sử ta cần dự đoán kết quả xét nghiệm của 1005 bệnh nhân xem họ có bị ung thư hay không. Dưới đây là những gì mô hình của chúng ta dự đoán:
- 90 bệnh nhân bị ung thư và tất cả dự đoán này của chúng ta đều đúng.
- 915 bệnh nhân không bị ung thư nhưng thật ra có tới 910 người lại bị trong thực tế.
Để dễ dàng minh họa các kết quả ở trên, chúng ta sử dụng confusion matrix như dưới đây (Câu hỏi: Bệnh nhân này có bị bệnh ung thư không?):
Có lẽ nó có tên gọi là “Confusion Matrix” vì khi đọc thông tin và hiểu thông tin mà nó truyền tải, chúng ta có hơi bối rối (confused) một chút (tôi đùa đấy).
Trong bảng trên, có 4 thuật ngữ ta cần để ý đến:
- True Positive (TP): những bệnh nhân ta đoán là có bệnh đúng là đang mang bệnh.
- True Negative (TN): những bệnh nhân ta đoán là không có bệnh đúng là đang khỏe mạnh.
- False Positive (FP): những bệnh nhân ta đoán là có bệnh thật ra đang khỏe mạnh.
- False Negative (FN): những bệnh nhân ta đoán là không có bệnh thật ra đang mang bệnh.
FP và FN đôi khi còn được gọi dưới những cái tên khác trong Thống kê là Sai lầm loại I (Type I error) và Sai lầm loại II (Type II error).
Bên dưới là một hình minh họa vui cho chúng ta thêm một ví dụ nữa của CM trong việc dự đoán có thai hay không (nguồn).
Trong bảng trên, lúc thì True, lúc thì False, lúc thì Positive, lúc thì Negative. Vậy làm sao chúng ta có thể nhớ được chính xác cái nào là cái nào và ở vị trí nào trong ma trân trên? Dưới đây là một mánh nhỏ để nhớ dựa vào tên gọi của các thuật ngữ.
- True/False ý chỉ những gì chúng ta dự đoán đã đúng hay chưa (true or false).
- Positive/Negative ý chỉ những gì chúng ta dự đoán (có hoặc không).
Nói khác đi, nếu chúng ta thấy chữ “True”, điều đó nghĩa là tất cả những gì chúng ta dự đoán đều đúng hết cả. Nếu chúng ta dự đoán 90 bệnh nhân có bệnh (TP) thì đúng là trong thực tế 90 bệnh nhân đó đang mang bệnh. Còn nếu chúng ta dự đoán có 5 bệnh nhân không mang bệnh (TN) thì trong thực tế đúng là họ đang rất khỏe mạnh.
Ngược lại, nếu ta thấy chữ “False” có nghĩa là những gì chúng ta dự đoán trật hết. Những bệnh nhân ta đoán là có bệnh thì lại không trong thực tế và ngược lại.
Với CM, chúng ta sẽ tính được hai đại lượng quan trọng là Precision và Recall.
Precision: đây là tỷ lệ giữa những người thật sự có bệnh so với tất cả các ca được dự đoán là có bệnh. Nói cách khác, có bao nhiêu dự đoán “positive” là thật sự “true” trong thực tế?
Rõ ràng, ta chỉ dự đoán 90 người có bệnh và trong thực tế những người này đúng là đang bị bệnh thât. Vậy ra, 100% số người ta dự đoán có bệnh là chính xác!
Recall (đôi khi còn được gọi là Sensitivity): trong những người thực sự có bệnh, bao nhiêu trong số họ được dự đoán đúng bởi mô hình của chúng ta? Nói cách khác, có bao nhiêu dự đoán “positive” đúng là do mô hình của chúng ta đưa ra?
Rõ ràng, ta chỉ dự đoán 90 người có bệnh trong khi có tới 1000 người trong thực tế mắc bệnh. Vậy ra, mô hình của chúng ta chỉ có thể dự đoán được số lượng người có bệnh trong thực tế.
Bên dưới là confusion matrix sau khi đã thêm vào precision và recall.
Chúng ta có thể hiểu gì về Precision và Recall? Nếu một trong hai cái này có giá trị cao còn cái kia có giá trị thấp (hoặc ngược lại) thì sao? Ý nghĩa của chúng như thế nào?
Nhìn lại ví dụ ở bảng trên, nếu chúng ta chỉ dựa vào Precision, mô hình của chúng ta thật sự rất tốt (Precision = 100%). Tất cả các ca có bệnh mà chúng ta dự đoán đều chính xác.
Tuy nhiên ngó lại Recall (9%), có tới 910 bệnh nhân bị dự đoán sai và họ không được điều trị. 91% số ca bị nhiễm bệnh sẽ cầm chắc cái chết. Mô hình của chúng ta hoàn toàn rất tệ trong trường hợp này!
Nếu ngược lại thì sao? Giả sử confusion matrix là bảng dưới đây (câu hỏi: Bệnh nhân có mắc ung thư không?).
Trong trường hợp này Precision rất nhỏ nếu đem so với Recall (9% so với 90%). Chúng ta đã dự đoán sai quá nhiều người lành thành người bệnh. Tuy nhiên có vẻ như dự đoán sai này “ít tác hại” hơn là trường hợp trước đó. 90% trường hợp này có thể “bị” hóa trị nhầm nhưng ít ra là có thể họ vẫn sống, trong khi ở trường hợp precision cao/recall thấp, số lượng người không được điều trị quá cao và cầm chắc cái chết sớm!
Precision cho chúng ta biết những “dự đoán có” của chúng ta chính xác bao nhiêu (Liệu trong 1000 người ta dự đoán mắc bệnh thì có mấy người thật sự bị?). Tuy nhiên sẽ có một câu hỏi nảy ra trong đầu chúng ta là “Liệu chúng ta có dự đoán thiếu kết quả nào không?” (Ta có bỏ sót bệnh nhân nào đang mắc bệnh mà không dự đoán không?). Recall sẽ cung cấp câu trả lời cho câu hỏi này!
Nếu bạn muốn sửa đổi thuật toán để tăng một trong hai precison và recall, cái còn lại sẽ bị giảm đi.
Một ví dụ khác. Bạn muốn xây dựng một hệ thống gợi ý sản phẩm trực tuyến. Dự đoán “Positive” trong trường hợp này chính là “Những sản phẩm thật sự thu hút khách hàng“. Mô hình của bạn sẽ hiển thị những sản phẩm liên quan đến sản phẩm mà họ đang xem để họ có thể mua thêm nhiều sản phẩm khác trên trang web bán hàng của bạn (Amazon, Tiki, Lazada,… chẳng hạn).
- Nếu precision quá cao trong khi recall lại thấp, những gợi ý của bạn đúng là thu hút được khách hàng nhưng bạn lại bỏ qua quá nhiều sản phẩm tiềm năng khác cũng có khả năng thu hút họ không kém.
- Ngược lại, nếu precision thấp trong khi recall cao thì bạn sẽ chắc chắn tất cả các sản phẩm tiềm năng sẽ được giới thiệu đến khách hàng. Tuy nhiên, những sản phẩm thừa mứa và vô vị khác cũng sẽ chen chân vào đây và khiến cho khách hàng của bạn không mấy mặn mà, họ có thể đổi sang trang khác để mua!
Bạn thấy đấy, khác với trường hợp “dự đoán có bệnh” vốn xem việc recall cao là quan trọng (chúng ta hạn chế bỏ sót những người thật sự mắc bệnh) thì ở trường hợp “gợi ý sản phẩm tiềm năng” này, việc precision cao lại quan trọng hơn (chúng ta hạn chế việc gợi ý sản phẩm vô bổ đến khách hàng).
Nếu không có recall, chúng ta sẽ không tin tưởng lắm vào kết quả dự đoán “không” cho vấn đề đang xét. Còn nếu không có precision, chúng ta sẽ không tin tưởng vào các kết quả dự đoán “có” cho vấn đề đang xet.
Trong ví dụ về dự đoán việc mắc bệnh, nếu không có recall, chúng ta không thể tin vào các kết quả “Bạn không bị bệnh”. Còn nếu không có precision, chúng ta không tin tưởng vào các kết quả “bạn đang nhiễm bệnh”.
Precision quan trọng khi chúng ta không muốn có nhiều trường hợp FP quá (không muốn quá nhiều “dự đoán có” của chúng ta sai so với thực thế). Ví dụ như khi phân loại email spam (Câu hỏi: Email nhận được có là spam hay không?). Khi ấy, FP được hiểu là “Một email bình thường bị đánh dấu là spam“. Nếu precision thấp, hay FP cao, có rất nhiều email quan trọng sẽ bị xóa. Còn nếu recall thấp, hay FN cao, chúng ta sẽ nhận nhiều email spam nhưng cái này không quá nguy hiểm bằng việc nhiều email quan trọng bị xóa.
Recall quan trọng khi chúng ta không muốn có nhiều trường hợp FN (không muốn có quá nhiều “dự đoán không” bị sai so với thực tế). Ví dụ như trường hợp dự đoán bệnh ta nói suốt bài này. Một ví dụ khác là dự đoán tình trạng gian lận trong ngành ngân hàng (Câu hỏi: Giao dịch này có khả nghi hay không?). Khi ấy FN là “Một giao dịch được xem là không khả nghi nhưng thực tế lại khả nghi“. Hệ quả có thể rất nghiêm trọng cho ngành ngân hàng! Nếu precision thấp, hay FP cao, có thể chúng ta sẽ cảnh báo sai cho ngân hàng và khiến họ tốn thêm thời gian để kiểm tra hơn nhưng suy cho cùng họ không tổn thất về mặt tài sản. Còn ngược lại, nếu FN cao, ảnh hưởng sẽ vô cùng lớn về mặt tài sản!
Giả sử bạn muốn kiểm tra mô hình và thuật toán của mình coi có tốt chưa bằng cách áp dụng nó vào dữ liệu được khảo sát từ toàn những người không nhiễm bệnh! (không có ai bị bệnh cả).
Nếu mô hình của bạn “lười biếng”, không phân tích gì mà chỉ đưa ra duy nhất một kết quả là “khỏe mạnh” cho mọi trường hợp. Khi áp dụng vào dữ liệu ở trên, bạn sẽ được 100% kết quả là không nhiễm bệnh. Há chẳng phải bạn sẽ tự hào nói với mọi người rằng “À há, mô hình của tui dự đoán đúng 100% luôn này!” (vì rõ ràng trong cuộc khảo sát, chả có ai bệnh cả). Mô hình của bạn có đáng tin chưa?
Làm sao mà đáng tin được! Rủi bạn áp dụng mô hình này vào một bộ dữ liệu khác trong đó chỉ có 5% số người là khỏe mạnh trong thực tế. Sau khi chạy thuật toán, mô hình của bạn nói là 100% người đều khỏe mạnh. Thật tai hại vì 95% người bị nhiễm sẽ nghĩ rằng họ đang khỏe mạnh và không điều trị gì cả!
Nhờ vào CM, chúng ta có thể có cái nhìn tổng quan về tính hiệu quả mà mô hình chúng ta đem lại. Chúng ta sẽ biết được giá trị cụ thể của Precision và Recall để từ đó có những điều chỉnh và đánh giá phù hợp hơn.