Bạn đang xem thử công khai
Đăng nhập để lưu tiến độ, làm bài tập, thảo luận và nhận phản hồi.
Chia train/test một lần cho bạn một con số. Nhưng con số đó phụ thuộc vào việc dữ liệu rơi vào đâu. Đổi random_state, kết quả có thể nhảy từ 0.74 lên 0.81 — mà mô hình không hề thay đổi. Vậy con số nào là thật?
Với K = 5: chia dữ liệu thành 5 phần bằng nhau, rồi lặp 5 lần — mỗi lần lấy một phần làm validation, 4 phần còn lại để huấn luyện. Cuối cùng lấy trung bình 5 kết quả.
Mỗi mẫu dữ liệu đều được dùng để kiểm tra đúng một lần, và để huấn luyện K−1 lần.
from sklearn.model_selection import cross_val_score
scores = cross_val_score(pipe, x_train, y_train, cv=5, scoring="f1")
print(scores) # 5 con số
print(scores.mean(), scores.std()) # trung bình và độ dao động
Độ lệch chuẩn cũng quan trọng như trung bình. Trung bình 0.80 với độ lệch 0.02 là mô hình ổn định. Trung bình 0.80 với độ lệch 0.15 nghĩa là kết quả phụ thuộc mạnh vào việc chia dữ liệu — chưa đáng tin.
Với bài toán phân loại, luôn dùng bản phân tầng để mỗi fold giữ đúng tỉ lệ các lớp. Scikit-learn tự làm điều này khi bạn truyền một bộ phân loại vào cross_val_score.
| K | Đánh đổi |
|---|---|
| 5 | Nhanh, thường đủ tốt — mặc định hợp lý |
| 10 | Ước lượng ổn định hơn, chậm gấp đôi |
| = số mẫu (LOO) | Ít thiên lệch nhất nhưng rất chậm, chỉ hợp dữ liệu nhỏ |
Chuẩn hoá dữ liệu trước khi chạy cross-validation. Khi đó scaler đã học từ toàn bộ dữ liệu, kể cả phần sẽ làm validation ở mỗi vòng — kết quả đẹp hơn thực tế. Cách tránh: bọc scaler và mô hình trong một Pipeline rồi truyền pipeline đó vào cross_val_score.