aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Log loss: vì sao dự đoán sai càng tự tin càng bị phạt nặng?

Suong Nguyen by Suong Nguyen
08/11/2026
in AI
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Hai bộ phân loại có cùng accuracy vẫn có thể đưa ra xác suất rất khác nhau. Với một mẫu mang nhãn 1, dự đoán 0.1 và 0.01 đều sai nếu dùng ngưỡng 0.5. Tuy nhiên, trường hợp thứ hai gán ít xác suất hơn nhiều cho sự kiện thực sự xảy ra. Bài này dùng log loss để nhìn rõ sự khác biệt ấy bằng vài phép tính nhỏ.

Nội dung đối chiếu ngày 08/11/2026 với tài liệu scikit-learn 1.9.1. Ví dụ chạy bằng Python 3.9.6 và thư viện chuẩn, không gọi scikit-learn, huấn luyện mô hình hay đo chất lượng trên dữ liệu sản phẩm. Phiên bản Python nêu ở đây mô tả môi trường kiểm tra, không phải khuyến nghị triển khai phiên bản cũ.

Xác định xác suất đang nói về nhãn nào

Quy ước p là xác suất nhãn 1. Khi nhãn thật bằng 1, lấy xác suất được gán cho nhãn đúng là p; khi nhãn thật bằng 0, lấy 1 - p. Gọi giá trị đó là q, loss của một mẫu bằng -ln(q). Logarithm ở đây có cơ số e.

Đây là cách đọc công thức nhị phân trong tài liệu log_loss. Loss càng nhỏ càng tốt trên cùng bài toán và tập đánh giá. Đừng đưa nhãn dự đoán 0/1 vào vị trí xác suất chỉ vì chúng cũng nằm trong đoạn từ 0 đến 1.

Viết một hàm minh họa có hợp đồng rõ ràng

import math

def binary_log_loss(y, p):
    if type(y) is not int or y not in (0, 1):
        raise ValueError("y must be integer 0 or 1")
    if type(p) not in (int, float) or not math.isfinite(p):
        raise ValueError("p must be a finite number")
    if not 0 <= p <= 1:
        raise ValueError("p must be in [0, 1]")
    q = p if y == 1 else 1 - p
    return math.inf if q == 0 else -math.log(q)

for p in (0.9, 0.1, 0.01):
    print(p, round(binary_log_loss(1, p), 6))

Kết quả lần lượt là 0.105361, 2.302585, 4.60517. Hai dự đoán sai vẫn cùng một nhãn sau khi áp ngưỡng, nhưng loss đã tăng gấp đôi khi xác suất cho nhãn đúng giảm từ 0.1 xuống 0.01. Đây là phép tính trên ba đầu vào tự đặt, không phải số đo từ một mô hình thực tế.

Hàm chủ động từ chối boolean và chuỗi số để lỗi dữ liệu không bị che bởi ép kiểu. Python math mô tả log và isfinite; phần kiểm tra miền giá trị là hợp đồng riêng của ví dụ.

Cùng accuracy nhưng loss khác nhau

Chạy tiếp trong cùng file:

labels = [1, 0]
scores_a = [0.6, 0.4]
scores_b = [0.99, 0.01]

for scores in (scores_a, scores_b):
    accuracy = sum(int(p >= 0.5) == y for y, p in zip(labels, scores)) / len(labels)
    loss = sum(binary_log_loss(y, p) for y, p in zip(labels, scores)) / len(labels)
    print(accuracy, round(loss, 6))

Hai dòng đều có accuracy 1.0; loss tương ứng 0.510826 và 0.01005. Trong đúng hai mẫu này, bộ B gán nhiều xác suất hơn cho cả hai nhãn đúng. Không thể từ ví dụ suy ra rằng tăng độ tự tin luôn cải thiện mô hình: đổi nhãn thật của một mẫu rồi tính lại sẽ thấy mặt còn lại của mức phạt.

Kiểm tra các điểm biên trước khi nối vào báo cáo

Hãy thêm kiểm tra cho (y=1, p=1) và (y=0, p=0): cả hai cho loss bằng 0. Với (1, 0) hoặc (0, 1), hàm minh họa trả vô cực. Không thay bằng số 0 khi xuất báo cáo vì thao tác đó sẽ làm một sai lầm cực đoan trông như dự đoán hoàn hảo.

scikit-learn có clipping theo độ chính xác của dtype; vì vậy điểm biên có thể cho giá trị hữu hạn khác hàm ở trên. Khi so sánh hai hệ thống, ghi cả quy ước clipping, loại số và cách lấy trung bình. Đừng tuyên bố hàm giáo khoa này tái hiện toàn bộ API của thư viện.

Lỗi thường gặp và cách dùng tiếp

  • Đảo p của lớp 0 thành lớp 1: lưu rõ tên lớp cạnh cột xác suất.
  • Lấy trung bình khi số nhãn và số điểm khác nhau: kiểm tra chiều dài trước khi dùng zip, vì ví dụ hiện chỉ dùng hai mảng cố định bằng nhau.
  • Chỉ xem loss trung bình: đọc thêm các mẫu có loss lớn và xác nhận nhãn nguồn.
  • So loss của hai tập khác phân bố rồi kết luận mô hình tốt hơn: giữ cùng bộ đánh giá và cùng cách tính.

Bạn có thể bắt đầu bằng bảng gồm nhãn thật, xác suất nhãn 1 và loss từng mẫu. Bảng này giúp truy ngược một con số tổng về những dự đoán cụ thể, trước khi quyết định có cần điều chỉnh mô hình hay quy trình gán nhãn.

Nguồn tham khảo

  • scikit-learn 1.9.1: log_loss
  • Python 3.9: math

Tags: Đánh giá mô hìnhLog lossMachine Learning
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Softmax: trừ max logit trước khi tính exp để tránh overflow

by Suong Nguyen
07/11/2026
0

Tái hiện overflow bằng Python thuần và kiểm tra phép dịch logits giữ nguyên phân phối softmax trên một vector hữu hạn.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Top-k accuracy: nhãn đúng nằm trong danh sách chưa có nghĩa dự đoán đầu tiên đúng

by Suong Nguyen
06/11/2026
0

Tính top-1 và top-2 trên cùng bộ score để phân biệt hệ thống chọn một nhãn với hệ thống gợi ý nhiều nhãn.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Min-max scaling: học min và max từ train, không học lại từ test

by Suong Nguyen
05/11/2026
0

Dùng một ví dụ số để phát hiện rò rỉ dữ liệu khi chuẩn hóa trước khi chia tập hoặc fit lại trên test.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Accuracy theo batch: cộng số đúng và số mẫu trước khi chia

by Suong Nguyen
04/11/2026
0

Kiểm tra vì sao trung bình accuracy của các batch khác kích thước có thể sai với accuracy toàn tập, bằng số đếm tự tạo.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native Platform.select: native và default được chọn theo thứ tự nào?
  • Phỏng vấn JavaScript: vì sao regex.test cùng chuỗi lại đổi kết quả?
  • Android TextView.setText(Int): số đếm có thể bị hiểu thành resource ID

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply