Lại là câu chuyện về confusion matrix. Đúng như cái tên của nó, chúng ta vẫn chưa thôi hết sự confusion khi nhắc về.
Lại là câu chuyện về confusion matrix. Đúng như cái tên của nó, chúng ta vẫn chưa thôi hết sự confusion khi nhắc về. Tuy nhiên đây lại là một góc kiến thức cơ bản khi bạn đang mần học máy (machine learning), mài giũa model của bạn để nó đoán chính xác hơn (thứ mà bạn muốn nó đoán). Okela.
Hôm nay tôi sẽ cùng bạn khám phá nóa. Và chúng ta sẽ đi xa hơn 1 tí về confusion matrix, chính là các khái niệm mà tôi đoán là bạn không ít lần search đi search lại ở nhiều trang trên medium để ngấm: accuracy, precision, recall, specificity, rồi thì F1-score, AUC, ROC curve. Bạn hiểu hết chúng chưa? Nếu chưa thì gét gô to the straight line nà.

1. Confusion matrix

Chà spiderum không tự set 1 cái mục lục được nhỉ. Nếu vẫn sẽ tiện hơn để bạn nào rõ phần này rồi có thể skip. Vì phần này cũng gọi là quen thuộc ròi, tôi sẽ lấy 1 ví dụ. Bạn biết trò ma sói khum? Tốt, nhưng ở đây chỉ có dân làng, bạn- một nhà khoa học tài boa và sói. Bạn đã xây xong một cái model classification chỉ ra được con người nào là sói đội lốt để cứu lấy dân làng vì dân bạn bị sói ăn thịt gần hết rồi. Giờ bạn cần đánh giá nóa, bằng một mùi chỉ số tôi chém phía trên. Nếu model của bạn tốt, sói sẽ bị loại bỏ (ừ tức là bắn chết nóa) và người dân của bạn có thể sống bình yên mãi về sau (hoặc không) :)
Chúng ta có một ma trận thật sự confusing như sau:
(Actual) Sói(Actual) Người(Predict) SóiTrue PositiveFalse Positive(Predict) NgườiFalse NegativeTrue Negative
Cho “Positive” ở đây là “Thằng này là sói” và “Negative” là “Thằng này không phải sói đâu”, thì:
– True positive: Mô hình đoán đúng con này là sói (giờ mình nói “bạn” đại diện cho “mô hình” nhé)
– True negative: Bạn đoán đúng con này không phải sói, nó là người for riêu
– False positive : Nó là người mà bạn đoán nó là sói. Bạn đã giết nhầm ngừi.
– False negative: Nó là sói mà bạn phán nó là người. Bạn bỏ qua 1 con sóii.
Ở đây mình note thêm, tùy bài toán bạn muốn giải quyết mà cân nhắc tầm quan trọng của FN và FP, bạn cần ưu tiên cái gì hơn cho model của bạn. Giờ bạn chọn đi, giết nhầm còn hơn bỏ sót (ưu tiên false negative hơn) hay là tôi chọn con đường nhân đạo (ưu tiên false positive hơn). Khó xử chưa. Đây chính là sự consfuse trong confusion matrix, và bạn cần phải giảm thiếu tối đa các false, tăng đối đa các true. Bằng cách lào? Dựa trên ma trận, chúng ta có một vài criteria để xét đến như sau

2. Accuracy

Tức là Tỉ lệ bạn đoán đúng (người & sói) / tổng số dân trong làng.
Trong thực tế thì nhiều problem solvers thường chỉ xem xét tỉ lệ này để đánh giá mô hình của họ là tốt hay không. Chỉ cần nó đạt khoảng 80% là chúng ta đã mừng hết lớn rồi, phải vậy khong? . Tuy nhiên accuracy một mình nó chưa quyết định được cuộc chơi. Quay lại cái condition mà tôi dành cho bạn trả lời lúc đầu bài toán: FN và FP. Giả sử outcome là như vày
Giả sử dân làng có 100 người, thì accuracy bạn đang có là tới 90%. Tuy nhiên bạn đang đoán là không có ai là sói, và kết cục là bạn đã ko xác định được con sói nào. Mô hình của bạn có như không :)
Thế nên khi có high accuracy, đừng vội mừng, data của bạn có thể không cân bằng như vầy. Cần tiếp tục xem xem bạn đã phân loại đúng chưa

3. Precision

Precision: Tỉ lệ bạn bắt trúng case positive / tổng số case được đoán là positive
Bây giờ ở viễn cảnh của bạn, bạn bắt được 1 nhóm người mà bạn cho rằng họ là sói. Precision là tỉ lệ sói bạn đoán đúng trên tổng số người mà bạn nghĩ là sói. Chúng ta có hiểu nôm na là độ chính xác khi bắt.

4. Recall/Sensitivity

Toi thì hay dùng sensitivity (độ nhạy) hơn vì recall hơi đa nghĩa, dễ confused khi cố gắng nhớ những khái niệm như vầy.
Sensitivity: tỉ lệ case positive / actual positive. Ở tình huống này, sensitivity là tỉ lệ sói bạn đoán đúng trên tổng số con sói thực tế có trong làng (false negative – nếu bạn đoán những case này là người thì bạn sai rồi).
Như vậy từ sensitivity đã “lột tả” được cái concept này. Tức là độ nhạy của mô hình với tổng thể population. Khi lượng người mà bạn bắt đi giết (vì bạn nghi chúng nó là sói) càng lớn, sensitivity sẽ càng cao. Và nếu bạn bắt cả làng đi giết luôn, chúc mừng, mô hình bạn đạt độ nhạy tối đa. Và cũng là lúc chỉ còn mình bạn ở giữa ngôi làng.
Tất nhiên bạn không muốn thế :). Lúc này bạn sẽ muốn mô hình của mình vừa nhạy, vừa chính xác. Tức là vừa không đoán nhầm sói, vừa không được đoán nhầm người (FN & FP = 0). Chúng ta cần một metric có thể cover đủ cả 2 điều kiện trên

5. F1 – Score

Sao không lấy trung bình cộng của Precision và Recall nhỉ? Nếu bạn có tìm hiểu về các khái niệm về trung bình trong phân phối dữ liệu, bạn sẽ biết Average là một metric nguy hiểm khi, với 2 biến này, một trong 2 biến cao ngất ngưởng, làm trung bình cộng 2 giá trị của bạn cao, bạn cũng sẽ hài lòng với mô hình của mình. Nhưng toi khá chắc là chúng ta đều nhận biết được điều này nên sẽ nhanh chóng bác bỏ câu hỏi phía trên.
Với công thức F1 này, mô hình sẽ chỉ đạt 1 khi cả 2 chỉ số bằng 1, và chỉ cao khi cả 2 chỉ số cùng cao. Tức nó sẽ phạt nặng hơn (bị skewed về giá trị nhỏ hơn) các trường hợp 1 chỉ số trong 2 bị thấp. Một biểu diễn của F1-Score là đường cong PR (PR curve).
Như ta đã biết, khi độ phủ population càng cao (sensitivity càng cao) thì độ chính xác càng thấp (precision càng thấp). Giả sử model chọn cách vợt càng nhiều người (mà nó nghĩ là sói), thì số sói mà nó đoán đúng trong số người chọn ra càng cao >> sensitivity càng cao, tuy nhiên trong cái population đó lại cũng có rất nhiều con người, hệ quả là precision sẽ giảm, và ngược lại. Việc plot ra sự tương quan giữa Sensitivity và Precision sẽ giúp chúng ta biết được với mức precision nào sensitivity sẽ bắt đầu rớt mạnh, tự đó chọn được một ngưỡng (threshold) thích hợp để phân loại chính xác hơn đối tượng.
Quan sát sự tương quan giữa 2 metrics này cũng giúp bạn đối phó với những loại population mà tỉ lệ positive, negative không cân bằng, và bạn thì muốn phân biệt chính xác những case positive. Thực tế dữ liệu thì hiếm có trường hợp nào số case positive và negative bằng nhau. Thậm chí ma sói của chúng ta cũng chỉ là số ít trong dân làng. Còn nếu trong population của bạn, tỉ lệ positive và negative cases khá cân bằng, có thêm một criteria để đánh giá mô hình của chúng ta

6. AUC – ROC Curve

Nếu như sensitivity quan sát trên các con sói, thì với quan sát trên số người thực tế còn lại chúng ta có False positive rate.
FPR: Tỉ lệ bạn đoán nhầm người là sói (False Positive)/ Tổng số người thực tế có. Lý tưởng thì chỉ số này càng về 0 càng tốt.
ROC là một đường cong xác suất thể hiện tương quan giữa True Positive rate và False Positive rate . AUC đại diện cho mức độ hoặc thước đo khả năng phân loại positive và neggative cases. AUC càng về 1, mô hình phân loại càng tốt, vì lúc đó TPR càng về 1, và FPR càng về 0. Nếu bạn quan tâm đến việc phân loại chính xác cả 2 case, AUC ROC sẽ là một trong những thước đo tốt. Tuy nhiên chúng ta cần cẩn trọng khi population mà bạn quan sát có số lượng 2 case không cân bằng. Lúc đó ROC của bạn cao có thể là do có quá nhiều case negative, nó sẽ làm skew tổng thể ROC.

7. Final words & credit source:

Chúng ta đã qua hết các chỉ số cơ bản liên quan tới việc đánh giá model classification. Chúng ta hiểu về các khái niệm, nhưng dùng chúng như thế nào, nên dùng gì, sau cùng, chỉ có người trong cuộc là bạn mới có thể đánh giá được hợp lý.
Trân trọng cảm ơn các nhà tài trợ kiến thức. Chúc bạn luôn vui trên chặng đường học hỏi của mình nhé.