Chuyển tới nội dung chính

Đường ROC và AUC

Quét mọi ngưỡngAUC bằng đếm cặpĐổi thang, số không đổiĐo ca hoà điểm

Đường ROC và AUC

Bài trước chọn một ngưỡng. Bài này không chọn ngưỡng nào cả: nó quét hết, rồi hỏi cái gì còn lại khi ngưỡng đã bị quét sạch.

Bài trước dừng ở một ngưỡng và đọc bốn ô. Nhưng ngưỡng là quyết định của bạn, không phải của mô hình, nên một câu hỏi khác nảy ra: nếu bỏ hẳn việc chọn ngưỡng thì còn lại gì thuộc về riêng mô hình.

Câu trả lời là thứ tự. Mô hình xếp các ca theo điểm số, và cái thứ tự đó không phụ thuộc ngưỡng. Đường ROC là cách vẽ toàn bộ thứ tự đó thành một hình, và AUC là cách nén nó thành một số. Kéo thanh ngưỡng trong sim và để ý: điểm đậm chạy, còn đường cong không nhích.

Đường ROC và AUC · quét mọi ngưỡng cùng lúc
ngưỡng = 0.50FPR = 0.30TPR = 0.80precision = 0.73dương thật = 50.0%AUC = 0.88đếm cặp = 0.88 · hoà 0 cặp21 đỉnh trên đường
000.250.250.50.50.750.7511FPR (tỉ lệ báo động giả)TPR (tỉ lệ bắt đúng)00.250.50.751điểm số · vàng = lớp dương, đỏ = lớp âm (mỗi dấu đỏ là 1 ca)

Ở trạng thái mở bài, sim đang nói gì

Dữ liệu có 10 ca thật sự dương và 10 ca thật sự âm, tổng 20 ca, và cả 20 điểm số đều khác nhau đôi một. Ngưỡng mở bài là 0.50.

Bốn ô đọc TP = 8, FP = 3, FN = 2, TN = 7. Hai trục của đường ROC lấy từ đó: FPR là 3 chia 10, đúng 0.30, và TPR là 8 chia 10, đúng 0.80. Điểm đậm đang đứng ở (0.30, 0.80).

Con số quan trọng nhất của bài là AUC, đọc 0.88. Nó không đổi khi bạn kéo ngưỡng, vì nó là tính chất của cả đường.

Hai con số nữa cần để dành cho mục về lớp lệch: precision đọc 0.73, chưa làm tròn là 0.7272727272727273 tức 8 chia 11, và tỉ lệ dương thật đọc 50.0%.

Cuối cùng, hai con số về chính cái hình. Đường có 21 đỉnh, và badge trong sim ghi rõ. Thanh ngưỡng thì có 101 vị trí. Hai con số đó không bằng nhau, và mục sau nói vì sao.

Đường ROC là quỹ tích của mọi ngưỡng

Mỗi đỉnh trên đường là một ngưỡng, tức một ma trận nhầm lẫn đầy đủ. Không phải một điểm trang trí, mà đúng bốn con số của bài trước, chỉ được vẽ lại thành một cặp toạ độ.

Số đỉnh đếm được: 20 điểm số phân biệt sinh ra 21 đỉnh. Thừa một cái, vì muốn có đỉnh gốc (0, 0) thì phải lấy một ngưỡng cao hơn mọi điểm số, ở đây là 0.96, tức 0.01 trên điểm cao nhất 0.95. Đỉnh cuối lấy ngưỡng bằng điểm thấp nhất 0.08, khi mọi ca đều bị gọi là dương, và nó rơi vào (1, 1).

Giữa hai đầu, hạ ngưỡng qua một điểm số thì đúng một ca đổi phe. Ca đó là âm thì đường đi ngang một bước, là dương thì đường đi lên một bước. Trên dữ liệu mở bài, 20 đoạn nối 21 đỉnh gồm đúng 10 đoạn ngang, 10 đoạn lên, và 0 đoạn chéo. Đó là một cầu thang, không phải một đường cong trơn: chữ "cong" chỉ là cách gọi.

Bây giờ tới chỗ dễ nhầm nhất. Thanh ngưỡng có 101 vị trí nhưng dữ liệu chỉ có 21 trạng thái, nên 80 trong 100 bước của thanh kéo không làm đổi con số nào. Cổng kiểm đếm: đúng 20 bước làm điểm đậm dịch chỗ, và cả 20 bước đó đều là bước vừa vượt qua một điểm số có thật trong dữ liệu. Nhãn ngưỡng thì đổi ở cả 101 bậc. Nếu bạn kết luận "thanh kéo có tác dụng" vì thấy nhãn đổi thì bạn đang đo cái nhãn.

Một chi tiết về luật so sánh, vì nó quyết định một ô số. Có một ca âm mang điểm đúng bằng 0.50. Luật là "từ ngưỡng trở lên thì gọi là dương", nên ở ngưỡng 0.50 ca đó vẫn bị tính là báo động giảFP = 3. Nhích lên 0.51 thì nó rơi ra, FP = 2, và FPR về 0.20. Cổng kiểm khẳng định cả hai phía của cái mốc đó, và còn khẳng định ở đúng một số thực liền kề phía trên 0.50 chứ không chỉ ở bậc 0.01.

AUC thật ra là một xác suất, và đếm cặp là ra

"Diện tích dưới đường cong" là cách gọi theo hình. Nhưng nghĩa thật của AUC không cần hình nào:

AUC là xác suất một ca dương lấy ngẫu nhiên được chấm điểm cao hơn một ca âm lấy ngẫu nhiên.

Và vì thế nó đếm được, không cần tích phân. Với 10 ca dương và 10 ca âm thì có 100 cặp. Đếm từng ca âm, xem có bao nhiêu ca dương vượt nó:

ca âm0.720.60.50.420.380.30.250.180.120.08
số ca dương cao hơn578991010101010

Cộng lại được 88 cặp thắng, 0 cặp hoà, trên 100 cặp. Vậy AUC bằng 88 chia 100, đúng 0.88, và đó chính là con số badge đang hiện. Bạn vừa tính AUC bằng bút chì.

Sim hiện cả hai cách tính cạnh nhau, badge đếm cặp ngay bên phải badge AUC, và ở trạng thái mở bài hai badge đọc y nhau. Cổng kiểm không dừng ở chỗ "y nhau trên màn hình": nó dựng lại phân số đúng 176/200 bằng số nguyên lớn, không có một phép dấu phẩy động nào, rồi đòi con số của engine là số thực gần nhất với phân số đó. Phải nói theo kiểu đó, vì 0.88 không biểu diễn được chính xác bằng số thực 64 bit, nên đòi "lệch bằng 0" sẽ báo lỗi oan cho một cài đặt hoàn toàn đúng. Bản đầu của cổng kiểm đòi đúng như thế và đã sai.

Vì sao hai cách gặp nhau: mỗi đoạn ngang của cầu thang rộng đúng một ca âm và cao đúng bằng tỉ lệ ca dương đã nằm trên nó, nên diện tích cột đó chính là số cặp thắng do ca âm ấy góp vào. Hình thang chỉ là phép đếm cặp viết bằng diện tích.

Đổi thang điểm: đường không nhích một bit

Đây là bất biến mạnh nhất của bài, và bạn tự làm được: đổi ô thang điểm sang một hàm tăng ngặt.

Bốn lựa chọn đều là hàm tăng ngặt trên đoạn [0, 1] và đều giữ nguyên hai đầu 0 với 1, nên chúng chỉ xáo lại khoảng cách giữa các điểm số chứ không đổi thứ tự của một ca nào. Kết quả:

  • badge AUC vẫn đọc 0.88 ở cả bốn thang, và giá trị đằng sau chuỗi đó giống nhau tới từng bit.
  • đường vẽ ra giống nhau tới từng byte của chuỗi path trong SVG. Không phải trông giống, mà là cùng một chuỗi.
  • nhưng điểm đậm nhảy chỗ. Ở ngưỡng 0.50: thang gốc cho (0.30, 0.80), thang x3 cho (0.00, 0.40), thang căn cho (0.70, 1.00), thang hàm mũ cho (0.10, 0.60).

Cổng kiểm quét 1600 cấu hình, gồm mọi tổ hợp của bốn thang, 100 mức tỉ lệ lớp và bốn mức làm thô: AUC lệch ở 0 cấu hình, đường vẽ lệch ở 0 cấu hình, còn điểm làm việc thì dịch ở 1200 cấu hình và giữ nguyên ở đúng 400, tức chỉ những cấu hình dùng thang gốc. Con số 1200 đó quan trọng: nếu nó bằng 0 thì bốn thang chỉ là bốn cái tên của một hàm và cả mục này rỗng.

Bài học thực dụng: một mô hình hiệu chỉnh tệ vẫn có thể có AUC cao. AUC không hề đo chuyện một điểm số cao có thật sự tương ứng với khả năng cao hay không. Nó chỉ đo thứ tự, và thang điểm chính là phần bị nó bỏ đi.

Hai đầu đường, đường chéo, và chỗ AUC không có nghĩa

Hai đầu đường luôn là (0, 0)(1, 1), và lý do là định nghĩa chứ không phải may mắn. Ngưỡng cao hơn mọi điểm số thì không ca nào được gọi dương, nên TPFP đều 0, nên cả hai tỉ lệ đều 0. Ngưỡng thấp hơn mọi điểm số thì mọi ca được gọi dương, nên TP bằng số ca dương và FP bằng số ca âm, nên cả hai tỉ lệ đều 1. Cổng kiểm xác nhận điều này trên cả 1584 cấu hình có đủ hai lớp.

Đường chéo nét đứt là mô hình đoán bừa: TPR luôn bằng FPR, bắt thêm đúng bấy nhiêu thì báo động giả thêm bấy nhiêu, diện tích đúng 0.5.

Có một ca nhỏ đáng nhớ hơn cả lời giải thích. Lấy đúng hai ca, một dương một âm, cùng điểm số. Đường ROC của nó đúng bằng hai đỉnh (0, 0)(1, 1), tức chính đường chéo, và AUC bằng 0.5 theo cả hai cách tính. Một cặp không phân biệt được thì mô hình đúng bằng đồng xu, và cả hình lẫn phép đếm nói cùng một câu.

Còn một trạng thái sim kéo tới được mà AUC không có nghĩa: kéo thanh số bản của ca âm về 0. Lúc đó không còn ca âm nào, tỉ lệ dương thật đọc 100.0%, và cả hai badge AUC đọc chứ không đọc 0.00. Đó là một lựa chọn có chủ ý: hình thang trần trên cái đường đó cho ra 0, một con số nhìn như kết quả, trong khi thật ra không có cặp nào tồn tại để hỏi. Bài trước đã nói về chỗ mẫu số rỗng; ở đây mẫu số rỗng là số cặp, và nghĩa là câu hỏi chưa có nghĩa.

AUC không thấy tỉ lệ lớp

Bấm preset Lệch 10 / 990, hoặc kéo thanh số bản của mỗi ca âm lên 99.

Bây giờ mỗi ca âm được nhân thành 99 bản, tổng 1000 ca gồm 10 dương và 990 âm, tỉ lệ dương thật đọc 1.0%. Điểm số không đổi, thứ tự không đổi, chỉ số lượng đổi. Và:

  • AUC vẫn 0.88, bit y nguyên so với lúc cân bằng.
  • đường vẽ ra byte y nguyên, chuỗi path trong SVG không đổi một ký tự.
  • điểm đậm vẫn đứng đúng chỗ cũ, (0.30, 0.80).

Ba câu trên có nghĩa là: hình không đổi gì cả. Nhưng đằng sau nó, TP vẫn là 8 trong khi FP đã từ 3 lên 297, nên precision từ 8 chia 11 tụt xuống 8 chia 305, tức từ 0.7272727272727273 xuống 0.02622950819672131. Trên màn hình là từ 0.73 xuống 0.03. Tỉ số giữa hai giá trị đúng bằng 305 chia 11, tức 27.727272727272727 lần.

Kéo thanh đó chậm lại thì thấy đủ dải: ở 9 bản, tỉ lệ dương thật 10.0%, precision là 8 chia 35, đọc 0.23, mà AUC vẫn 0.88. Cổng kiểm quét cả 99 mức tỉ lệ có ca âm: AUC nhận đúng một giá trị, còn precision nhận 99 giá trị khác nhau và giảm đơn điệu không trừ bước nào.

Nên câu đúng là: AUC không phải một độ đo tồi, nó chỉ không chứa thông tin về tỉ lệ lớp theo đúng thiết kế. Hai mẫu số của nó là số ca dương thật và số ca âm thật, tách riêng, nên nhân số ca âm lên bao nhiêu cũng triệt tiêu. Precision thì có FP ở mẫu số cùng với TP, nên nó cảm nhận tỉ lệ lớp ngay. Nghe "AUC 0.88" mà tưởng "gọi dương thì phần lớn đúng" là chỗ hỏng, và ở 1.0% dương thật thì 297 trong 305 ca bị gọi dương là sai.

Ca hoà điểm, và chỗ hai cách tính có thể lệch nhau

Dữ liệu mở bài có 20 điểm số khác nhau đôi một, nên chưa có ca hoà nào. Ô làm thô điểm số sinh ra hoà: nó làm tròn mọi điểm số về một lưới, và hai ca khác lớp có thể rơi vào cùng một mức.

làm thôsố mức điểmsố đỉnhcặp thắngcặp hoàđoạn chéoAUC
không202188000.88
bội số 0.1101187640.90
bội số 0.267781430.85
bội số 0.2556741830.83

Ba điều đọc được từ bảng này.

Hoà sinh ra đoạn chéo. Khi một ca dương và một ca âm cùng điểm, hạ ngưỡng qua mức đó thì cả hai đổi phe cùng lúc, nên đường đi vừa ngang vừa lên trong một bước. Cổng kiểm khẳng định điều này theo cả hai chiều trên 1584 cấu hình: có đoạn chéo khi và chỉ khi có cặp hoà khác lớp, không một phản ví dụ.

Làm thô không nhất thiết làm AUC giảm. Lưới 0.1 nâng AUC từ 0.88 lên 0.90, và lý do đếm được từng cặp. Trong 100 cặp, lúc chưa làm thô có 88 cặp thắng, 0 cặp hoà và 12 cặp thua. Sau khi làm thô còn 87 cặp thắng, 6 cặp hoà và 7 cặp thua: sáu cặp hoà mới gồm 1 cặp từng thắng và 5 cặp từng thua. Mất nửa điểm ở một cặp mà được nửa điểm ở năm cặp, nên 87 cộng 3 được 90, hơn 88.

Chỗ này tôi đã viết sai một lần, rằng "một cặp thắng biến thành hai cặp hoà", và cái sai đó chỉ lộ ra khi tôi bắt buộc phải trỏ mỗi con số của bài về một khẳng định cụ thể trong cổng kiểm. Bây giờ cổng khoá cả ba con số 12, 76, và khoá luôn chuyện ba loại cặp cộng lại đúng 100 ở mọi lưới.

Chỗ chết người là quy ước tính hoà. Hình thang và đếm cặp chỉ khớp nếu cả hai xử lý hoà giống nhau, và cách duy nhất làm chúng khớp là cặp hoà tính nửa cặp thắng. Sim này làm đúng thế, và bằng chứng nhỏ nhất là ca hai ca cùng điểm ở mục trên: đường chéo có diện tích 0.5, và 0 cặp thắng cộng nửa của 1 cặp hoà cũng cho 0.5.

Quan trọng: đây là quy ước, không phải chân lý. Một thư viện tính hoà thành thắng, hoặc bỏ hẳn cặp hoà, sẽ cho con số khác trên đúng bộ dữ liệu này, và cả hai đều tự nhận là AUC.

Còn một chỗ nữa. Trên lưới 0.25, hai cách tính in ra khác nhau: đếm cặp cho phân số đúng 166/200, tức 0.83, còn hình thang cho 0.8300000000000001. Cổng kiểm quét 1600 cấu hình và đếm: hai đường trùng nhau tới từng bit ở 1188 cấu hình, lệch ở 396, và 396 cấu hình lệch đó đúng bằng toàn bộ nhóm lưới 0.25, không thừa không thiếu. Khe lệch nhỏ hơn một đơn vị cuối của số thực, và so với phân số đúng thì chính hình thang là bên lệch, còn đếm cặp rơi đúng lên số thực gần nhất. Trên màn hình cả hai vẫn đọc 0.83 vì chỉ hiện hai chữ số thập phân, nên khe lệch này không bao giờ tới mắt người đọc, nhưng một phép kiểm đòi dấu bằng tuyệt đối sẽ báo đỏ oan. Cổng kiểm ghi ngưỡng kèm số đo thay vì ghi dấu bằng.

Một chú thích thật thà về chính phép làm tròn. Cách viết làm tròn(x nhân số mức) chia số mức không hoàn toàn trùng với cách viết làm tròn(x chia bước) nhân bước: hai cách lệch nhau ở 15 trong 60 cặp điểm số và lưới mà sim này với tới, và lệch cả ở AUC tại hai trong bốn lưới. Tệ hơn, không cách nào đúng bằng luật làm tròn nửa lên đúng nghĩa. Cổng kiểm dựng luật đó bằng số nguyên lớn rồi đối chiếu: cách của engine khớp 56 trong 60 ca, cách kia khớp 47. Bốn ca engine lệch đều là ca đúng nửa: 0.950.35 trên lưới 0.1, 0.70.3 trên lưới 0.2. Nguyên nhân đo được: số thực mà máy giữ cho 0.95 nằm hơi dưới 0.95, nên giá trị đúng của phép nhân nằm dưới 9.5, và luật đúng nghĩa phải làm tròn xuống, cho 0.9. Nhưng phép nhân dấu phẩy động làm tròn kết quả lên đúng 9.5, rồi hàm làm tròn đưa nó lên 10, nên engine cho 1. Cổng kiểm khoá đúng cái engine làm và in ra cả bốn ca, chứ không giả vờ rằng lựa chọn này không tồn tại.

Khi nào ROC, khi nào đường precision-recall

Hai trục của ROC là FPR và TPR. Mẫu số của TPR là số ca dương thật, mẫu số của FPR là số ca âm thật, và hai mẫu số đó tách riêng. Đó chính là lý do ROC bất biến với tỉ lệ lớp, và cũng chính là lý do nó không cảnh báo được bạn về precision.

Đường precision-recall thay trục FPR bằng precision, mà precision có FPTP chung một mẫu số. Nó vì thế đổi theo tỉ lệ lớp, và đó là ưu điểm khi tỉ lệ lớp là phần cốt lõi của bài toán.

Cách chọn gọn:

  • muốn so thứ tự của hai mô hình, không phụ thuộc tỉ lệ lớp trong tập kiểm, hoặc hai lớp cân bằng nhau: dùng ROC và AUC.
  • lớp dương rất hiếm và cái bạn quan tâm là "trong số ca tôi báo dương thì bao nhiêu đúng": dùng đường precision-recall. Sim này cho thấy vì sao: ở 1.0% dương thật, AUC 0.88 đứng im trong khi precision là 0.03.
  • và trong cả hai trường hợp, một điểm làm việc cụ thể vẫn phải chọn bằng giá của từng loại sai, đúng như bài trước. Cả đường ROC lẫn AUC đều không chọn ngưỡng cho bạn.

Những con số trong bài được kiểm bằng gì

Mọi con số bạn vừa đọc bị một cổng kiểm khoá lại, hiện là 327 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 một điều kiện viết ngược thành "không nhỏ hơn ngưỡng" và không gọi hàm phân loại của engine. Các đỉnh được dựng lại bằng cách sắp điểm số tăng dần rồi đi ngược, để một phép sắp bị viết lại không thể tự đồng ý với mình. Diện tích được tính lại bằng dạng hình chữ nhật cộng tam giác thay vì dạng trung bình hai chiều cao.

Đường độc lập mạnh nhất là đếm cặp bằng số nguyên lớn: nó cho một phân số hữu tỉ đúng tuyệt đối, không có một phép dấu phẩy động nào, nên nó không thể thừa hưởng sai số nào của engine. Cùng cách đó, luật làm tròn nửa lên cũng được dựng bằng số nguyên lớn để soi phép làm thô.

Cổng còn tự kiểm chính nó. Tôi sửa engine 24 lần có chủ ý, mỗi lần một chỗ, và cả 24 lần cổng phải báo đỏ rồi xanh lại khi hoàn nguyên. Lần chạy đầu có một đột biến vẫn xanh: đổi khoá sắp trong hàm tính diện tích từ FPR sang TPR. Đo ra thì trên cả 1600 cấu hình hai khoá cho đúng cùng một dãy đỉnh, vì một đường ROC luôn không giảm theo cả hai toạ độ, nên đó là đột biến tương đương với mọi trạng thái người đọc kéo tới được. Nhưng hàm tính diện tích được xuất ra ngoài và tài liệu của nó hứa không phụ thuộc thứ tự đầu vào, nên cổng đã thêm một danh sách bốn điểm xáo trộn mà hai khoá cho 0.66 với 0.54, và bây giờ đột biến đó cũng đỏ.

Lần chạy đầu của cổng còn bắt được năm chỗ tôi tự khẳng định sai trước khi đo, trong đó có "ca âm cao nhất vượt hai ca dương" (đo ra là năm ca) và "số thực của engine lệch 0 so với phân số đúng" (0.88 không phải một số thực, nên khe lệch không thể bằng 0).

Cuối cùng, những gì bài này không chỉ ra. 20 điểm số trong sim là bộ số minh hoạ, không phải đầu ra của 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 cho hình dạng như vậy. AUC 0.88 không nói mô hình tốt hay tồi, vì "tốt" cần một bài toán và một bảng giá, mà cả hai đều không nằm trong dữ liệu. Và cổng kiểm canh phép tính, không canh khẳng định về thế giới: nó chứng minh được 0.88 là con số đúng của bộ dữ liệu này, không chứng minh được 0.88 là con số đáng mừng.

Điều rút ra

Đường ROC là quỹ tích của mọi ngưỡng, và mỗi đỉnh trên nó là một ma trận nhầm lẫn: 20 điểm số phân biệt cho 21 đỉnh, ít hơn hẳn 101 vị trí thanh kéo, và 80 trong 100 bước kéo không làm đổi con số nào. AUC không phải "diện tích" mà là xác suất một ca dương được chấm cao hơn một ca âm, nên đếm cặp là ra: 88 cặp thắng trên 100 cặp, đúng 0.88, tính được bằng bút chì. Vì AUC chỉ đọc thứ tự, đổi thang điểm bằng một hàm tăng ngặt thì đường và AUC y nguyên tới từng bit trên cả 1600 cấu hình, trong khi điểm làm việc của ngưỡng 0.50 nhảy từ (0.30, 0.80) sang (0.00, 0.40). Cùng lý do đó, AUC không thấy tỉ lệ lớp: nhân mỗi ca âm thành 99 bản thì AUC vẫn 0.88 và hình không đổi một byte, còn precision sụp từ 0.73 xuống 0.03. Và ca hoà điểm là chỗ phải cẩn thận: hoà làm đường có đoạn chéo, hai cách tính chỉ khớp nếu hoà tính nửa cặp thắng, còn làm thô điểm số thậm chí có thể nâng AUC, đo được 0.88 lên 0.90.

Câu hỏi tự kiểm0/3 đúngchưa trả lời
  1. 1Bạn đổi mọi điểm số của mô hình qua hàm tăng ngặt x mũ 3, tức 0.9 thành 0.729 và 0.5 thành 0.125. Đường ROC và AUC đổi thế nào?
  2. 2Hai bộ dữ liệu dùng cùng một mô hình với cùng thứ tự điểm số, nhưng bộ thứ hai có mỗi ca âm nhân thành 99 bản, tức tỉ lệ dương thật từ 50.0% xuống 1.0%. So AUC và precision ở cùng ngưỡng 0.50.
  3. 3Một ca dương và một ca âm được chấm đúng cùng một điểm số. Cách tính AUC bằng đếm cặp phải làm gì với cặp đó để khớp với diện tích hình thang?