Trong các cuộc thi khoa học dữ liệu, nhiều người tham gia thường gặp phải vấn đề: mô hình hoạt động tốt ở giai đoạn đầu nhưng lại sụt giảm đáng kể khi đến vòng xác thực cuối cùng. Tại sao lại có sự thay đổi đột ngột như vậy? Nguyên nhân chính là do các mô hình có thể bị "quá khớp" (overfitting) hoặc "khớp không đủ" (underfitting).
Hãy cùng phân tích qua các ví dụ sau:
Giả sử chúng ta đang tìm mối quan hệ giữa kích thước (size) và giá cả (price). Ba mô hình sẽ xử lý vấn đề này như sau:
-
Mô hình đầu tiên sử dụng phương trình tuyến tính. Mô hình này có sai số lớn trên dữ liệu huấn luyện, dẫn đến kết quả kém cả ở bảng xếp hạng ban đầu và cuối cùng. Đây là ví dụ về "khớp không đủ" - mô hình không đủ sức khám phá xu hướng ẩn trong dữ liệu.
-
Mô hình thứ hai đã tìm ra mối quan hệ chính xác giữa giá cả và kích thước, với sai số thấp và khả năng tổng quát tốt.
-
Mô hình thứ ba gần như không có sai số trên dữ liệu huấn luyện. Điều này xảy ra vì mô hình này quá nhạy cảm, kể cả những nhiễu ngẫu nhiên trong tập dữ liệu huấn luyện. Đây là ví dụ về "quá khớp" - mô hình có thể thay đổi lớn giữa các bảng xếp hạng.
Để giải quyết vấn đề này, chúng ta cần sử dụng kỹ thuật kiểm tra chéo (cross-validation) - một phương pháp giúp xây dựng mô hình có khả năng tổng quát tốt hơn.
Kiểm tra chéo (Cross-Validation) là gì?
Kiểm tra chéo là kỹ thuật giữ lại một phần dữ liệu không dùng để huấn luyện mô hình. Phần dữ liệu này sẽ được dùng để kiểm tra mô hình trước khi hoàn thiện.
Quá trình kiểm tra chéo bao gồm các bước:
- Giữ lại một phần dữ liệu làm tập kiểm tra
- Sử dụng phần còn lại để huấn luyện mô hình
- Dùng tập kiểm tra để đánh giá mô hình. Nếu mô hình hoạt động tốt trên tập kiểm tra, chúng ta có thể tiếp tục sử dụng nó.
Các phương pháp kiểm tra chéo phổ biến
Có nhiều phương pháp kiểm tra chéo. Dưới đây là một số phương pháp chính:
1. Phương pháp tập kiểm tra (Validation Set)
Chia dữ liệu thành hai phần: 50% dùng để huấn luyện và 50% dùng để kiểm tra. Phương pháp này có nhược điểm là chỉ sử dụng 50% dữ liệu để huấn luyện, có thể bỏ lỡ các thông tin quan trọng, dẫn đến độ chệch lớn.
2. Phương pháp LOOCV (Leave-One-Out Cross-Validation)
Phương pháp này giữ lại một điểm dữ liệu để kiểm tra, dùng phần còn lại để huấn luyện. Quá trình này lặp lại cho mỗi điểm dữ liệu.
Ưu điểm:
- Độ chệch thấp vì sử dụng tất cả dữ liệu
Nhược điểm:
- Thời gian thực thi lâu vì phải lặp lại n lần (n là số điểm dữ liệu)
- Kết quả đánh giá có thể biến động lớn vì chỉ dùng một điểm để kiểm tra
3. Phương pháp K-fold Cross-Validation
Từ hai phương pháp trên, chúng ta rút ra các bài học:
- Cần sử dụng tỷ lệ lớn dữ liệu để huấn luyện, nếu không sẽ dẫn đến độ chệch lớn
- Tỷ lệ dữ liệu dùng để kiểm tra cần hợp lý. Nếu quá ít, kết quả đánh giá sẽ biến động nhiều
- Quá trình huấn luyện và kiểm tra cần lặp lại nhiều lần với các tập dữ liệu khác nhau
Phương pháp K-fold Cross-Validation giải quyết được cả ba vấn đề này. Các bước thực hiện:
- Chia toàn bộ dữ liệu thành K "lớp" (folds) một cách ngẫu nhiên
- Sử dụng K-1 lớp để huấn luyện và lớp còn lại để kiểm tra
- Ghi lại sai số từ mỗi lần dự báo
- Lặp lại quá trình cho đến khi mỗi lớp đều được dùng làm tập kiểm tra
- Sai số trung bình của K lần được gọi là sai số kiểm tra chéo (cross-validation error), dùng để đánh giá hiệu suất mô hình
Khi k=10, phương pháp K-fold được minh họa như sau:
Vấn đề thường gặp: "Làm thế nào để chọn giá trị K phù hợp?"
Giá trị K càng nhỏ, độ chệch càng lớn. Ngược lại, K càng lớn, kết quả càng biến động. Khi K nhỏ, phương pháp này giống với "Validation Set"; khi K lớn, giống với "LOOCV". Thường thì K=10 là giá trị được khuyến nghị.
Đo lường độ chệch và biến động của mô hình
Sau khi thực hiện K-fold cross-validation, chúng ta có K ước lượng sai số khác nhau (e1, e2,...ek). Để tính độ chệch, chúng ta lấy trung bình các sai số này. Trung bình càng thấp, mô hình càng tốt.
Biến động của mô hình được tính bằng độ lệch chuẩn của các sai số. Độ lệch chuẩn càng nhỏ, mô hình càng ổn định khi thay đổi dữ liệu huấn luyện.
Chúng ta cần cân bằng giữa độ chệch và biến động. Giảm biến động và kiểm soát độ chệch sẽ giúp tạo ra mô hình dự báo tốt hơn.
Ví dụ mã nguồn
Python Code
from sklearn.model_selection import KFold
from sklearn.ensemble import RandomForestRegressor
import numpy as np
# Tạo mô hình Random Forest
model = RandomForestRegressor(n_estimators=150)
# K-fold cross-validation với 10 folds
kf = KFold(n_splits=10, shuffle=True, random_state=42)
errors = []
# Thay Error_function bằng hàm lỗi phù hợp với bài toán của bạn
for train_idx, test_idx in kf.split(X_data):
X_train, X_test = X_data[train_idx], X_data[test_idx]
y_train, y_test = y_data[train_idx], y_data[test_idx]
model.fit(X_train, y_train)
predictions = model.predict(X_test)
errors.append(calculate_error(y_test, predictions))
print(f"Cross-validation error: {np.mean(errors):.4f}")
R Code
# Cài đặt thư viện cần thiết
library(caret)
library(randomForest)
# Tải dữ liệu iris
data(iris)
# Thiết lập tham số K-fold
k_folds <- 8
# Thiết lập quy trình kiểm tra chéo
control <- trainControl(method = "cv", number = k_folds)
# Huấn luyện mô hình Random Forest với kiểm tra chéo
rf_model <- train(Sepal.Length ~ ., data = iris,
method = "rf",
trControl = control,
ntree = 200)
# Xem kết quả
print(rf_model)