Limio— Learn your way
🏆 Đấu trường
Đăng nhậpĐăng ký

Thiết kế và phát triển: @Limio team - Khoa Khoa học và Công nghệ Giáo dục, Đại học Bách Khoa Hà Nội

← Fundamental of Machine Learning

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.

Đăng nhập
Module 3: Model Evaluation and Optimization

Kiểm định chéo (Cross-Validation)

In / Lưu PDF

Kiểm định chéo

Vấn đề của một lần chia

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?

K-Fold: chia K phần, xoay vòng

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.

Stratified K-Fold

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.

Chọn K bao nhiêu

KĐánh đổi
5Nhanh, 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ỏ

Lỗi thường gặp nhất

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.