Ma trận nhầm lẫn và các độ đo
Ma trận nhầm lẫn và các độ đo
Một cái ngưỡng chia mọi ca thành đoán dương hay đoán âm. Kéo nó, rồi kéo cả tỉ lệ hai lớp, và xem bốn ô số cùng bốn độ đo đổi theo.
Mô hình phân loại hai lớp không trả về nhãn. Nó trả về một điểm số cho mỗi ca, và bạn chọn ngưỡng: điểm từ ngưỡng trở lên thì gọi là dương. Chọn ngưỡng là một quyết định riêng, không phải phần mô hình học ra, và mọi con số trong bài này đều đổi theo quyết định đó.
Khi đã có ngưỡng thì mỗi ca rơi vào đúng một trong bốn ô: đoán dương và đúng, đoán dương mà sai, đoán âm và đúng, đoán âm mà sai. Bốn ô đó là toàn bộ dữ liệu thô. Bốn độ đo quen tên chỉ là bốn cách chia bốn con số đó cho nhau, và mỗi cách bỏ đi một thứ khác nhau.
Ở trạng thái mở bài, sim đang nói gì
Dữ liệu mở bài có 10 ca thật sự dương và 10 ca thật sự âm, tổng 20 ca, ngưỡng 0.50. Bốn ô đọc TP = 8, FP = 3, FN = 2, TN = 7.
Bốn độ đo tương ứng: accuracy 75%, precision 73%, recall 80%, F1 76%. Số chưa làm tròn lần lượt là 0.75, 0.7272727272727273 tức 8 chia 11, 0.8 tức 8 chia 10, và 0.761904761904762 tức 16 chia 21.
Ba con số nữa ở hàng đọc kết quả và dưới bảng. Tỉ lệ dương thật hiện 50.0%, giữ một chữ số thập phân có chủ ý: 1 ca dương giữa 90 ca âm là 1.1% chứ không phải 1%, và nếu làm tròn về số nguyên thì hai bộ dữ liệu khác nhau sẽ đọc giống nhau. Mô hình đang gọi dương 55% số ca, tức 11 trong 20. Và ô đoán âm mọi ca hiện 50%: đó là accuracy của một quy tắc không làm gì cả, chỉ trả lời âm cho mọi ca. Ở trạng thái mở bài mô hình hơn quy tắc rỗng đó 25 điểm phần trăm. Mục sau cho thấy khoảng cách đó biến mất dễ tới mức nào.
Cuối cùng, FP cộng FN bằng 5, tức 25% số ca bị phân loại sai. Accuracy chỉ nhìn đúng con số 5 đó và không quan tâm nó gồm mấy báo động giả với mấy ca bỏ sót. Đây là điểm khởi đầu của mục tiếp theo.
Bốn ô, và vì sao hai loại sai không đổi nhau được
Hai ô trên đường chéo là đoán đúng. Hai ô còn lại là hai loại sai khác nhau về bản chất, không phải hai lần cùng một loại:
FPlà báo động giả: một ca thật sự âm bị gọi là dương. Trong sàng lọc bệnh, đó là một người khoẻ bị gọi đi làm thêm xét nghiệm.FNlà bỏ sót: một ca thật sự dương bị gọi là âm. Trong sàng lọc bệnh, đó là một người có bệnh được cho về nhà.
Hai chuyện đó không đổi chỗ cho nhau được, vì cái giá của chúng do bài toán quy định chứ không do phép tính quy định. Nhưng phép tính thì không biết điều đó, và có thể đo được nó không biết tới mức nào.
Lấy trạng thái mở bài rồi đổi FP = 3, FN = 2 thành FP = 2, FN = 3, giữ TP và TN nguyên. Accuracy không nhích một bit: vẫn đúng 0.75. Điều này hiển nhiên, vì accuracy cộng hai loại sai lại thành một số.
Chỗ ít hiển nhiên hơn: F1 cũng không nhích một bit, vẫn đúng 0.761904761904762. Lý do là F1 rút gọn được thành 2 lần TP chia cho 2 lần TP cộng FP cộng FN, và biểu thức đó đối xứng với FP và FN y như accuracy. Cổng kiểm giữ TP = 8, TN = 7 và tổng hai loại sai bằng 5, rồi quét cả sáu cách chia 5 đó: sáu cấu hình cho ra một giá trị accuracy duy nhất, một giá trị F1 duy nhất, và sáu giá trị precision khác nhau.
Nên câu đúng là: chỉ có cặp precision và recall, để riêng chứ không gộp, mới phân biệt được báo động giả với bỏ sót. Trong ví dụ đổi chỗ ở trên, precision đi từ 0.7272727272727273 lên 0.8 trong khi recall đi từ 0.8 xuống 0.7272727272727273. Hai số đổi ngược chiều nhau, và đó chính là thông tin mà accuracy với F1 đã làm mất.
Còn một điều nữa về hai loại sai này: trên dữ liệu của sim, không có ngưỡng nào xoá được cả hai. Kéo ngưỡng xuống 0.34 hoặc thấp hơn thì FN về 0, và có 35 trong 101 vị trí của thanh kéo làm được thế. Kéo lên 0.73 hoặc cao hơn thì FP về 0, và có 28 vị trí làm được thế. Nhưng số vị trí làm được cả hai là 0. Nguyên nhân là hai nhóm điểm số chồng lấn nhau: ca âm có điểm cao nhất là 0.72, cao hơn hai ca dương thấp nhất. Một bộ dữ liệu không chồng lấn sẽ có ngưỡng hoàn hảo, và khi đó cả bài này không còn gì để dạy.
Độ chính xác tổng thể lừa người khi lớp lệch nhau
Đây là chỗ đắt nhất của bài, và nó cần con số chứ không cần lời cảnh báo.
Bấm preset Lệch 1 / 99, ngưỡng 1.00. Bây giờ dữ liệu có 1 ca dương thật và 99 ca âm thật, tổng 100 ca, tỉ lệ dương thật đọc 1.0%. Ngưỡng ở 1.00 nên không ca nào đạt ngưỡng, tức mô hình trả lời âm cho mọi ca. Bốn ô: TP = 0, FP = 0, FN = 1, TN = 99.
Accuracy đọc 99%, và đúng 0.99 chứ không phải làm tròn lên. Một mô hình không bắt được ca nào, không có một mẩu tri thức nào, đạt 99%.
Cùng lúc đó, recall đọc 0%: nó bắt được 0 trong 1 ca dương. Precision đọc — vì mẫu số của nó rỗng, không có ca nào được đoán dương. F1 cũng —. Ô đoán âm mọi ca đọc đúng 99%, giống accuracy, nên chính màn hình đang nói ra rằng con số 99% kia không chứa một chút công sức nào của mô hình.
Chuyện này không phải một cấu hình dựng riêng để làm ví dụ. Cổng kiểm quét toàn bộ 10000 tỉ lệ lớp mà hai thanh kéo với tới và chứng minh accuracy ở ngưỡng 1.00 luôn đúng bằng accuracy của quy tắc đoán âm mọi ca, không sai một bit ở bất kỳ tỉ lệ nào. Nói cách khác, con số cao đó là một tính chất của bộ dữ liệu, không phải của mô hình.
Rồi đến phép so sánh đáng nhớ nhất. Với 9801 tỉ lệ lớp có cả hai lớp, cổng kiểm đặt ngưỡng ở 0.50 rồi so accuracy của mô hình với accuracy của quy tắc rỗng: mô hình thắng ở 8064 tỉ lệ, hoà ở 123, và thua ở 1614. Tức khoảng một tỉ lệ lớp trong sáu, một câu kiểu "mô hình đạt độ chính xác cao" còn tệ hơn không làm gì.
Hệ quả thực dụng: chọn ngưỡng theo accuracy là sai khi lớp lệch nhau, và điều đó đo được ngay trên bộ 1 / 99. Quét cả 101 vị trí thanh kéo:
- accuracy lớn nhất là
0.99, đạt ở28vị trí, vị trí đầu tiên là0.73. Ở cả28vị trí đó precision và F1 đều không xác định, vì chúng đều là những ngưỡng không gọi dương ca nào. - F1 lớn nhất là
1chia3, đạt ở đúng một vị trí duy nhất, là0.68. Ở đó mô hình bắt được1trong1ca dương, còn accuracy chỉ0.96, tức thấp hơn quy tắc rỗng3điểm phần trăm.
Nhích thêm một bậc, tới 0.69, thì accuracy vẫn đọc 96% nhưng F1 tụt về 0%. Và cái 0% đó là số không thật chứ không phải không xác định: mô hình đã gọi 3 ca là dương và cả 3 đều sai, TP về 0. Một màn hình chỉ hiện accuracy sẽ không cho bạn thấy chút nào sự khác nhau giữa 0.68 và 0.69.
Precision và recall đánh đổi nhau theo ngưỡng
Kéo ngưỡng và hai con số này đi ngược chiều nhau. Trên dữ liệu mở bài 10 / 10:
| ngưỡng | TP | FP | FN | TN | accuracy | precision | recall | F1 |
|---|---|---|---|---|---|---|---|---|
0.00 | 10 | 10 | 0 | 0 | 50% | 50% | 100% | 67% |
0.34 | 10 | 5 | 0 | 5 | 75% | 67% | 100% | 80% |
0.50 | 8 | 3 | 2 | 7 | 75% | 73% | 80% | 76% |
0.70 | 5 | 1 | 5 | 9 | 70% | 83% | 50% | 63% |
0.90 | 1 | 0 | 9 | 10 | 55% | 100% | 10% | 18% |
1.00 | 0 | 0 | 10 | 10 | 50% | — | 0% | — |
Đọc bảng theo hai chiều thì thấy đánh đổi: ngưỡng lên cao, precision đi từ 50% tới 100% còn recall đi từ 100% xuống 0%.
Nhưng bảng sáu dòng này quá thô và nó che một chuyện đúng hơn.
Recall thì thật sự đơn điệu: nâng ngưỡng chỉ có thể bỏ bớt ca được gọi dương, mà mẫu số của recall là số ca dương thật nên không đổi, vậy recall không bao giờ tăng. Cổng kiểm quét 12221 bước trên nhiều tỉ lệ lớp và không có bước nào recall đi lên.
Precision thì không đơn điệu, và đây là chỗ bản trước của bài này nói sai. Trên 101 vị trí thanh kéo của dữ liệu mở bài, precision có giá trị ở 96 vị trí, và trong 95 bước liền kề nó tăng 10 lần, giảm 6 lần, và không đổi 79 lần. Lần giảm mạnh nhất: ngưỡng đi từ 0.71 lên 0.72 và precision tụt từ 0.8333333333333334 xuống 0.8.
Lý do đếm được. Ở 0.71 thì TP = 5 và FP = 1, tức 5 trên 6. Ngưỡng lên 0.72 thì ca dương có điểm đúng bằng 0.71 rơi xuống dưới ngưỡng, TP còn 4, còn ca âm có điểm 0.72 vẫn đứng đúng trên ngưỡng nên FP vẫn là 1. Thành 4 trên 5, và phân số xấu đi. Mỗi lần ngưỡng vượt qua một ca dương mà không loại thêm ca âm nào thì precision tụt, và điều đó xảy ra thật.
Còn một chuyện về chính cái thanh kéo, đáng nói vì nó dạy cách đọc mọi sim khác. Thanh ngưỡng có 101 vị trí, nhưng dữ liệu chỉ có 20 ca, nên toàn bộ 101 vị trí đó chỉ sinh ra 21 trạng thái khác nhau. Từ 0.50 mà nhích một bậc lên 0.51 thì không con số nào đổi, vì giữa hai vị trí đó không có ca nào để vượt qua. Vị trí đầu tiên phía trên 0.50 làm đổi số là 0.53, phía dưới là 0.46. Nhãn ngưỡng thì đổi ở cả 101 bậc, nên nếu bạn kết luận "thanh kéo có tác dụng" chỉ vì thấy chữ trên nhãn đổi thì bạn đang đo cái nhãn, không đo phép tính.
F1 trong bảng đạt cao nhất ở 0.34, không ở hai đầu. Quét cả thanh kéo thì F1 lớn nhất là 0.8, đạt ở ba vị trí 0.32, 0.33 và 0.34.
F1 là trung bình điều hoà, không phải trung bình cộng
F1 là trung bình điều hoà của precision và recall. Khác biệt so với trung bình cộng không phải chuyện tinh tế, nó là chuyện một bậc độ lớn, và preset thứ ba trong sim dựng đúng ca đó.
Bấm F1 so với trung bình cộng: 50 ca dương, 50 ca âm, ngưỡng 0.95. Chỉ ca dương điểm cao nhất đạt ngưỡng và không ca âm nào tới gần, nên TP = 1, FP = 0, FN = 49. Precision đúng bằng 1, tức 100%: mọi ca được gọi dương đều đúng. Recall đúng bằng 0.02, tức 2%: bắt được 1 trong 50.
Trung bình cộng của 1 và 0.02 là 0.51, một con số nghe như đạt trung bình. F1 là 2 chia 51, tức 0.0392156862745098, hiện trên màn hình là 4% và nếu lấy một chữ số thập phân thì là 3.9%. Chênh nhau hơn 13 lần.
Trung bình điều hoà hành xử như vậy vì nó bị con số nhỏ hơn kéo xuống. Muốn F1 cao thì cả hai phải cao, còn trung bình cộng thì cho phép bù trừ: kéo precision lên trần là đủ để nó nói dễ nghe, kể cả khi mô hình bỏ sót gần hết. Đó là lý do F1 được chọn làm một con số tóm tắt, và cũng là lý do nó không thay được cho việc nhìn cả cặp.
Có một mốc đáng nhớ: F1 luôn nằm giữa precision và recall, và bằng đúng chúng khi hai cái bằng nhau. Cổng kiểm quét 10299 lần đọc có F1 xác định. Trong đó 9468 lần precision khác recall, và cả 9468 lần F1 nằm hẳn ở giữa hai số, không lần nào ra ngoài. Còn 831 lần precision bằng recall, và ở 781 lần F1 bằng đúng chúng tới từng bit.
Vậy còn 50 lần kia thì sao. Đó là chỗ số thực 64 bit lệch nửa đơn vị cuối, và đáng nói ra thay vì giấu. Với TP = 8, FP = 2, TN = 8, FN = 2 thì precision và recall đều đúng 0.8, còn F1 tính theo công thức trung bình điều hoà cho 0.8000000000000002. Viết theo dạng rút gọn 2 lần TP chia cho 2 lần TP cộng FP cộng FN thì lại ra đúng 0.8. Hai dạng cùng một đại lượng, khác một phép làm tròn. Nên một phép kiểm đòi F1 bằng precision tuyệt đối ở chỗ đó sẽ báo lỗi oan cho một cài đặt hoàn toàn đúng, và cổng kiểm của bài này ghi ngưỡng kèm số đo thay vì ghi dấu bằng.
Ba chỗ độ đo không xác định, và sim làm gì ở đó
Ba trong bốn độ đo có mẫu số có thể rỗng, và cả ba trạng thái đó đều kéo tới được bằng thanh kéo. Đây là hành vi đo được của engine, không phải quy ước tôi chọn cho êm:
- Không ca nào được đoán dương, tức
TPcộngFPbằng0: precision trả vềNaN, không phải0. Màn hình hiện—. Kéo ngưỡng lên1.00là tới. - Không có ca dương thật nào, tức thanh dương thật về
0: recall trả vềNaN, hiện—. - Không có ca nào cả, hai thanh cùng về
0: cả bốn độ đoNaN, và tỉ lệ dương thật cũng—, vì0trên0không phải0phần trăm. Bảng bốn ô vẫn hiện bốn số0, vì đếm được0ca là một con số thật. - F1
NaNkhi một trong hai đầu vào của nó không xác định.
Phân biệt cho rõ một chỗ dễ lẫn: F1 bằng 0 thật khác với F1 không xác định. Khi mô hình gọi 4 ca là dương mà không ca nào đúng, precision là số không thật, recall cũng vậy, và F1 bằng 0. Đó là một kết quả tệ có ý nghĩa. Còn — nghĩa là câu hỏi không có nghĩa, chưa nói gì tới tệ hay tốt.
Trả 0 cho một mẫu số rỗng là cách làm phổ biến trong nhiều thư viện, và nó gộp hai chuyện khác nhau đó lại thành một con số. Sim này chọn không gộp, và vì đây là một quy ước chứ không phải chân lý nên nó được nói thẳng ra ở đây.
Một chi tiết nhỏ về hiển thị. Trên sim này, một ô đọc 100% thì giá trị thật đúng bằng 1, và đọc 0% thì đúng bằng 0. Điều đó không phải may: muốn làm tròn che được một khoảng hở thì mẫu số phải vượt 200, mà bộ dữ liệu lớn nhất kéo tới được chỉ có 198 ca. Trên một bộ dữ liệu lớn hơn thì 100% sẽ lại là kết quả của phép làm tròn, đúng như tỉ lệ dương thật đã phải hiện một chữ số thập phân.
Chọn ngưỡng theo giá của từng loại sai
Mặc định 0.50 không phải một lựa chọn trung tính. Nó là lựa chọn coi một báo động giả đắt bằng đúng một ca bỏ sót, và bài toán của bạn hầu như không bao giờ như vậy.
Giả sử một ca bỏ sót đắt gấp 10 lần một báo động giả. Ở ngưỡng 0.50 sim đọc FP = 3 và FN = 2, nên tổng giá là 23. Kéo ngưỡng về 0.34 thì FP = 5 và FN = 0, tổng giá còn 5. Hai ngưỡng đó có accuracy bằng nhau, đúng 0.75 cả hai, trong khi giá phải trả chênh nhau đúng 4.6 lần. Accuracy không thể phân biệt hai trạng thái đó, còn bảng bốn ô thì phân biệt được ngay.
Quét cả thanh kéo với tỉ lệ giá 10 trên 1 đó, giá thấp nhất là 5, đạt ở ba vị trí 0.32, 0.33 và 0.34. Đảo tỉ lệ lại, cho báo động giả đắt gấp 10 lần bỏ sót, thì ngưỡng rẻ nhất nhảy sang phía bên kia, từ 0.73 trở lên.
Và đây là chỗ khép lại: cho hai loại sai cùng giá thì tập ngưỡng rẻ nhất đúng bằng tập ngưỡng có accuracy cao nhất, gồm 26 trong 101 vị trí, tất cả cùng đạt 0.75. Nói cách khác accuracy chính là bảng giá cân bằng, và với 26 vị trí đồng hạng thì câu "chọn ngưỡng có accuracy cao nhất" còn chưa phải một chỉ dẫn xác định. Con số duy nhất biến nó thành xác định là giá của từng loại sai, và con số đó đến từ việc bạn đang làm chứ không đến từ dữ liệu.
Những con số trong bài được kiểm bằng gì
Mọi con số bạn vừa đọc đều bị một cổng kiểm khoá lại, hiện là 354 khẳng định, và cổng không tin phép tính của chính engine.
Bốn ô đếm được dựng lại bằng hai đường độc lập: một đường lọc danh sách ca với điều kiện viết ngược lại thành "không nhỏ hơn ngưỡng" và không dùng tới hàm phân ô của engine, một đường đếm bằng chia đôi khoảng dựa trên tính chất điểm số giảm dần, mà tính chất đó được khẳng định trước chứ không giả định. Bốn độ đo được tính lại theo dạng bù: accuracy là 1 trừ tỉ lệ sai, precision là 1 chia cho 1 cộng FP trên TP. Riêng F1 có thêm đường thứ ba là dạng rút gọn không hề tính precision hay recall, và trên 10299 lần đọc thì 6996 lần hai đường trùng nhau tới từng bit, phần còn lại lệch dưới 1e-15.
Phép kiểm mạnh nhất lại là phép rẻ nhất: nhân con số trên màn hình với mẫu số nguyên của nó rồi đòi ra đúng tử số nguyên. Nó xác nhận "số này là tỉ lệ của đúng hai con số đếm kia" mà không chia lại lần nữa, nên nó không thể thừa hưởng một phép chia sai. Cổng chạy phép này trên 48884 lần đọc.
Bất biến tổng được quét trên toàn bộ lưới: 30000 cấu hình, và ở mọi cấu hình thì bốn ô cộng lại đúng bằng số ca, TP cộng FN đúng bằng số ca dương thật, FP cộng TN đúng bằng số ca âm thật. Cặp sau là cặp bắt được lỗi đổi chỗ FP với FN, thứ mà accuracy mù trước theo đúng định nghĩa.
Cổng còn tự kiểm chính nó: mỗi lần một chỗ trong engine bị sửa có chủ ý thì cổng phải báo đỏ, và phải xanh lại khi hoàn nguyên. Một phép kiểm không bao giờ đỏ được thì nó không chứng minh điều gì. Chính phép thử đó đã bắt được một lỗ hổng thật trong cổng: bản đầu của cổng tự viết một hàm sinh điểm số theo thứ tự nhân khác với engine, nên khi đổi engine sang đúng thứ tự đó thì hai bên đồng ý với nhau và cổng vẫn xanh, dù hai thứ tự cho ra 509 giá trị điểm số khác nhau. Cách vá là thêm một đường tính chính xác bằng phân số nguyên lớn, không có một phép dấu phẩy động nào.
Cuối cùng, những gì bài này không chỉ ra. Điểm số trong sim là một bộ số minh hoạ, không phải đầu ra của một mô hình nào và không phải số liệu đo được, nên không câu nào ở đây nói được rằng một mô hình thật sẽ cho hình dạng như vậy. Không có huấn luyện, nên không câu nào nói được ngưỡng nào là đúng cho việc của bạn. Và cổng không kiểm được chuyện hiệu chỉnh, tức chuyện một điểm số cao có thật sự tương ứng với khả năng cao hay không.
Bốn ô TP, FP, FN, TN là dữ liệu thô, còn bốn độ đo là bốn cách gộp chúng và mỗi cách bỏ đi một thứ. Accuracy gộp hai loại sai thành một số, nên nó không đổi khi đổi chỗ FP với FN, và F1 cũng vậy: chỉ cặp precision với recall để riêng mới phân biệt được báo động giả với bỏ sót. Khi lớp lệch thì accuracy vô nghĩa: với tỉ lệ dương thật 1.0%, một mô hình đoán âm cho mọi ca đạt 99% mà recall 0%, và trên 9801 tỉ lệ lớp thì ngưỡng 0.50 còn thua quy tắc rỗng ở 1614 tỉ lệ. Kéo ngưỡng thì recall chỉ có thể giảm, còn precision không đơn điệu: nó tụt 6 lần trong 95 bước, mạnh nhất là từ 0.8333333333333334 xuống 0.8 khi ngưỡng đi từ 0.71 lên 0.72. F1 là trung bình điều hoà nên bị số nhỏ kéo xuống: precision 1 với recall 0.02 cho F1 0.0392156862745098 chứ không phải 0.51. Và ngưỡng đúng đến từ giá của từng loại sai: với tỉ lệ 10 trên 1, ngưỡng 0.34 và ngưỡng 0.50 có cùng accuracy 0.75 nhưng giá là 5 so với 23.
- 1Một bộ dữ liệu có tỉ lệ dương thật 1.0%, tức 1 ca dương trong 100 ca. Bạn kéo ngưỡng lên 1.00 nên mô hình trả lời âm cho mọi ca. Bảng đọc gì?
- 2Bạn đổi FP = 3, FN = 2 thành FP = 2, FN = 3 và giữ nguyên TP với TN. Bốn độ đo đổi thế nào?
- 3Kéo ngưỡng từ 0.71 lên 0.72 trên dữ liệu mở bài. Precision đi lên hay đi xuống?