Bạn tính độ lệch chuẩn bằng một hàm thống kê, rồi thấy kết quả chuẩn hóa khác với pipeline machine learning. Trước khi nghi dữ liệu bị đọc sai, hãy kiểm tra mẫu số: tổng bình phương độ lệch đang chia cho N hay N trừ một? Với tập nhỏ, hai lựa chọn cho ra khác biệt dễ thấy.
Bài này dùng dữ liệu tự tạo để đọc công thức, không huấn luyện mô hình. Mục tiêu là giúp bạn viết một phép kiểm tra nhỏ khi phải chuyển bước tiền xử lý giữa hai môi trường.
Điều kiện và phạm vi
Nguồn được đối chiếu ngày 11/11/2026: scikit-learn 1.9.1 và NumPy 2.5. Ví dụ bên dưới chỉ dùng thư viện chuẩn Python, đã chạy bằng Python 3.9.6; không cài hay chạy hai thư viện trên. Đây là phép minh họa một cột số hữu hạn, không thay thế bộ chuẩn hóa dùng trong sản phẩm.
StandardScaler mặc định trừ trung bình rồi chia độ lệch chuẩn của từng feature. Tài liệu ghi độ lệch chuẩn tương ứng ddof=0. NumPy mô tả mẫu số tổng quát là N - ddof. Khi so sánh hai cách triển khai, hãy ghi cả quy ước này vào dữ liệu kiểm thử.
1. Tính hai kết quả từ cùng ba giá trị
Chọn cột giả lập [2, 4, 6]. Trung bình bằng 4; bình phương các độ lệch là 4, 0 và 4. Tổng bằng 8. Chia cho 3 được phương sai theo quy ước ddof bằng 0; chia cho 2 được phương sai theo ddof bằng 1.
from math import sqrt, isclose
values = [2.0, 4.0, 6.0]
mean = sum(values) / len(values)
sum_squares = sum((x - mean) ** 2 for x in values)
std0 = sqrt(sum_squares / len(values))
std1 = sqrt(sum_squares / (len(values) - 1))
z0 = [(x - mean) / std0 for x in values]
z1 = [(x - mean) / std1 for x in values]
assert isclose(std0, sqrt(8 / 3))
assert std1 == 2.0
assert isclose(z0[0], -sqrt(1.5))
assert z1 == [-1.0, 0.0, 1.0]
print(round(std0, 6), z1)
Fixture chạy cho dòng in 1.632993 [-1.0, 0.0, 1.0]. Hai dãy cùng có trung bình bằng 0, nhưng độ lớn khác nhau. Vì vậy, chỉ kiểm tra tổng các giá trị sau chuẩn hóa gần 0 chưa đủ chứng minh hai pipeline giống nhau.
Hãy kiểm tra thêm trung bình bình phương của z0: nó gần 1 theo mẫu số N. Nếu bạn dùng công thức chia cho N trừ một để kiểm tra chính dãy này, kết quả sẽ khác. Cần dùng cùng quy ước cho bước biến đổi và bước đối chiếu.
2. Không chia cho độ lệch chuẩn bằng 0
Cột [7, 7, 7] có phương sai bằng 0. StandardScaler dùng hệ số scale bằng 1 khi không thể đưa phương sai về 1. Với thiết lập có trừ trung bình, các giá trị của cột hằng số sau biến đổi bằng 0.
from math import sqrt
constant = [7.0, 7.0, 7.0]
center = sum(constant) / len(constant)
variance = sum((x - center) ** 2 for x in constant) / len(constant)
scale = sqrt(variance) if variance != 0 else 1.0
transformed = [(x - center) / scale for x in constant]
assert scale == 1.0
assert transformed == [0.0, 0.0, 0.0]
print(transformed)
Đây là fixture số nhỏ, có phương sai bằng 0 chính xác. Đừng lấy phép so sánh này làm thuật toán phát hiện feature gần hằng số cho mọi kiểu số, mọi kích thước dữ liệu. Sai số số học và ngưỡng ổn định cần được xử lý bởi triển khai thư viện bạn chọn.
Kiểm tra khi nối hai hệ thống
Lưu một fixture gồm ba hàng bình thường và một cột hằng số. Ghi tên cột, thứ tự, trung bình, scale và kết quả mong đợi. Khi chuyển sang hệ thống phục vụ dự đoán, kiểm tra từng cột với sai số cho phép thay vì so chuỗi số đã làm tròn.
Nếu đầu ra khác nhau, kiểm tra lần lượt: dữ liệu đầu vào có cùng thứ tự không; có cùng bước trừ trung bình không; mẫu số tính phương sai là gì; cột hằng số được xử lý thế nào. Đổi nhiều thiết lập cùng lúc khiến việc tìm nguyên nhân khó hơn.
Lỗi thường gặp và giới hạn
Đừng thay scale đã lưu bằng độ lệch chuẩn tính lại trên một request riêng lẻ. Một request một hàng không mang cùng thông tin với tập đã dùng để tạo thống kê. Trong ví dụ này, [2, 4, 6] là toàn bộ fixture dùng để tính thống kê; bài không đánh giá chất lượng dự đoán hay rò rỉ dữ liệu thực tế.
Code minh họa chưa xử lý dữ liệu rỗng, NaN, vô cực, trọng số, sparse matrix hoặc số cực lớn. Nếu ứng dụng cần những trường hợp ấy, dùng API chính thức và thêm test đúng hợp đồng dữ liệu. Các kết quả ở đây chỉ xác nhận phép tính trên fixture đã nêu, không phải benchmark.
Kết luận
Khi chuẩn hóa khác nhau, hãy so quy ước độ lệch chuẩn trước. Một fixture có cả cột biến thiên và cột hằng số giúp phát hiện lỗi chuyển đổi rõ hơn một ví dụ chỉ có dữ liệu thông thường.

