Lựa chọn tính năng và xác nhận chéo


76

Gần đây tôi đã đọc rất nhiều trên trang web này (@Aniko, @Dikran Marsupial, @Erik) và những nơi khác về vấn đề quá mức xảy ra với xác nhận chéo - (Smialowski et al 2010 Bioinformatics, Hastie, Các yếu tố của học thống kê). Gợi ý là mọi lựa chọn tính năng được giám sát (sử dụng tương quan với nhãn lớp) được thực hiện bên ngoài ước tính hiệu suất mô hình bằng cách sử dụng xác thực chéo (hoặc phương pháp ước tính mô hình khác như bootstrapping) có thể dẫn đến quá mức.

Điều này có vẻ không trực quan với tôi - chắc chắn nếu bạn chọn một bộ tính năng và sau đó đánh giá mô hình của bạn chỉ sử dụng các tính năng được chọn bằng xác thực chéo, thì bạn sẽ có được ước tính không thiên vị về hiệu suất mô hình tổng quát trên các tính năng đó (điều này giả sử mẫu được nghiên cứu là đại diện của dân chúng)?

Với thủ tục này, tất nhiên người ta không thể yêu cầu một bộ tính năng tối ưu nhưng người ta có thể báo cáo hiệu suất của bộ tính năng được chọn trên dữ liệu chưa xem là hợp lệ không?

Tôi chấp nhận rằng việc chọn các tính năng dựa trên toàn bộ tập dữ liệu có thể khởi động lại trong một số rò rỉ dữ liệu giữa các tập kiểm tra và tập huấn. Nhưng nếu bộ tính năng là tĩnh sau khi chọn ban đầu và không có điều chỉnh nào khác được thực hiện, chắc chắn có hợp lệ để báo cáo các số liệu hiệu suất được xác thực chéo không?

Trong trường hợp của tôi, tôi có 56 tính năng và 259 trường hợp và vì vậy #case> #features. Các tính năng được lấy từ dữ liệu cảm biến.

Xin lỗi nếu câu hỏi của tôi có vẻ phái sinh nhưng đây có vẻ là một điểm quan trọng để làm rõ.

Chỉnh sửa: Khi triển khai lựa chọn tính năng trong xác thực chéo trên tập dữ liệu được nêu chi tiết ở trên (nhờ các câu trả lời bên dưới), tôi có thể xác nhận rằng việc chọn các tính năng trước khi xác thực chéo trong bộ dữ liệu này đã giới thiệu đáng kểThiên kiến. Sự thiên vị / quá mức này là lớn nhất khi làm như vậy đối với công thức 3 lớp, so với công thức 2 lớp. Tôi nghĩ rằng thực tế là tôi đã sử dụng hồi quy từng bước cho lựa chọn tính năng đã làm tăng mức quá mức này; với mục đích so sánh, trên một tập dữ liệu khác nhưng có liên quan, tôi đã so sánh một thói quen lựa chọn tính năng chuyển tiếp liên tục được thực hiện trước khi xác thực chéo với kết quả mà tôi đã đạt được trước đó với lựa chọn tính năng trong CV. Kết quả giữa cả hai phương pháp không khác nhau đáng kể. Điều này có thể có nghĩa là hồi quy từng bước có xu hướng bị quá mức hơn so với FS tuần tự hoặc có thể là một sự khập khiễng của bộ dữ liệu này.


7
Tôi không nghĩ rằng đó là (khá) những gì Hastie, et al. đang ủng hộ. Đối số chung là nếu lựa chọn tính năng sử dụng phản hồi thì tốt hơn nên đưa vào như một phần của quy trình CV của bạn. Nếu bạn thực hiện sàng lọc dự đoán, ví dụ, bằng cách xem xét các phương sai mẫu của chúng và loại trừ các yếu tố dự đoán với biến thể nhỏ, thì đó là một thủ tục một lần.
Đức hồng y

3
Tuy nhiên +1 ngay cả trong trường hợp này, xác thực chéo không thể hiện phương sai trong quy trình chọn tính năng, đây có thể là một vấn đề nếu lựa chọn tính năng không ổn định. Nếu bạn thực hiện sàng lọc trước thì độ biến thiên trong hiệu suất trong mỗi lần gấp sẽ thể hiện dưới mức biến thiên thực sự. Nếu bạn thực hiện sàng lọc trong mỗi lần gấp, nó sẽ tăng một cách thích hợp sự thay đổi trong hiệu suất trong mỗi lần gấp. Tôi vẫn luôn luôn thực hiện sàng lọc trong mỗi lần nếu tôi có thể chi trả chi phí tính toán.
Dikran Marsupial

1
Tôi nghĩ rằng tuyên bố "BẤT K select lựa chọn tính năng nào được thực hiện trước khi ước tính hiệu suất mô hình bằng cách sử dụng xác thực chéo có thể dẫn đến quá mức." là một sự hiểu sai hoặc diễn đạt sai về những gì Hastie và những người khác sẽ đề xuất. Nếu bạn thay đổi từ "trước" thành "mà không" thì cũng có nghĩa hơn. Ngoài ra, câu dường như cho thấy rằng xác thực chéo là cách duy nhất để kiểm tra tính hợp lý của các biến được chọn. Ví dụ, bootstrap có thể là một cách tiếp cận hợp pháp khác. .
Michael Chernick

@MichaelCécick - đồng ý. Tôi đã chỉnh sửa ở trên để phản ánh tốt hơn ý nghĩa của tôi.
BGreene

1
@Bgreene: có một cuộc thảo luận gần đây về vấn đề này có thể được đọc tại goo.gl/C8BUa .
Alekk

Câu trả lời:


69

Nếu bạn thực hiện lựa chọn tính năng trên tất cả các dữ liệu và sau đó xác thực chéo, thì dữ liệu thử nghiệm trong mỗi lần của quy trình xác thực chéo cũng được sử dụng để chọn các tính năng và đây là điều làm sai lệch phân tích hiệu suất.

Hãy xem xét ví dụ này. Chúng tôi tạo ra một số dữ liệu mục tiêu bằng cách lật một đồng xu 10 lần và ghi lại xem nó đi xuống dưới dạng đầu hay đuôi. Tiếp theo, chúng tôi tạo ra 20 tính năng bằng cách lật đồng xu 10 lần cho mỗi tính năng và viết ra những gì chúng tôi nhận được. Sau đó, chúng tôi thực hiện lựa chọn tính năng bằng cách chọn tính năng phù hợp với dữ liệu đích nhất có thể và sử dụng tính năng đó như dự đoán của chúng tôi. Nếu sau đó chúng tôi xác nhận chéo, chúng tôi sẽ nhận được tỷ lệ lỗi dự kiến ​​thấp hơn 0,5. Điều này là do chúng tôi đã chọn tính năng này trên cơ sở tương quan so với cả tập huấn luyện và tập kiểm tra trong mỗi lần của quy trình xác thực chéo. Tuy nhiên, tỷ lệ lỗi thực sự sẽ là 0,5 vì dữ liệu đích chỉ là ngẫu nhiên. Nếu bạn thực hiện lựa chọn tính năng một cách độc lập trong mỗi lần xác thực chéo, giá trị dự kiến ​​của tỷ lệ lỗi là 0.

Ý tưởng chính là xác thực chéo là một cách ước tính hiệu suất tổng quát hóa của một quy trình để xây dựng một mô hình, vì vậy bạn cần lặp lại toàn bộ quá trình trong mỗi lần. Nếu không, bạn sẽ kết thúc với một ước tính sai lệch, hoặc ước tính thấp về phương sai của ước tính (hoặc cả hai).

HTH

Dưới đây là một số mã MATLAB thực hiện mô phỏng Monte-Carlo của thiết lập này, với 56 tính năng và 259 trường hợp, để khớp với ví dụ của bạn, đầu ra mà nó đưa ra là:

Công cụ ước tính thiên vị: erate = 0.429210 (0.397683 - 0.451737)

Công cụ ước tính không thiên vị: erate = 0.499689 (0.397683 - 0.590734)

Công cụ ước tính thiên vị là công cụ lựa chọn tính năng được thực hiện trước khi xác thực chéo, công cụ ước tính không thiên vị là công cụ lựa chọn tính năng được thực hiện độc lập trong mỗi lần xác thực chéo. Điều này cho thấy sự thiên vị có thể khá nghiêm trọng trong trường hợp này, tùy thuộc vào bản chất của nhiệm vụ học tập.

NF    = 56;
NC    = 259;
NFOLD = 10;
NMC   = 1e+4;

% perform Monte-Carlo simulation of biased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform feature selection

   err       = mean(repmat(y,1,NF) ~= x);
   [err,idx] = min(err);

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, '  Biased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

% perform Monte-Carlo simulation of unbiased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      % perform feature selection

      err       = mean(repmat(y(partition~=j),1,NF) ~= x(partition~=j,:));
      [err,idx] = min(err);

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, 'Unbiased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

3
Cảm ơn bạn - điều này rất hữu ích. Nếu bạn thực hiện phương pháp đề xuất, làm thế nào để bạn đánh giá mô hình cuối cùng của bạn? Vì bạn sẽ có nhiều bộ tính năng, làm thế nào để bạn chọn bộ tính năng cuối cùng? Trong lịch sử, tôi cũng đã báo cáo kết quả dựa trên một xác nhận chéo duy nhất với các tham số mô hình và các tính năng được chọn.
BGreene

16
Tốt nhất là xem xác nhận chéo là đánh giá hiệu suất của một quy trình để phù hợp với một mô hình, chứ không phải là chính mô hình đó. Điều tốt nhất cần làm là thường thực hiện xác thực chéo như trên và sau đó xây dựng mô hình cuối cùng của bạn bằng cách sử dụng toàn bộ tập dữ liệu bằng cách sử dụng cùng một quy trình được sử dụng trong mỗi lần của quy trình xác thực chéo.
Dikran Marsupial

2
Trong trường hợp này, sau đó chúng tôi sẽ báo cáo kết quả phân loại dựa trên xác thực chéo (có thể có nhiều bộ tính năng khác nhau) nhưng chưa báo cáo mô hình chỉ chứa một trong các bộ tính năng đó, tức là kết quả phân loại được xác thực chéo không nhất thiết phải khớp với bộ tính năng?
BGreene

10
Về cơ bản là có, xác thực chéo chỉ ước tính hiệu suất dự kiến ​​của quy trình xây dựng mô hình, chứ không phải chính mô hình. Nếu bộ tính năng thay đổi rất nhiều từ một lần định giá chéo sang một giá trị khác, thì đó là dấu hiệu cho thấy lựa chọn tính năng không ổn định và có thể không có ý nghĩa lắm. Thông thường tốt nhất là sử dụng chính quy hóa (ví dụ hồi quy sườn) thay vì lựa chọn tính năng, đặc biệt nếu sau này không ổn định.
Dikran Marsupial

3
Đây là một bài quan trọng như vậy. Thật ngạc nhiên khi nhiều người không áp dụng điều này.
Chris A.

12

Để thêm một mô tả hơi khác và tổng quát hơn về vấn đề:

Nếu bạn thực hiện bất kỳ loại tiền xử lý dựa trên dữ liệu nào , vd

  1. tối ưu hóa tham số được hướng dẫn bởi xác thực chéo / out-of-bootstrap
  2. giảm kích thước với các kỹ thuật như PCA hoặc PLS để tạo đầu vào cho mô hình (ví dụ: PLS-LDA, PCA-LDA)
  3. ...

và muốn sử dụng xác thực chéo / xác thực chéo (/ giữ ngoài) để ước tính hiệu suất của mô hình cuối cùng , việc xử lý trước dựa trên dữ liệu cần phải được thực hiện trên dữ liệu đào tạo thay thế, tức là riêng cho từng mô hình thay thế.

Nếu quá trình tiền xử lý dựa trên dữ liệu thuộc loại 1., điều này dẫn đến xác thực chéo "kép" hoặc "lồng nhau": việc ước tính tham số được thực hiện trong xác thực chéo chỉ sử dụng tập huấn luyện xác thực chéo "bên ngoài". ElemStatLearn có hình minh họa ( https://web.stanford.edu/~hastie/Papers/ESLII.pdf Trang 222 của bản in 5).

Bạn có thể nói rằng tiền xử lý thực sự là một phần của việc xây dựng mô hình. chỉ xử lý trước được thực hiện

  • độc lập cho từng trường hợp hoặc
  • độc lập với tập dữ liệu thực tế

có thể được đưa ra khỏi vòng xác nhận để lưu các tính toán.

Vì vậy, ngược lại: nếu mô hình của bạn được xây dựng hoàn toàn bằng kiến ​​thức bên ngoài tập dữ liệu cụ thể (ví dụ: bạn quyết định trước bởi kiến ​​thức chuyên môn của mình rằng các kênh đo 63 - 79 có thể không thể giúp giải quyết vấn đề, tất nhiên bạn có thể loại trừ các kênh này , xây dựng mô hình và xác thực chéo nó. Tương tự, nếu bạn thực hiện hồi quy PLS và quyết định theo kinh nghiệm của bạn rằng 3 biến tiềm ẩn là một lựa chọn hợp lý (nhưng không chơi xung quanh việc 2 hoặc 5 lv cho kết quả tốt hơn) thì bạn có thể đi trước với một xác nhận ngoài bootstrap / chéo bình thường.


Thật không may, liên kết để in 5 cuốn sách ElemStatLearn không hoạt động. Tôi đã tự hỏi nếu hình minh họa bạn đang tham khảo vẫn còn trên cùng một trang. Hãy đề cập đến chú thích quá.
rraadd88

Vì vậy, nếu tôi có hai bộ dữ liệu, thực hiện lựa chọn / kỹ thuật trên một trong số chúng và CV ở bên kia, sẽ không có vấn đề gì?
Milos

1
@Milos: không, miễn là các tính năng đó trở thành tham số cố định cho các mô hình để xác thực chéo, điều đó sẽ ổn. Đây sẽ là một thế hệ giả thuyết thích hợp (= phát triển tính năng trên tập dữ liệu A) / kiểm tra giả thuyết (= đo hiệu suất của các tính năng hiện cố định với thiết lập tập dữ liệu B).
cbeleites

@cbeleites Vâng, đó là những gì tôi dự định làm. Xác định các tính năng trên A, sau đó sửa các tính năng đó và xác thực chéo cho các mô hình trên B. Cảm ơn. :)
Milos

@Milos: hãy lưu ý, mặc dù, rằng lập luận của mình để thực hiện đạt được thậm chí còn tốt hơn nếu bạn hoàn toàn đào tạo mô hình của bạn trên A và sau đó sử dụng B chỉ để thử nghiệm.
cbeleites

5

Hãy thử làm cho nó một chút trực quan. Xem xét ví dụ này: Bạn có một phụ thuộc nhị phân và hai yếu tố dự đoán nhị phân. Bạn muốn một mô hình chỉ với một dự đoán. Cả hai người dự đoán đều có cơ hội nói 95% tương đương với người phụ thuộc và cơ hội 5% không đồng ý với người phụ thuộc.

Bây giờ, tình cờ trên dữ liệu của bạn, một người dự đoán bằng với sự phụ thuộc vào toàn bộ dữ liệu trong 97% thời gian và người khác chỉ trong 93% thời gian. Bạn sẽ chọn công cụ dự đoán với 97% và xây dựng mô hình của bạn. Trong mỗi lần xác thực chéo, bạn sẽ có mô hình phụ thuộc = dự đoán, bởi vì nó hầu như luôn luôn đúng. Do đó, bạn sẽ nhận được hiệu suất dự đoán chéo là 97%.

Bây giờ, bạn có thể nói, ok đó chỉ là sự xui xẻo. Nhưng nếu các yếu tố dự đoán được xây dựng như trên thì bạn có thể có 75% trong số ít nhất một trong số chúng có độ chính xác> 95% trên toàn bộ tập dữ liệu và đó là thứ bạn sẽ chọn. Vì vậy, bạn có cơ hội 75% để đánh giá quá cao hiệu suất.

Trong thực tế, nó không phải là tầm thường để ước tính hiệu quả. Hoàn toàn có thể lựa chọn tính năng của bạn sẽ chọn các tính năng tương tự trong mỗi lần như thể bạn đã thực hiện trên toàn bộ tập dữ liệu và sau đó sẽ không có sai lệch. Hiệu ứng cũng trở nên nhỏ hơn nếu bạn có nhiều mẫu hơn nhưng tính năng. Có thể được khuyến khích sử dụng cả hai cách với dữ liệu của bạn và xem kết quả khác nhau như thế nào.

Bạn cũng có thể dành một lượng dữ liệu (giả sử 20%), sử dụng cả cách của bạn và cách chính xác để có được ước tính hiệu suất bằng cách xác thực chéo trên 80% và xem dự đoán hiệu suất nào chứng minh chính xác hơn khi bạn chuyển mô hình của mình sang 20 % dữ liệu được đặt sang một bên. Lưu ý rằng để làm việc này, lựa chọn tính năng của bạn trước CV cũng sẽ phải được thực hiện chỉ với 80% dữ liệu. Khác nó sẽ không mô phỏng chuyển mô hình của bạn sang dữ liệu bên ngoài mẫu của bạn.


Bạn có thể giải thích rõ hơn về cách thực hiện lựa chọn tính năng chính xác với ví dụ trực quan của bạn không? Cảm ơn bạn.
uared1776
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.