Tôi cảm thấy rằng câu hỏi này có liên quan đến lý thuyết đằng sau xác nhận chéo. Tôi trình bày phát hiện thực nghiệm của mình ở đây và đã viết một câu hỏi liên quan đến lý thuyết xác nhận chéo ở đó .
Tôi có hai mô hình M1 và M2, tôi sử dụng cùng một bộ dữ liệu để huấn luyện chúng và thực hiện xác nhận chéo bằng cách sử dụng cùng một bộ dữ liệu đó để tìm các tham số tối ưu cho từng mô hình. Nói cuối cùng tôi thấy rằng M1 theo tham số tối ưu của nó, hoạt động tốt hơn M2 dưới tham số tối ưu của nó về điểm xác nhận chéo 10 lần. Bây giờ nếu tôi có một bộ dữ liệu thử nghiệm độc lập khác có cả bộ dự đoán và nhãn và bộ dữ liệu thử nghiệm này được tạo từ cùng một phân phối tập dữ liệu huấn luyện của tôi, thì trước khi tôi áp dụng 2 mô hình được điều chỉnh tốt này trên bộ dữ liệu thử nghiệm mới đó, tôi có thể yêu cầu hoặc tôi nên thấy rằng M1 vẫn sẽ hoạt động tốt hơn M2 so với tập dữ liệu thử nghiệm mới đó?
Tôi đã chơi Kaggle Titanic ví dụ. Tôi có 2 mô hình xgboost, M1 được điều chỉnh tốt và M2 được điều chỉnh kém hơn theo nghĩa là M1 có xác thực chéo 10 lần tốt hơn thực hiện trên tập dữ liệu đào tạo. Nhưng sau đó khi tôi gửi cả hai, tôi thấy rằng mô hình ít điều chỉnh hơn thực sự có điểm số tốt hơn trên tập dữ liệu thử nghiệm. Làm thế nào mà có thể được? Và nếu đó là sự thật, thì chúng ta nên tìm kiếm gì khi chúng ta khớp dữ liệu với các mô hình khác nhau và điều chỉnh các tham số mô hình?
Dưới đây là kết quả gửi cụ thể của tôi: Tôi đã thực hiện tìm kiếm lưới ngẫu nhiên
params_fixed = {'silent': 1,'base_score': 0.5,'reg_lambda': 1,
'max_delta_step': 0,'scale_pos_weight':1,'nthread': 4,
'objective': 'binary:logistic'}
params_grid = {'max_depth': list(np.arange(1,10)),
'gamma': [0,0.05,0.1,0.3, 0.5,0.7,0.9],
'n_estimators':[1,2,5,7,10,15,19,25,30,50],
'learning_rate': [0.01,0.03,0.05,0.1,0.3,0.5,0.7,0.9,1],
'subsample': [0.5,0.7,0.9], 'colsample_bytree': [0.5,0.7,0.9],
'min_child_weight': [1,2,3,5], 'reg_alpha': [1e-5, 1e-2, 0.1, 0.5,1,10]
}
rs_grid = RandomizedSearchCV(
estimator=XGBClassifier(**params_fixed, seed=seed),
param_distributions=params_grid,
n_iter=5000,
cv=10,
scoring='accuracy',
random_state=seed
)
Mỗi lần tôi thay đổi biến n_iter
. Đầu tiên, tôi đặt n_iter=10
, nó cung cấp cho tôi một tập hợp các giá trị của các tham số siêu đó, hãy gọi vectơ này và điểm cv (tỷ lệ chính xác) là 0,83389 , sau đó tôi sử dụng để huấn luyện mô hình của mình và tạo dự đoán trong bài kiểm tra độc lập bộ dữ liệu và khi tôi gửi tới Kaggle, nó tạo ra độ chính xác thực trên bộ dữ liệu thử nghiệm 0.79426
Thứ hai, tôi đặt n_iter=100
, nó mang lại cho tôi và điểm cv là 0,83614 , tức là cao hơn điểm đầu tiên, có ý nghĩa, nhưng khi tôi gửi tới Kaggle, 0,78469 , thấp hơn điểm đầu tiên.
Thứ ba, tôi đặt n_iter = 1000
, nó mang lại cho tôi và điểm cv là 0,83951 , nghĩa là cao hơn điểm thứ hai, nhưng khi tôi gửi tới Kaggle, 0,77990 , thấp hơn điểm thứ hai.
Thứ tư, tôi đặt n_iter = 5000
, nó mang lại cho tôi và điểm cv là 0,84512 , tức là cao hơn cái thứ ba, có ý nghĩa, nhưng khi tôi gửi tới Kaggle, 0,72249 , thấp hơn số thứ ba.
Điều này thực sự thất vọng. Mô hình ngày càng tốt hơn về điểm xác thực chéo nhưng khi được thực hiện trên một tập dữ liệu độc lập thực tế, hiệu suất của nó ngày càng tệ hơn. Tôi đã giải thích điểm CV theo cách hoàn toàn ngược lại? Tôi thấy một số bài viết đề cập rằng điểm CV có thể quá lạc quan để suy ra điểm kiểm tra thực sự. Tuy nhiên, ngay cả khi đó là sự thật, thì tôi nghĩ rằng điểm CV cho cả 4 mô hình của tôi đều phải lạc quan về điểm kiểm tra thực sự của chính họ, tức là, thứ tự nên giữ nguyên. Nhưng khi áp dụng trên tập dữ liệu thử nghiệm thực tế, thứ tự đã đảo ngược.
Lý do duy nhất tôi có thể tưởng tượng là, tập dữ liệu kiểm tra đó có phân phối khác với tập dữ liệu huấn luyện. Tuy nhiên, nếu nó thực sự là trường hợp, thì tôi tin rằng không có phương pháp nào dưới đó mặt trời có thể chữa được vấn đề này.