Hiểu confusion matrix

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.

Confusion matrix (CM) là gì?

Để 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?):

Thực tế (có)Thực tế (không)
Dự đoán (có)90 (True Positive)0 (False Positive)
Dự đoán (không)910 (False Negative)5 (True Negative)

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 chut, 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.

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).

cm ex - Hiểu confusion matrix
Câu hỏi: Người này có đang mang thai không?
Giải thích hình ví dụ vui ở trên
  • True Postive: Rõ ràng trong hình là một phụ nữ có thai vá bác sĩ nói cho cô ấy biết là cô ấy đang có thai. Điều này chứng tỏ dự đoán của bác sĩ là chính xác so với thực tế. Nói cách khác: dự đoán “có” của bác sĩ (Positive) là “đúng” (True).
  • False Negative: Bác sĩ dự đoán chị kia không có thai nhưng thực tế lại có. Đây là một ví dụ của Sai lầm loại II. Nói cách khác: dự đoán “không” của bác sĩ (Negative) là “sai” (False).
  • False Positive: Đàn ông không thể có thai được trong khi bác sĩ lại bảo anh ta có. Đây là Sai lầm loại I. Nói cách khác: dự đoán “có” của bác sĩ (Positive) là “sai” (False).
  • True Negative: Bác sĩ bảo anh kia không có thai, điều này hiển nhiên đúng. Nói cách khác: dự đoán “không” của bác sĩ (False) là “đúng” (True).

Cách nhớ confusion matrix

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.

Precision / Recall

Với CM, chúng ta sẽ tính được hai đại lượng quan trọng là PrecisionRecall.

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ế?

$$
\begin{align}
\mathrm {precision} = \dfrac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FP}} = \dfrac{90}{90+0} = 100\%.
\end{align}
$$

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?

$$
\begin{align}
\mathrm {recall} = \dfrac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FN}} = \dfrac{90}{90+910} = 9\%.
\end{align}
$$

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 9% 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.

Thực tế (có) Thực tế (không)
Dự đoán (có)900Precision = 100%
Dự đoán (không)9105
Recall = 9%

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?

Precision cao / Recall thấp

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!

Precision thấp / Recall cao

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?).

Thực tế (có)Thực tế (không)
Dự đoán (có)90910Precision = 9%
Dự đoán (không)105
Recall = 90%

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!

Tại sao cả Precision và Recall đều quan trọng?

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!

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”.

Khi nào thì một trong hai precision và recall quan trọng hơn cái còn lại?

Thực tế (có)Thực tế (không)
Dự đoán (có)TPFPPrecision
Dự đoán (không)FNTN
Recall

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!

Tại sao Confusion Matrix lại quan trọng?

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.

Tới lượt bạn động não

Giả sử chúng ta có một hệ thống phân loại email (hình dưới). Hệ thống của chúng ta sẽ thiết lập một ngưỡng nhất định (classification threshold). Những email nằmg bên phải ngưỡng này sẽ bị đánh dấu là spam, còn những email bằm bên trái thì đánh dấu là “không spam”.

PrecisionVsRecallBase - Hiểu confusion matrix
Câu hỏi: Email này có phải là spam không?

Theo bạn, giá trị của precision và recall trong trường hợp này là bao nhiêu? Nếu chúng ta tăng giá trị ngưỡng ban đầu (classification threshold dịch về bên phải) thì giá trị của recall sẽ tăng, giảm hay không thay đổi?

Hãy suy nghĩ thật kỹ và kiểm tra xem câu trả lời của mình có đúng chưa so với các đáp án ở đây. Bạn cũng có thể thử trả lời vài câu hỏi khác cũng khá hay tại đây.

F1-Score

Chúng ta thấy rằng cả precision và recall đều quan trọng. Có lúc thì cái này quan trọng hơn cái kia. Vậy trong thực tế, ta sẽ lấy cái nào làm cái chính? Ta phải điều chỉnh sao cho cả hai cái này thật sự hợp lý? Thật khó trả lời cho các câu hỏi này! Đó là lý do vì sao f1-score ra đời!

Với f1-score, chúng ta chỉ cần quan tâm đến một chỉ số duy nhất (thay vì hai – precision và recall). F1-score được tính thông qua precision và recall bởi công thức sau đây:

$$
F_{1} = \left({\frac {\mathrm {recall} ^{-1}+\mathrm {precision} ^{-1}}{2}}\right)^{-1}=2\times {\frac {\mathrm {precision} \cdot \mathrm {recall} }{\mathrm {precision} +\mathrm {recall} }}.
$$

Nhắc lại,

Thực tế (có)Thực tế (không)
Dự đoán (có)TPFPPrecision
Dự đoán (không)FNTN
Recall

và,

$$
\begin{align}
\mathrm {precision} = \dfrac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FP}}, \quad
\mathrm {recall} = \dfrac{\mathrm{TP}}{\mathrm{TP} + \mathrm{FN}}
\end{align}
$$

Thêm nữa, khi chúng ta thay đổi định nghĩa của “positive” (hay thay đổi câu hỏi của vấn đề) thì giá trị của f1-score cũng sẽ thay đổi theo. Lý do là bởi TP trong công thức của precision và recall sẽ chuyển thành TN. Điều đó có nghĩa là bạn phải rất thận trọng trong việc chọn định nghĩa cho “positive” (hay chọn câu hỏi đặt vấn đề). Một khi bạn đã định nghĩa “positive”, f1-score sẽ phụ thuộc vào định nghĩa này.

Ví dụ cho việc ta thay đổi cách đặt câu hỏi?

Ví dụ, thay vì hỏi “Bệnh nhân có bị ung thư không?“, khi ấy TP chính là “Dự đoán có của chúng ta thật sự mắc ung thư“. Tuy nhiên khi thay đổi câu hỏi thành “Bệnh nhân có khỏe không?“, khi ấy “Dự đoán có của chúng ta thật sự mắc ung thư” lại chính là “Dự đoán không khỏe của chúng ta thật sự đang mắc bệnh.“, hay TN.

Bảng đầu tiên với câu hỏi “Bệnh nhân có bị ung thư không?

Thực tế (có)Thực tế (không)
Dự đoán (có)900Precision = 100%
Dự đoán (không)9105
Recall = 9%

Nhưng bảng sẽ thay đổi với câu hỏi “Bệnh nhân có khỏe mạnh không?

Thực tế (có)Thực tế (không)
Dự đoán (có)5910Precision = 0.55%
Dự đoán (không)090
Recall = 100%

Ở đây, rõ ràng cái ta chọn cho “positive” nên là “có bệnh” (thay vì “đang khỏe“). Ta cần tìm ra được những người mắc bệnh để mà trị thay vì tìm ra những người khỏe mạnh. Tuy nhiên không phải trường hợp nào cũng dễ dàng thấy mà đặt câu hỏi như vậy. Math2IT sẽ có bài viết riêng về vấn đề này!

F1-score hữu dụng khi nào?

  • Khi bạn cần một sự cân bằng giữa precision và recall.
  • Khi dữ liệu khảo sát của bạn không đồng đều giữa nhãn “có” và “không” (Chẳng hạn như số người khảo sát có bệnh chiếm tỷ trọng khá lớn so với số người được khảo sát không có bệnh hoặc ngược lại).
  • Nếu một trong hai giá trị recall và precision được cải thiện nhưng ảnh hưởng lớn đến sự thay đổi của cái còn lại thì f1 khi ấy sẽ rất nhỏ.

Chọn giá trị cho f1-score?

Dễ nhận thấy, giá trị của f1-score rơi vào khoảng $(0,1]$. Thông thường, f1-score nhận giá trị càng cao, độ phân lớp và mô hình của chúng ta càng tốt!

  • Trường hợp tốt nhất: cả precision và recall đều được 100%, $f1=1$. Khi ấy mọi dự đoán “có” và “không” của chúng ta đều chính xác so với thực tế (ta là thần).
  • Trường hợp một trong hai precision và recall nhận giá trị rất bé gần 0, f1 cũng sẽ rất bé gần 0. Khi ấy mô hình của chúng ta chắc chắn có vấn đề!

Ngoài ra còn có một vài ví dụ khác cho f1-score như bảng dưới (trích từ course ML của Andrew NG)

PrecisionRecallF1-score
Mô hình 10.50.40.444
Mô hình 20.70.10.175
Mô hình 30.0210.0392

Theo như bảng trên, dù Mô hình 2 có precision khá cao (0.7) nhưng f1-score vẫn khá thấp nếu đem so với Mô hình 1 (với precision và recall chỉ ở mức trung bình là 0.5 và 0.4). Trường hợp Mô hình 3 là chúng ta cho mô hình luôn luôn dự đoán “có bệnh”, khi ấy f1-score cực kỳ thấp!

Vậy khi chúng ta quan tâm một trong hai recall và precision hơn thì sao? Khi ấy ta cần xét đến công thức tổng quát hơn của f1-score như bên dưới (gọi là $F_{\beta}$) (nguồn):

$$
F_{\beta} = ( 1 + \beta^2)\frac{\text{precision}\cdot\text{recall}}{\beta^2\cdot\text{precision} + \text{recall}}
$$

Dễ nhận thấy, f1-score chỉ là trường hợp đặc biệt khi $\beta=1$.

  • Nếu chúng ta coi trọng precision hơn recall, ta chọn $\beta<1$ (thường chọn $\beta=0.5)$.
  • Ngược lại, nếu recall được coi trọng hơn precision, ta chọn $\beta>1$ (thường chọn $\beta=2$).

Accuracy và Specificity

Thật ra, ngoài f1-score, còn có rất nhiều cách và chỉ số khác bạn có thể dùng để đánh giá xem mô hình của bạn có thật sự tốt chưa. Dưới góc nhìn của các thành phần CM, ta còn có các chỉ số accuracyspecificity.

Accuracy: Trong tất cả các dự đoán của chúng ta, tỷ lệ dự đoán đúng là bao nhiêu? Nếu dữ liệu của chúng ta cân đối (lượng người được khảo sát có và không có bệnh gần ngang nhau), ta có thể chỉ cần dùng chỉ số accuracy này thôi là đủ để đánh giá mô hình của chúng ta.

$$
\mathrm{accuracy} = \dfrac{TP + TN}{TP + TN + FP + FN}
$$

Specificity: Có bao nhiêu “kết quả không” đến từ dự đoán của chúng ta? Chúng ta chọn specificity khi chúng ta quan tâm đến giá trị của TN và không muốn cảnh báo sai về những trường hợp FP. Ví dụ, khi chạy một phần mềm kiểm tra những người bán ma túy (Câu hỏi: Trường hợp này có bán không?) Nếu câu trả lời là “có” thì ta phải bắt giam họ ngay. Khi ấy FP là “Những người tốt bị hiểu lầm là đang bán ma trúy”. Chúng ta muốn specificity cao, hay FP càng thấp càng tốt, vì ta không muốn bắt giam người vô tội!

$$
\mathrm{specificity} = \dfrac{TN}{FP + TN}
$$

Tài liệu tham khảo

  1. Classification: Precision and Recall – Google DevelopersMachine Learning Crash Course.
  2. Classification: Check Your Understanding (Accuracy, Precision, Recall) – Google DevelopersMachine Learning Crash Course.
  3. F-measure versus Accuracy – NLP blog.
  4. Accuracy, Precision, Recall or F1? – Koo Ping ShungTowards Data Science.
  5. Dealing with Imbalanced data: undersampling, oversampling and proper cross-validation – Marco Altini.
  6. Accuracy, Recall, Precision, F-Score & Specificity, which to optimize on? – Salma GhoneimTowards Data Science.


Hình đại diện lấy từ trang towardsdatascience.com.