Logistic Regression: xác suất, ngưỡng quyết định và đánh giá
Từ điểm tuyến tính đến xác suất nhị phân; tách việc học xác suất khỏi lựa chọn ngưỡng và kiểm tra calibration.
Tên có chữ regression nhưng Logistic Regression thường dùng để phân loại. Bài viết đi từ một điểm số đến xác suất và quyết định, rồi dùng dữ liệu tự tạo để kiểm tra ảnh hưởng của ngưỡng mà không giả định mô hình đã đáng tin trong thực tế.
Mục tiêu học tập
- Giải thích sigmoid và binary cross-entropy.
- Tính confusion matrix khi thay ngưỡng.
- Phân biệt khả năng xếp hạng, calibration và lợi ích vận hành.
Từ điểm tuyến tính đến xác suất
Giả sử cần gắn cờ một yêu cầu có khả năng cần kiểm tra lại. Thay vì trả ngay có hoặc không, mô hình trả một số từ không đến một. Quy trình sau đó quyết định có chuyển yêu cầu sang người xem xét hay không.
Một điểm lớn hơn biểu thị khả năng dự đoán cao hơn cho lớp được quy ước là một. Ta phải ghi rõ lớp một là gì; đổi ý nghĩa nhãn sẽ đổi cách đọc mọi chỉ số.
Tính , rồi . Với hai lớp, p biểu diễn ước lượng . Nhãn dự đoán được tạo bằng cách so p với một ngưỡng, thường bắt đầu ở 0.5 nhưng có thể cần ngưỡng khác.
Sigmoid không biến một điểm tùy ý thành xác suất đáng tin. Tham số phải được fit đúng và chất lượng xác suất cần kiểm tra trên dữ liệu ngoài mẫu.
Logistic Regression mô hình hóa log-odds tuyến tính: . Tăng một đặc trưng một đơn vị nhân odds với khi giữ các đặc trưng khác cố định; đó không phải mức tăng cố định của xác suất.
Đặc trưng tương tác hoặc biến đổi có thể nới giới hạn ranh giới tuyến tính. Diễn giải hệ số cần xét cách mã hóa, scaling và biến tương quan; không suy ra quan hệ nhân quả từ hệ số.
Học bằng log loss
Nếu nhãn thật là một nhưng mô hình nói xác suất gần không, đó là một dự đoán sai rất tự tin. Log loss phạt kiểu sai này mạnh hơn dự đoán còn do dự.
Học là điều chỉnh trọng số để các xác suất phù hợp hơn với nhãn của tập học. Nhãn sai hoặc nhãn được tạo bằng quy trình không nhất quán vẫn có thể khiến mô hình học sai.
Với một mẫu, loss là . Trung bình loss trên train rồi tối ưu tham số; regularization hạn chế hệ số quá lớn. Chuẩn hóa và xử lý thiếu dữ liệu phải được fit chỉ từ train.
Mã bên dưới minh họa đánh giá các điểm đã có, không huấn luyện một bộ phân loại hoàn chỉnh. Tách hai công việc giúp tập trung vào ngưỡng và tránh hiểu nhầm dữ liệu đồ chơi là kết quả nghiên cứu.
Gradient không regularization theo w là . Tính loss bằng logit với dạng softplus ổn định hơn lấy log trực tiếp của xác suất sát không hoặc một. Khi dữ liệu phân tách hoàn hảo, nghiệm không regularization có thể làm độ lớn trọng số tăng không giới hạn.
Class weighting thay đổi mục tiêu fit. Sau khi reweight hoặc resample, không mặc định xác suất vẫn khớp tần suất lớp ngoài môi trường; cần đánh giá lại trên phân bố triển khai phù hợp.
Ngưỡng quyết định và chi phí sai
Hạ ngưỡng thường gửi nhiều yêu cầu sang kiểm tra hơn: có thể bắt thêm trường hợp cần hỗ trợ nhưng cũng tăng việc xem nhầm trường hợp bình thường. Không có ngưỡng tốt nhất cho mọi dịch vụ.
Mã thử hai ngưỡng trên cùng bộ nhãn. Hãy đếm số lần bắt đúng, bỏ sót và báo nhầm trước khi nói mô hình tốt hơn.
Precision đo phần dự đoán dương thật sự dương; recall đo phần mẫu dương được tìm thấy. Tính TP, FP, FN và TN theo cùng quy ước lớp một. Trường hợp không có dự đoán dương cần quy ước precision rõ ràng.
Chọn ngưỡng trên validation dựa vào ngân sách kiểm tra hoặc chi phí sai; báo kết quả cuối trên test cố định. Accuracy có thể che khuất việc bỏ sót lớp hiếm.
Nếu p đã calibrated và chi phí false positive là , false negative là , với chi phí dự đoán đúng bằng không và không có ràng buộc khác, chọn dương khi .
Công thức này không thay thế kiểm tra chi phí thực tế, giới hạn năng lực xử lý hoặc phân bố thay đổi. Khi có ràng buộc quota, có thể cần chọn theo thứ hạng thay vì một ngưỡng xác suất cố định.
Calibration và giới hạn sử dụng
Trong nhiều trường hợp có điểm khoảng 0.8, ta mong tần suất lớp một gần 80%. Đây là một yêu cầu khác với chỉ xếp đúng trường hợp nào đáng nghi hơn.
Bộ số minh họa quá nhỏ để kết luận về điều đó. Mục tiêu là hiểu phép đếm, rồi biết cần thu dữ liệu kiểm tra gì cho một dự án thật.
Dùng reliability diagram, Brier score hoặc log loss để xem chất lượng xác suất ngoài mẫu. Điểm ranking tốt không tự bảo đảm calibrated. Nếu fit bộ hiệu chỉnh, phải dùng dữ liệu tách khỏi dữ liệu fit mô hình hoặc một protocol cross-validation phù hợp.
Đánh giá theo thời gian và theo nhóm dữ liệu quan trọng. Dịch chuyển tỷ lệ lớp hoặc quy trình gán nhãn có thể làm ngưỡng từng hoạt động tốt trở nên không còn phù hợp.
Brier score kết hợp nhiều khía cạnh của chất lượng dự báo, không phải phép đo calibration thuần túy. Reliability diagram còn phụ thuộc cách chia bin và số mẫu mỗi bin; luôn ghi độ bất định khi dữ liệu ít.
Lưu cả phiên bản mô hình, preprocessing, calibrator và ngưỡng. Khi tái huấn luyện, cần đánh giá cả chuỗi này để tránh so một xác suất mới với quyết định cũ không tương thích.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Baseline phân loại dữ liệu bảng.
- Thiết kế bước chuyển người kiểm tra khi chi phí bỏ sót và báo nhầm khác nhau.
Điểm mạnh
Mô hình gọn; ranh giới, xác suất và quy tắc quyết định có thể được kiểm tra riêng.
Giới hạn cần nhớ
Ranh giới tuyến tính và giả định dữ liệu có thể không phù hợp. Điểm sigmoid không mặc nhiên calibrated; ví dụ không huấn luyện hay đánh giá mô hình thực.
Thử trong một project nhỏ
Chạy mã rồi thử ngưỡng 0.3, 0.5 và 0.7. Ghi TP, FP, FN, TN cùng precision/recall. Chọn một quy tắc dựa trên chi phí giả định, và giải thích vì sao cần validation riêng trước khi dùng trên test.
import math
def sigmoid(z):
if z >= 0:
return 1.0 / (1.0 + math.exp(-z))
ez = math.exp(z)
return ez / (1.0 + ez)
# Hand-written logits and labels, not a fitted model or benchmark.
logits = [-2.0, -0.4, 0.2, 1.2, 2.0]
labels = [0, 0, 1, 0, 1]
probabilities = [sigmoid(z) for z in logits]
for threshold in (0.4, 0.7):
predicted = [int(p >= threshold) for p in probabilities]
tp = sum(y == 1 and h == 1 for y, h in zip(labels, predicted))
fp = sum(y == 0 and h == 1 for y, h in zip(labels, predicted))
fn = sum(y == 1 and h == 0 for y, h in zip(labels, predicted))
tn = sum(y == 0 and h == 0 for y, h in zip(labels, predicted))
assert tp + fp + fn + tn == len(labels)
print({"threshold": threshold, "TP": tp, "FP": fp, "FN": fn, "TN": tn,
"precision": tp / (tp + fp) if tp + fp else None,
"recall": tp / (tp + fn) if tp + fn else None})Python chuẩn; logits và nhãn được viết tay để minh họa tác động của ngưỡng. Không phải kết quả của mô hình được huấn luyện.
