Pipeline đánh giá chia dữ liệu thành nhiều batch rồi ghi accuracy từng batch. Nếu lấy trung bình các số ấy mà không xét kích thước batch, một batch cuối chỉ có một mẫu có thể nhận trọng số bằng cả batch lớn. Báo cáo thay đổi dù các dự đoán gốc không đổi.
Bài đọc tài liệu scikit-learn 1.9.1 và NumPy 2.5 ngày 04/11/2026. Ví dụ chạy bằng Python 3.9.6 với thư viện chuẩn, không chạy hai thư viện trên, không huấn luyện hay gọi model. Số đếm được tự tạo để kiểm tra phép tổng hợp, không phải kết quả đo một sản phẩm AI.
Chốt đơn vị của metric
Ở đây, mỗi mẫu có một nhãn thật và một nhãn dự đoán, mỗi mẫu có trọng số bằng nhau. Accuracy toàn tập là tổng số mẫu đúng chia tổng số mẫu. Không áp dụng trực tiếp ví dụ cho token accuracy có mask, multilabel hoặc metric dùng trọng số nghiệp vụ khác.
Tài liệu accuracy_score cho phép trả tỷ lệ đúng hoặc số đúng. Điều đó gợi ý cách lưu thông tin trung gian: giữ cả tử số và mẫu số, thay vì chỉ lưu một phần trăm đã làm tròn. Khi ghép các phần dữ liệu, bạn còn đủ thông tin để tổng hợp theo đúng đơn vị.
Một batch nhỏ có thể làm lệch trung bình
Lưu thành batch_accuracy.py, chạy python3 batch_accuracy.py:
from math import isclose
def overall_accuracy(batches):
if not batches:
raise ValueError("Can it nhat mot batch")
correct_sum = 0
sample_sum = 0
for correct, samples in batches:
if not isinstance(correct, int) or not isinstance(samples, int):
raise ValueError("So dem phai la integer")
if samples <= 0 or not 0 <= correct <= samples:
raise ValueError("So dem khong hop le")
correct_sum += correct
sample_sum += samples
return correct_sum / sample_sum
batches = [(1, 1), (0, 9)]
mean_of_batches = sum(c / n for c, n in batches) / len(batches)
overall = overall_accuracy(batches)
assert isclose(mean_of_batches, 0.5)
assert isclose(overall, 0.1)
print(mean_of_batches, overall)
Kết quả đã kiểm tra là 0.5 0.1. Batch đầu đúng một mẫu; batch sau sai cả chín. Tổng cộng chỉ có một mẫu đúng trong mười mẫu, nên tỷ lệ toàn tập là 0,1. Trung bình 0,5 đang cho mỗi batch trọng số bằng nhau, không cho mỗi mẫu trọng số bằng nhau.
Nếu tính trung bình có trọng số của từng accuracy, trọng số cần là số mẫu của batch trong phạm vi này. Tuy nhiên, cộng số đếm trước khi chia dễ tránh nhầm hơn và không cần làm tròn từng tỷ lệ ở bước trung gian.
Kiểm tra tính ổn định khi chia lại batch
Chạy thêm trong cùng file:
split_batches = [(1, 1), (0, 3), (0, 3), (0, 3)]
split_mean = sum(c / n for c, n in split_batches) / len(split_batches)
assert isclose(split_mean, 0.25)
assert isclose(overall_accuracy(split_batches), overall)
print(split_mean, overall_accuracy(split_batches))
Phép thử đã xác nhận trung bình batch đổi thành 0,25, còn accuracy tổng vẫn là 0,1. Chúng ta chỉ chia chín mẫu sai thành ba phần, không tạo ra dự đoán mới. Đây là case nhỏ hữu ích để kiểm tra hàm tổng hợp trong pipeline đánh giá.
Nếu mọi batch có cùng kích thước, trung bình các accuracy chưa làm tròn có thể trùng kết quả tổng. Điều đó không bảo đảm code vẫn đúng khi batch cuối ngắn hơn hoặc một phần dữ liệu bị loại khỏi đánh giá.
Áp dụng vào log đánh giá
Lưu correct_count, sample_count, phiên bản model và tập dữ liệu tương ứng. Kiểm tra mẫu có bị lặp khi ghép nhiều worker hay không; cộng đúng công thức vẫn có thể sai nếu mỗi mẫu được đếm hai lần. Định nghĩa rõ các mẫu bị loại và lý do, để mẫu số của báo cáo có thể đối chiếu.
Với dataset rỗng, demo báo lỗi thay vì hiển thị 0% rồi làm người đọc tưởng đã có quan sát. Với metric khác accuracy, hãy xem metric có thể tổng hợp từ những thống kê nào; không thay mọi phép tính bằng cùng một cách lấy trung bình theo batch.
Giữ tử số và mẫu số giúp báo cáo truy vết được. Khi đổi batch size mà kết quả tổng hợp thay đổi, hãy kiểm tra lại cả cách ghép dữ liệu lẫn phép chia trước khi kết luận model đã tốt lên hoặc kém đi.


