Micro, macro và weighted F1
Micro, macro và weighted F1
Cùng một mô hình, cùng một tập kiểm thử, ba con số F1 chênh nhau gần hai mươi điểm. Không con số nào sai cả. Chọn báo cáo con số nào mới là chỗ có hậu quả.
Khi một mô hình phân loại chỉ có hai lớp, F1 là một con số duy nhất và không ai phải hỏi thêm gì. Với ba lớp trở lên thì mỗi lớp có một F1 riêng, và muốn gói tất cả vào một con số để in lên bảng kết quả thì phải chọn cách gộp. Có ba cách phổ biến, chúng cho ba con số khác nhau, và bài báo nào cũng chỉ in ra một trong ba.
Ba cách đó khác nhau ở chỗ ai được bỏ phiếu. micro dồn TP, FP, FN của mọi lớp vào một rổ rồi mới chia, nên mỗi mẫu một phiếu. macro chấm điểm từng lớp rồi lấy trung bình cộng, nên mỗi lớp một phiếu, lớp 50 mẫu nặng ngang lớp 400 mẫu. weighted cũng chấm từng lớp nhưng nhân với số mẫu thật của lớp trước khi cộng, nên nó nằm đâu đó ở giữa.
| Lớp | support | TP | FP | FN | precision | recall | F1 |
|---|---|---|---|---|---|---|---|
| tích cực | 400 | 370 | 60 | 30 | 0.860 | 0.925 | 0.892 |
| tiêu cực | 300 | 265 | 48 | 35 | 0.847 | 0.883 | 0.865 |
| trung tính | 250 | 205 | 50 | 45 | 0.804 | 0.820 | 0.812 |
| mỉa mai | 50 | 2 | 0 | 48 | 1.000 | 0.040 | 0.077 |
| cộng lại | 1000 | 842 | 158 | 158 | số mẫu bị xếp sai = 1000 trừ 842 = 158 | ||
accuracy = 842 / 1000 = 84.200%micro F1 = 2×842 / (2×842 + 158 + 158) = 84.200%Vì mỗi mẫu bị xếp sai vừa là một FP của lớp bị đoán nhầm vừa là một FN của lớp thật, nên ΣFP = ΣFN = 158, micro precision bằng micro recall bằng 84.200%, và F1 của hai số bằng nhau thì cũng chính là số đó.2×ΣTP / (2×ΣTP + ΣFP + ΣFN)2×842 / (2×842 + 158 + 158) = 0.842(F1 của từng lớp cộng lại) / số lớp được tính(0.892 + 0.865 + 0.812 + 0.077) / 4 = 0.661Σ (support của lớp × F1 của lớp) / Σ support(400×0.892 + 300×0.865 + 250×0.812 + 50×0.077) / 1000 = 0.823Hãy làm bốn việc trong sim, theo thứ tự.
Một: nhìn trạng thái mặc định trước khi bấm gì cả. Đây là 1000 bình luận chia bốn lớp cảm xúc, trong đó mỉa mai chỉ có 50 mẫu. Mô hình đoán đúng 842 mẫu, nên accuracy là 84.2%. micro F1 cũng 84.2%. weighted F1 82.3%, vẫn còn đẹp. Nhưng macro F1 chỉ 66.1%, thấp hơn micro đúng 18.1 điểm phần trăm. Nhìn xuống bảng từng lớp là thấy ngay thủ phạm: lớp mỉa mai có precision 1.000 nhưng recall chỉ 0.040, F1 còn 0.077. Mô hình chỉ dám đoán mỉa mai đúng hai lần trong cả nghìn bình luận, cả hai lần đều trúng, và bỏ sót 48 mẫu còn lại.
Đây là tình huống rất hay gặp và cũng rất dễ báo cáo theo kiểu có lợi cho mình. Nếu bạn viết "mô hình đạt F1 84.2%" thì không ai bắt bẻ được, con số đó có thật. Nhưng người đọc sẽ hiểu rằng mô hình làm tốt cả bốn lớp, trong khi thực tế nó gần như không nhận ra lớp mà bạn quan tâm nhất. Với các bài toán mà lớp hiếm chính là lớp đáng giá, chẳng hạn phát hiện lừa đảo hay chẩn đoán bệnh, macro F1 mới là con số nói thật.
Hai: kiểm ca vàng ngay trên màn hình. Khung màu xanh ghi micro F1 = accuracy, và đó không phải khẩu hiệu. Với phân loại đơn nhãn đa lớp, mỗi mẫu bị xếp sai vừa là một FP của lớp bị đoán nhầm, vừa là một FN của lớp thật. Vì thế tổng FP luôn bằng tổng FN, ở đây cùng bằng 158, đúng bằng số mẫu bị xếp sai. Khi hai tổng đó bằng nhau thì micro precision bằng micro recall bằng 842/1000, mà F1 của hai số bằng nhau thì chính là số đó. Hệ quả: micro F1 không mang thêm một chút thông tin nào so với accuracy. Báo cáo cả hai chỉ làm bảng kết quả dài ra chứ không nói thêm được gì.
Hãy tự phá thử: bấm vào vài ô bất kỳ ngoài đường chéo, lăn chuột trên ô khác, đổi preset. Hai con số trong khung vẫn dính chặt vào nhau, và nhãn ✓ khớp tới 1e-12 vẫn sáng. Cần nói rõ phạm vi: điều này chỉ đúng cho bài toán đơn nhãn, tức mỗi mẫu thuộc đúng một lớp, và đó là toàn bộ những gì sim này mô phỏng. Với bài toán đa nhãn, một mẫu có thể mang nhiều nhãn cùng lúc, tổng FP không còn buộc phải bằng tổng FN, và micro F1 tách khỏi accuracy. Sim không dựng được trường hợp đó, nên đừng suy rộng từ những gì bạn thấy ở đây.
Ba: bấm Ba lớp cân bằng, rồi quay lại Mất cân bằng nặng. Ở preset cân bằng, ba lớp đều 100 mẫu và đều được đoán ngang ngửa nhau, nên cả ba con số cùng ra 79.3%, lệch nhau chưa tới một phần mười điểm. Đó là lý do nhiều người tưởng ba độ đo này thay thế được cho nhau: trên dữ liệu cân bằng thì đúng là gần như vậy. Chênh lệch chỉ nổ ra khi có lớp lớn được đoán tốt đứng cạnh lớp bé bị đoán tệ. Nói cách khác, khoảng cách giữa micro và macro là một phép đo mức bất công giữa các lớp, chứ không phải nhiễu.
Muốn thấy chiều ngược lại, hãy quay về preset mặc định rồi bấm khoảng vài chục lần vào ô đường chéo của hàng mỉa mai. Nói cho chính xác thì bạn đang thêm vào tập kiểm thử vài chục bình luận mỉa mai mà mô hình nhận đúng, chứ không phải sửa những mẫu đang bị đoán sai. Dù vậy hiệu ứng cần xem vẫn hiện rõ: sau 20 lần bấm, macro F1 vọt từ 66.1% lên 76.2%, còn micro F1 chỉ nhích từ 84.2% lên 84.5%, vì vài chục mẫu chẳng là gì trong một nghìn.
Bốn: bấm Có lớp rỗng hoàn toàn, rồi gạt ô chọn Lớp không chấm được qua lại. Preset này có ba lớp nhưng lớp cảm thán không có mẫu thật nào và cũng không bao giờ được đoán. Với lớp đó, precision là 0/0 và recall cũng là 0/0, cả hai đều không xác định, nên bảng in dấu ? chứ không in số. Vậy trung bình cộng phải chia cho mấy?
- Chọn
tính F1 của lớp đó là 0: chia cho cả3lớp, macro F1 ra58.0%. - Chọn
bỏ lớp đó khỏi trung bình: chia cho2lớp, macro F1 ra87.0%.
Chênh nhau 29 điểm phần trăm, trên đúng cùng một ma trận. Cả hai đều là quy ước hợp lý, và các thư viện chọn khác nhau, nên hai người chấm cùng một mô hình có thể ra hai con số rất lệch mà không ai tính sai cả. Khi báo cáo, phải nói rõ mình dùng quy ước nào cho lớp không chấm được, giống như phải nói rõ dùng macro hay micro.
Vài điều nên nhớ đúng:
- Lớp có mẫu thật nhưng không bao giờ được đoán thì khác hẳn. Bấm
Lớp không bao giờ được đoán: lớplừa đảocó 15 mẫu thật, precision là0/0nên không xác định, nhưng F1 của nó bằng0chứ không phải không xác định. Lý do là F1 còn viết được thành2·TP / (2·TP + FP + FN), mà mẫu số ở đây bằng 15 chứ không bằng 0. Đổi quy ước không cứu được lớp này, macro vẫn là58.4%. Chỉ khi một lớp vắng mặt ở cả phía nhãn thật lẫn phía dự đoán thì mới thật sự không có gì để chấm. - weighted F1 luôn nằm giữa F1 thấp nhất và F1 cao nhất. Nó là trung bình có trọng số của chính các F1 đó, nên không thể vượt ra ngoài. Điều này cũng có nghĩa nó không bao giờ tố cáo lớp hiếm mạnh như macro, vì lớp hiếm được ít phiếu.
- Ma trận toàn số 0 là một quy ước, không phải một sự thật. Bấm
Xoá hết về 0: không còn mẫu nào, mọi mẫu số đều bằng 0. Sim này chọn hiển thị0cho cả bốn con số tổng hợp để không cóNaNlọt ra màn hình, và có ghi rõ đó là quy ước. Một thư viện khác hoàn toàn có quyền báo lỗi hoặc trả về giá trị không xác định. - Ngay trong họ macro cũng có hai biến thể. Dòng cuối sim so hai cách: lấy trung bình các F1 (
0.661ở trạng thái mặc định) và lấy F1 của trung bình precision với trung bình recall (0.758). Chênh gần mười điểm, chỉ vì trung bình của các phân số không bằng phân số của các trung bình. Đa số thư viện hiện nay dùng cách thứ nhất, nhưng khi đọc số của người khác thì vẫn nên kiểm.
Hỏi "F1 của mô hình là bao nhiêu" trên bài toán nhiều lớp là hỏi chưa đủ. Phải hỏi thêm: gộp kiểu gì, và lớp không chấm được thì xử lý ra sao. micro F1 chính là accuracy nên nó không nói thêm điều gì mới. macro F1 cho lớp hiếm quyền bỏ phiếu ngang lớp lớn, nên nó là con số duy nhất trong ba con số chịu la lên khi mô hình bỏ rơi lớp hiếm. weighted F1 nằm giữa và nghe dễ chịu, đó vừa là ưu điểm vừa là cái bẫy của nó.
- 1Với phân loại đơn nhãn đa lớp, vì sao micro F1 luôn bằng đúng accuracy?
- 2Một tập có 400 mẫu lớp lớn được đoán rất tốt và 50 mẫu lớp hiếm gần như không bao giờ được nhận ra. Con số nào tụt xuống rõ nhất?
- 3Một lớp không có mẫu thật nào và cũng không bao giờ được mô hình đoán tới. Điều gì xảy ra với macro F1?