Hiệu suất xác thực chéo sẽ là một dấu hiệu chính xác để dự đoán hiệu suất thực trên tập dữ liệu độc lập?


9

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α1α1

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.α2

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.α3

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.α4

Đ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.

Câu trả lời:


3

Trước hết, một câu trả lời thực tế: không giảm giá khả năng bộ kiểm tra đến từ một bản phân phối hơi khác so với bộ dữ liệu bạn đang sử dụng để đào tạo và xác thực chéo. Bạn có thể nghĩ rằng điều đó không nên xảy ra, nhưng trong thực tế nó dường như xảy ra.

Điều đó nói rằng, hãy đi với giả thuyết của bạn và giả sử rằng bộ kiểm tra đến từ phân phối chính xác giống như phần còn lại của dữ liệu của bạn. Trong trường hợp đó, việc xác thực chéo có thể khiến bạn lạc lối về mô hình nào tốt hơn, nếu bạn đang sử dụng xác thực chéo để chọn siêu tham số.

Bạn có thể sử dụng xác thực chéo để (a) chọn siêu tham số hoặc (b) ước tính độ chính xác của mô hình của bạn - nhưng không phải cả hai cùng một lúc.

Có vẻ như bạn đang sử dụng xác thực chéo để chọn siêu tham số tối ưu: bạn thử nhiều lựa chọn khác nhau cho siêu tham số, cho mỗi lựa chọn ước tính độ chính xác của lựa chọn đó bằng xác thực chéo và chọn lựa chọn tốt nhất. Khi bạn làm điều đó, không có gì đảm bảo rằng độ chính xác kết quả (với tham số tốt nhất) sẽ được dự đoán về hiệu suất trên tập kiểm tra - đó có thể là sự đánh giá quá cao (do quá mức). Nếu đó là sự đánh giá quá cao đối với M1 so với M2, thì bạn có thể thấy những gì bạn đã thấy.

Nếu bạn muốn chọn cả hai tham số siêu chính xác và ước tính độ chính xác, tôi khuyên bạn nên có một bộ xác thực giữ riêng biệt để ước tính độ chính xác hoặc sử dụng xác thực chéo lồng nhau. Xem https://stats.stackexchange.com/q/65128/2921http://scikit-learn.org/urdy/auto_examples/model_selection/plot_nested_cross_validation_iris.html .


Bạn có biết tài liệu tham khảo lý thuyết khác (từ phía lý thuyết xác suất) giải thích tại sao CV lồng nhau là cần thiết hơn CV đơn giản để lựa chọn mô hình không? Tôi muốn hiểu cơ chế cơ bản dẫn đến vấn đề tôi gặp phải
KevinKim

1
Tôi cũng đề nghị sử dụng xác nhận chéo lồng nhau. nếu bạn đang thực hiện CV ngoài 3 lần và CV bên trong 10 lần, bạn sẽ kiểm tra 3 mô hình bạn đào tạo trong CV bên trong trên ba bộ dữ liệu khác nhau; điều đó sẽ cho bạn hiểu rõ hơn về quá trình xây dựng mô hình của bạn sẽ kết thúc như thế nào khi nó gặp các bộ dữ liệu khác nhau.
darXider

@darXider Tôi đã đọc một số CV lồng nhau, có vẻ như nó được sử dụng để so sánh 2 lớp mô hình, ví dụ: RF và GBT sao cho trong CV bên trong, nó chọn siêu âm "tốt nhất" (lỗi CV thấp nhất) RF và GBT tương ứng, sau đó trong CV bên ngoài, nó tính toán lỗi tổng quát hóa của RF và GBT với các siêu đường kính được chọn bởi CV bên trong. Trong trường hợp của tôi, tôi chỉ có một lớp mô hình, GBT, tôi muốn thực hiện điều chỉnh siêu tham số. Làm thế nào để cv lồng nhau giúp tôi làm điều đó?
KevinKim

@KevinKim AFAIK, mục tiêu của CV lồng nhau là đưa ra ý tưởng về cách quá trình xây dựng mô hình sẽ khái quát hóa và không so sánh các lớp mô hình khác nhau. Vì mục tiêu cuối cùng của bạn là sử dụng mô hình được đào tạo của bạn (cho dù là RF hay XGB) trên dữ liệu trong tương lai / chưa thấy, bạn có thể hiểu rõ hơn về hiệu suất của nó nếu bạn sử dụng CV lồng nhau. Tất nhiên, bạn cũng thực hiện điều chỉnh siêu tham số trong CV lồng nhau 3x10 của bạn; Cuối cùng, bạn sẽ nhận được, 3 mô hình XGB tương đương với nhau (lưu ý rằng bạn không nên chọn một trong ba mô hình, nhưng bạn có thể kết hợp chúng, giả sử, sử dụng nhiều phương pháp khác nhau).
darXider

1

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 đó?

Có bạn nên. Tất nhiên trong điều kiện

  1. dữ liệu kiểm tra đến từ cùng một quá trình tạo như dữ liệu huấn luyện và xác nhận, và
  2. bạn có đủ dữ liệu trong mỗi bộ để biến động thống kê khó xảy ra.

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 có thể nghĩ về hai lý do:

  1. Tập dữ liệu thử nghiệm thực sự không được tạo theo cùng một cách. Do đó, tốt hơn là không nên dựa vào bộ kiểm tra Kaggle mà bạn không có quyền truy cập. Sử dụng dữ liệu mà bạn có.

  2. Bạn đã quá phù hợp, điều đó có nghĩa là bạn không thực hiện xác nhận chéo chính xác. Hãy chắc chắn rằng việc đào tạo các tham số xảy ra trên dữ liệu đào tạo, đồng thời, việc xác thực xảy ra trên dữ liệu mà bạn không sử dụng cho đào tạo. So sánh biểu đồ của tổn thất đào tạo và tổn thất xác nhận. Các tổn thất đào tạo phải luôn nhỏ hơn tổn thất xác nhận. Làm tương tự cho các tổn thất trên dữ liệu thử nghiệm để có được một bức tranh nhất quán.

Lưu ý và kết thúc: Dự kiến, hiệu suất trên tập kiểm tra thấp hơn so với tập xác thực. Điều này là do mô hình được chọn dựa trên bộ xác nhận. Vì vậy, nó được thiên vị cho tập dữ liệu đó.


Tôi có mã trong bài viết của mình, tôi không nghĩ rằng tôi đã sử dụng sai quy trình CV (bạn có thấy có gì sai với mã của tôi không?). Và tôi thực sự thấy rằng lỗi đào tạo ít hơn và ổn định hơn (với tiêu chuẩn nhỏ) so với lỗi xác nhận. Tôi hiểu rằng lỗi kiểm tra thực sự sẽ cao hơn lỗi xác thực nhưng tôi hy vọng điều này cũng sẽ xảy ra với tất cả các mô hình của tôi (ý tôi là XBGT với giá trị khác nhau của các siêu đường kính). Từ những gì tôi thấy, có vẻ như một số mô hình này xảy ra ít hơn các mô hình khác, tạo ra "hiện tượng đảo ngược" này. Vì vậy, tôi không biết mình đang tìm hướng nào để điều chỉnh hyperpara
KevinKim

D

Tôi nghĩ rằng trong thực tế, mặc dù chúng ta đang sống trong một thế giới "dữ liệu lớn", số lượng tính năng cũng đang tăng lên. Khi chúng ta có lời nguyền về chiều, rất có thể chúng ta thậm chí còn có một số lượng lớn các hàng, vẫn cho mỗi phần của không gian tính năng, chúng ta vẫn không có đủ điểm dữ liệu. Sau đó, biến động thống kê luôn luôn có. Sau đó, tôi đang đặt câu hỏi, liệu quy trình hyperP điều chỉnh này vẫn đúng hay hữu ích để có được một mô hình có hiệu suất tốt trên tập dữ liệu thử nghiệm thực sự? Nếu CV không hữu ích để thực hiện nhiệm vụ này, thì quy trình chính xác là gì?
KevinKim

Xác minh xem các tổn thất đào tạo trong quy trình xác nhận của bạn có thể so sánh với nhau hay không, nghĩa là phù hợp. Nếu không, hãy thử lựa chọn mô hình / tính năng khác. Đừng tiếp tục cho đến khi bạn có quyền này. Sau đó làm điều tương tự cho tổn thất xác nhận của bạn. Nếu những điều này không thể so sánh được, thì hãy thử phương pháp xác thực / lựa chọn mô hình / tính năng khác. Khi có, tiến hành thử nghiệm bộ. Nếu mất mát không thỏa mãn bạn ở đó, sau đó từ chối thủ tục hoàn chỉnh và thử một cái gì đó khác. Nếu bạn bắt đầu tối ưu hóa bằng cách sử dụng bộ thử nghiệm, bạn không thể dựa vào hiệu suất trực tiếp, vì nó sẽ bị sai lệch so với bộ thử nghiệm.
Ytsen de Boer

0

Điều đó là có thể. Hãy nghĩ về một kịch bản đơn giản trong đó mô hình M1đã học được phương sai của tập dữ liệu huấn luyện Dtốt hơn mô hình M2vì các tham số của nó được điều chỉnh tốt hơn. Điều này có nghĩa là M1thực hiện tốt Dhơn M2.

Nhưng khi chúng tôi kiểm tra chúng ở bộ kiểm tra T, có thể hoạt động M2tốt hơn M1có thể là quá mức Dtrong khi M2không. Do đó M1thực hiện kém Thơn M2.

Điều này có thể là do thực tế là bạn đã thực hiện xác thực chéo của mình trên cùng một tập dữ liệu thay vì bộ xác thực. Nếu bạn đào tạo và xác nhận trong cùng một bộ, bạn có thể bỏ lỡ thực tế rằng nó có thể bị thừa. Do đó, luôn luôn tốt hơn để đào tạo, xác nhận và kiểm tra tại các bộ dữ liệu khác nhau. Vì vậy, dòng chảy nên được

  1. Đào tạo các mô hình khác nhau trong cùng một tập huấn luyện
  2. Xác thực tại bộ xác thực
  3. Chọn hiệu suất cơ sở mô hình hoạt động tốt nhất tại bộ xác nhận
  4. Sử dụng nó để chấm điểm tập kiểm tra của bạn.

Tôi mặc dù xác thực chéo trên bộ dữ liệu Dđã tính đến các vấn đề quá mức. Tôi hiểu rằng nếu bạn hoàn toàn không thực hiện xác thực chéo, tức là bạn chỉ cần phù hợp với mô hình trên tập dữ liệu Dvà giải quyết vấn đề tối ưu hóa đó và nhận được các tham số tối ưu, thì mô hình này sẽ có ít lỗi tàu nhất và rất có khả năng một quá mức. Trong trường hợp này, tôi đồng ý rằng optimizedmô hình này sẽ có xu hướng hoạt động kém trên một tập dữ liệu thử nghiệm độc lập. Nhưng tôi nghĩ vấn đề này đã được quan tâm bằng cách xác nhận chéo trên tập dữ liệu D, phải không?
KevinKim

1
Cụ thể, khi bạn thực hiện CV gấp 10 lần D, đầu tiên bạn cắt ngẫu nhiên Dthành khoảng 10 mảnh có kích thước bằng nhau, sau đó trong mỗi lần lặp, bạn khớp cả M1 và M2 trên cùng 9/10 D, sau đó bạn áp dụng chúng cùng 1 / 10 trong số đó Dđể có được test error, sau đó bạn lặp lại quy trình này 10 lần và mỗi lần, tập huấn luyện và tập kiểm tra khác với lần lặp trước. Sau 10 lần lặp lại, bạn tính trung bình lỗi kiểm tra cho M1 và M2, sau đó bạn thấy M1 có ít lỗi kiểm tra hơn, thì không đủ để kết luận rằng M1 tốt hơn M2 và quy trình này dường như đã được xử lý quá mức
KevinKim

Vâng, đủ để kết luận rằng "M1 tốt hơn M2". Nhưng, nếu quy trình lựa chọn mô hình của bạn chuyển sang chọn M1 dựa trên hiệu suất xác thực , thì lựa chọn mô hình tốt nhất của bạn (M1 trong trường hợp này) sẽ bị sai lệch so với tập xác thực. Do đó, cần phải kiểm tra lần cuối trên bộ kiểm tra, để có được một dấu hiệu cho thấy nó sẽ hoạt động tốt như thế nào trên dữ liệu trực tiếp.
Ytsen de Boer

@YtsendeBoer Cuối cùng tôi đã thuyết phục bản thân về những gì bạn nói. Tôi đồng ý. Nhưng sau đó, nếu trên một bộ thử nghiệm độc lập khác, tôi thấy M1 kém hơn M2 (nhớ lại M1 tốt hơn M2 trên bộ xác nhận), thì trong trường hợp này, tôi nên chọn M1 hoặc M2 làm mô hình cuối cùng để dự đoán thực sự trong Tương lai? Nếu tôi chọn M1, thì rõ ràng kết quả thử nghiệm so với M1. Nhưng nếu tôi chọn M2, liệu M2 có bị quá tải trên tập dữ liệu thử nghiệm cụ thể này không? tức là, cách tương tự như M1 quá mức trên bộ xác nhận cụ thể?
KevinKim

Vâng, đó chính xác là lý do tại sao bạn không nên thực hiện lựa chọn mô hình trên bộ thử nghiệm. Bạn đã chọn M1 trong quy trình lựa chọn mô hình của mình bằng cách sử dụng bộ xác thực. Sau đó, bạn chạy M1 trên bộ kiểm tra và quyết định xem kết quả có đủ tốt hay không. Hãy quên M2 vào thời điểm này, ngay cả khi nó xảy ra để hoạt động tốt hơn trên một bộ thử nghiệm khác. Tuy nhiên, nếu bạn nghi ngờ về kết quả của mình, thì bạn nên thêm "bộ kiểm tra độc lập khác" vào phần còn lại của dữ liệu (nhiều dữ liệu sẽ tốt hơn), bắt đầu lại quy trình và tuân thủ .
Ytsen de Boer

0

Lý thuyết đằng sau xác nhận chéo (xác nhận chéo v-lần) đã được đề cập trong nhiều bài báo. Có một bằng chứng cho điều đó trong một tập hợp các bài báo được xuất bản từ 2003-2007. Vui lòng tham khảo: - Bộ chọn orory. 2006 - super learner 2007 - super learner in 2010 - thống nhất xác thực chéo 2003

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.