Giới thiệu
Khi tham gia các cuộc thi trên Kaggle, bạn có thể nhận thấy rằng chỉ cần một sự chênh lệch nhỏ trong kết quả model cũng có thể dẫn đến việc bạn chiến thắng 100.000 đô la hoặc trắng tay. Chẳng hạn như tại cuộc thi Data Science Bowl 2017, giải thưởng lên đến 500.000 đô la cho đội chiến thắng, 200.000 đô la cho đội đứng thứ hai và 100.000 đô la cho đội đứng thứ ba. Mặc dù metric được sử dụng là log-loss, những kết quả này khiến ta phải xem xét liệu model của đội đứng thứ nhất thực sự tốt hơn model đứng thứ hai hay không.
Câu hỏi đặt ra
Làm thế nào để chúng ta chắc chắn rằng một model có metric tốt hơn trên tập dữ liệu test thực sự là tốt hay chỉ là do may mắn?
Câu hỏi này không chỉ tồn tại trong môi trường thi đấu trên Kaggle mà còn phổ biến trong thực tế. Một kỹ năng thiết yếu đối với các nhà khoa học dữ liệu là phải biết cách phân tích và định lượng tính ngẫu nhiên trong quá trình lựa chọn model tốt nhất.
Định nghĩa model tốt
Trước tiên, chúng ta cần định nghĩa khái niệm “model tốt”. Giả sử chúng ta có hai model A và B, và mô hình tốt hơn là mô hình cho performance tốt hơn trên dữ liệu chưa được thấy.
Giả sử model A đạt 86% ROC trong khi model B đạt 85% ROC. Ban đầu, model A có vẻ vượt trội hơn. Tuy nhiên, sau một thời gian thu thập thêm dữ liệu, bạn có thể thấy model B đã cải thiện và lên tới 87% ROC, lúc này model B lại trở thành model tốt hơn.
Vì vậy, định nghĩa chính xác về một model tốt là: Đối với một nhiệm vụ cụ thể, model tốt nhất là model có hiệu suất tốt nhất trên tất cả dữ liệu chưa thấy.
Khái niệm Universe
Chúng ta có thể coi dữ liệu chưa thấy như một vũ trụ (universe). Tuy chúng ta không thể quan sát tất cả các dữ liệu trong universe, nhưng ta có thể lấy mẫu từ một tập dữ liệu test để tiến hành đánh giá model.
Performance thực sự của một model là performance của nó trên universe, nhưng chúng ta chỉ có thể quan sát các điểm ROC từ tập test. Đôi khi điểm này cao hơn, đôi khi thấp hơn, và không có cách nào để xác định ROC thực sự của model.
Mô phỏng Universe
Để làm mô phỏng universe, bạn cần xác định số lượng cá thể mong muốn của universe (thường là con số lớn). Sau đó, xác định tỷ lệ phần trăm positive. Cuối cùng, tính toán xác suất dự đoán cho từng cá nhân trong universe. Việc này giúp bạn tạo ra một tập dữ liệu tổng hợp dựa trên ROC mà bạn hy vọng đạt được.
Mã Python để tạo dữ liệu
python
# Định nghĩa hàm để lấy dữ liệu
def get_y_proba(roc, n=100000, prevalence=.5):
n_ones = int(round(n * prevalence))
n_zeros = n - n_ones
y = np.array([0] * n_zeros + [1] * n_ones)
alpha = (roc - .5) * 2
proba_zeros = np.linspace(0, 1, n_zeros)
proba_ones = np.linspace(alpha, 1, n_ones)
proba = np.concatenate([proba_zeros, proba_ones])
return y, proba
Thước đo độ không chắc chắn
Chúng ta sẽ sử dụng hàm đã định nghĩa để tạo ra 100.000 quan sát và kiểm tra sự đa dạng của các mẫu test khác nhau. Từ đó, bạn có thể tính toán khoảng cách giữa mỗi cặp điểm ROC để đánh giá xem sự khác biệt giữa hai model có thể chỉ là kết quả của may mắn hay không.
Lấy mẫu và phân tích
Sử dụng các tính năng của thư viện Scikit-learn, bạn có thể dễ dàng tính toán khoảng cách giữa các điểm ROC để phân tích sự không chắc chắn trong lựa chọn model.
python
from sklearn.metrics import pairwise_distances
dist = pairwise_distances(np.array(rocs_sample).reshape(-1,1))
dist = dist[np.triu_indices(len(rocs_sample), k=1)]
Phân tích này cho thấy rằng nếu sự khác biệt nhỏ hơn một ngưỡng nhất định (ví dụ, 4%), thì cái được cho là mô hình tốt hơn có thể chỉ đơn giản là sự ngẫu nhiên.
Kết luận và khuyến nghị
Mặc dù chúng ta không thể khẳng định 100% mà không có sự mơ hồ trong việc lựa chọn model tốt nhất, hiểu biết về mức độ không chắc chắn và các yếu tố ảnh hưởng là rất quan trọng. Bạn sẽ cần phải làm việc với các yếu tố như true ROC, sample dimension và sample prevalence để có được những nhận định chính xác hơn về hiệu suất model.
Việc chạy các mô phỏng tương tự như đã thảo luận ở trên có thể giúp bạn đánh giá độ tin cậy của kết quả trong môi trường thực tế.
source: viblo