Pemilihan fitur dan validasi silang

76

Saya baru-baru ini banyak membaca di situs ini (@Aniko, @Dikran Marsupial, @Erik) dan di tempat lain tentang masalah overfitting yang terjadi dengan validasi silang - (Smialowski dkk 2010 Bioinformatika, Hastie, Elemen pembelajaran statistik). Sarannya adalah bahwa setiap pemilihan fitur yang diawasi (menggunakan korelasi dengan label kelas) dilakukan di luar estimasi kinerja model menggunakan validasi silang (atau metode estimasi model lainnya seperti bootstrap) dapat mengakibatkan overfitting.

Ini tampaknya tidak intuitif bagi saya - tentu saja jika Anda memilih set fitur dan kemudian mengevaluasi model Anda hanya menggunakan fitur yang dipilih menggunakan validasi silang, maka Anda mendapatkan estimasi yang tidak bias dari kinerja model umum pada fitur-fitur tersebut (ini mengasumsikan sampel yang diteliti adalah representatif populasi)?

Dengan prosedur ini seseorang tentu saja tidak dapat mengklaim set fitur optimal tetapi dapatkah seseorang melaporkan kinerja fitur yang dipilih pada data yang tidak terlihat sebagai valid?

Saya menerima bahwa memilih fitur berdasarkan seluruh set data dapat muncul kembali dalam beberapa kebocoran data antara set tes dan kereta. Tetapi jika set fitur statis setelah pemilihan awal, dan tidak ada penyetelan lain yang dilakukan, tentu valid untuk melaporkan metrik kinerja yang divalidasi silang?

Dalam kasus saya, saya memiliki 56 fitur dan 259 kasus dan #cases> #features. Fitur tersebut berasal dari data sensor.

Mohon maaf jika pertanyaan saya tampaknya turunan tetapi ini sepertinya poin penting untuk diklarifikasi.

Sunting: Pada penerapan pemilihan fitur dalam validasi silang pada kumpulan data yang dirinci di atas (berkat jawaban di bawah), saya dapat mengonfirmasi bahwa memilih fitur sebelum validasi silang dalam rangkaian data ini memperkenalkan signifikanbias. Bias / overfitting ini paling baik ketika melakukannya untuk formulasi 3-kelas, dibandingkan dengan formulasi 2-kelas. Saya pikir fakta bahwa saya menggunakan regresi bertahap untuk pemilihan fitur meningkatkan overfitting ini; untuk tujuan perbandingan, pada set data yang berbeda namun terkait I membandingkan rutin pemilihan fitur forward sequential forward yang dilakukan sebelum validasi silang terhadap hasil yang sebelumnya saya dapatkan dengan pemilihan fitur dalam CV. Hasil antara kedua metode tidak berbeda secara dramatis. Ini mungkin berarti bahwa regresi bertahap lebih rentan terhadap overfitting daripada FS berurutan atau mungkin merupakan kekhasan dari kumpulan data ini.

BGreene
sumber
7
Saya tidak berpikir itu (cukup) apa yang Hastie, et al. mengadvokasi. Argumen umum adalah bahwa jika pemilihan fitur menggunakan respons maka lebih baik dimasukkan sebagai bagian dari prosedur CV Anda. Jika Anda melakukan penyaringan prediktor, misalnya, dengan melihat varians sampel mereka dan mengecualikan prediktor dengan variasi kecil, itu ok sebagai prosedur sekali pakai.
kardinal
3
Namun +1 bahkan dalam kasus ini validasi silang tidak mewakili varians dalam proses pemilihan fitur, yang mungkin menjadi masalah jika pemilihan fitur tidak stabil. Jika Anda melakukan penyaringan terlebih dahulu maka variabilitas dalam kinerja di setiap lipatan akan kurang mewakili variabilitas yang sebenarnya. Jika Anda melakukan penyaringan di setiap lipatan, maka akan meningkatkan variabilitas kinerja di setiap lipatan dengan tepat. Saya masih selalu melakukan penyaringan di setiap lipatan jika saya mampu membayar biaya komputasi.
Dikran Marsupial
1
Saya pikir pernyataan "SETIAP pemilihan fitur yang dilakukan sebelum model estimasi kinerja menggunakan validasi silang dapat mengakibatkan overfitting." adalah kutipan salah atau representasi yang keliru dari apa yang akan disarankan oleh Hastie dan yang lainnya. Jika Anda mengubah kata "sebelum 'menjadi" tanpa "itu lebih masuk akal. Selain itu, kalimat itu sepertinya menyarankan bahwa validasi silang adalah satu-satunya cara untuk secara sah menguji ketepatan variabel yang dipilih. Bootstrap misalnya mungkin merupakan pendekatan lain yang sah .
Michael Chernick
@MichaelChernick - setuju. Saya telah mengedit di atas untuk lebih mencerminkan makna saya.
BGreene
1
@Bgreene: ada diskusi terbaru tentang masalah ini yang dapat dibaca di goo.gl/C8BUa .
Alekk

Jawaban:

69

Jika Anda melakukan pemilihan fitur pada semua data dan kemudian melakukan validasi silang, maka data uji di setiap lipatan prosedur validasi silang juga digunakan untuk memilih fitur dan inilah yang bias analisis kinerja.

Pertimbangkan contoh ini. Kami menghasilkan beberapa data target dengan membalik koin 10 kali dan merekam apakah itu jatuh sebagai kepala atau ekor. Selanjutnya kita menghasilkan 20 fitur dengan membalik koin 10 kali untuk setiap fitur dan menuliskan apa yang kita dapatkan. Kami kemudian melakukan pemilihan fitur dengan memilih fitur yang sesuai dengan data target semaksimal mungkin dan menggunakannya sebagai prediksi kami. Jika kami kemudian melakukan validasi silang, kami akan mendapatkan tingkat kesalahan yang diharapkan sedikit lebih rendah dari 0,5. Ini karena kami telah memilih fitur berdasarkan korelasi pada set pelatihan dan set tes di setiap lipatan prosedur validasi silang. Namun tingkat kesalahan sebenarnya adalah 0,5 karena data target hanya acak. Jika Anda melakukan pemilihan fitur secara independen dalam setiap lipatan validasi silang, nilai yang diharapkan dari tingkat kesalahan adalah 0.

Gagasan utamanya adalah bahwa validasi silang adalah cara memperkirakan kinerja generalisasi dari suatu proses untuk membangun model, jadi Anda perlu mengulangi seluruh proses di setiap lipatan. Kalau tidak, Anda akan berakhir dengan estimasi yang bias, atau estimasi yang kurang dari varian estimasi (atau keduanya).

HTH

Berikut adalah beberapa kode MATLAB yang melakukan simulasi Monte-Carlo dari pengaturan ini, dengan 56 fitur dan 259 kasus, untuk mencocokkan contoh Anda, output yang diberikan adalah:

Penaksir yang bias: erate = 0,429210 (0,397683 - 0,451737)

Estimator tidak berdasar: erate = 0,499689 (0,397683 - 0,590734)

Estimator yang bias adalah yang di mana pemilihan fitur dilakukan sebelum validasi silang, estimator yang tidak bias adalah yang di mana pemilihan fitur dilakukan secara independen di setiap lipatan validasi silang. Ini menunjukkan bahwa bias bisa sangat parah dalam kasus ini, tergantung pada sifat tugas pembelajaran.

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)));
Dikran Marsupial
sumber
3
Terima kasih - ini sangat membantu. Jika Anda mengambil pendekatan yang disarankan, bagaimana Anda kemudian mengevaluasi model akhir Anda? Karena Anda akan memiliki beberapa set fitur, bagaimana Anda memilih set fitur akhir? Secara historis saya juga melaporkan hasil berdasarkan validasi silang tunggal dengan parameter model dan fitur yang dipilih.
BGreene
16
Cara terbaik untuk melihat validasi silang adalah menilai kinerja suatu prosedur untuk pemasangan model, daripada model itu sendiri. Hal terbaik untuk dilakukan adalah melakukan validasi silang seperti di atas, dan kemudian membangun model akhir Anda menggunakan seluruh dataset menggunakan prosedur yang sama yang digunakan di setiap lipatan prosedur validasi silang.
Dikran Marsupial
2
Dalam hal ini apakah kita kemudian melaporkan hasil klasifikasi berdasarkan cross-validation (berpotensi banyak set fitur yang berbeda) tetapi belum melaporkan model yang hanya berisi satu dari set fitur tersebut, yaitu hasil klasifikasi yang divalidasi silang tidak selalu cocok dengan set fitur?
BGreene
10
Pada dasarnya ya, validasi silang hanya memperkirakan kinerja yang diharapkan dari proses pembuatan model, bukan model itu sendiri. Jika set fitur sangat bervariasi dari satu lipatan cross-valdidation ke yang lain, itu merupakan indikasi bahwa pemilihan fitur tidak stabil dan mungkin tidak terlalu berarti. Seringkali yang terbaik adalah menggunakan regularisasi (misalnya regresi ridge) daripada pemilihan fitur, terutama jika yang terakhir tidak stabil.
Dikran Marsupial
3
Ini adalah pos yang sangat penting. Hebat berapa banyak yang tidak menerapkan ini.
Chris A.
12

Untuk menambahkan deskripsi masalah yang sedikit berbeda dan lebih umum:

Jika Anda melakukan segala jenis pra-pemrosesan yang didorong data , mis

  1. optimasi parameter dipandu oleh validasi silang / out-of-bootstrap
  2. pengurangan dimensi dengan teknik seperti PCA atau PLS untuk menghasilkan input untuk model (mis. PLS-LDA, PCA-LDA)
  3. ...

dan ingin menggunakan validasi silang / out-of-bootstrap (/ tahan) untuk memperkirakan kinerja model akhir , pra-pemrosesan yang didorong data perlu dilakukan pada data pelatihan pengganti, yaitu secara terpisah untuk setiap model pengganti.

Jika pra-pemrosesan yang digerakkan oleh data adalah tipe 1., ini mengarah pada validasi silang "ganda" atau "bersarang": estimasi parameter dilakukan dalam validasi silang menggunakan hanya set pelatihan validasi silang "luar". ElemStatLearn memiliki ilustrasi ( https://web.stanford.edu/~hastie/Papers/ESLII.pdf Halaman 222 dari cetak 5).

Anda dapat mengatakan bahwa pra-pemrosesan benar-benar merupakan bagian dari pembangunan model. hanya pra-pemrosesan yang dilakukan

  • secara independen untuk setiap kasus atau
  • terlepas dari kumpulan data aktual

dapat dikeluarkan dari loop validasi untuk menyimpan perhitungan.

Jadi sebaliknya: jika model Anda benar-benar dibangun oleh pengetahuan eksternal ke set data tertentu (misalnya Anda memutuskan sebelumnya dengan pengetahuan ahli Anda bahwa saluran pengukuran 63 - 79 tidak mungkin membantu menyelesaikan masalah, Anda tentu saja dapat mengecualikan saluran ini , membangun model dan cross-memvalidasi. hal yang sama, jika Anda melakukan regresi PLS dan memutuskan dengan pengalaman Anda bahwa 3 variabel laten adalah pilihan yang wajar (tapi jangan tidak bermain-main apakah 2 atau 5 lv memberikan hasil yang lebih baik) maka Anda dapat lanjutkan dengan validasi out-of-bootstrap / cross normal.

cbeleites
sumber
Sayangnya tautan untuk cetak 5 dari buku ElemStatLearn tidak berfungsi. Saya bertanya-tanya apakah ilustrasi yang Anda maksudkan masih di halaman yang sama. Tolong sebutkan keterangannya juga.
rraadd88
Jadi, jika saya memiliki dua set data, apakah pemilihan fitur / rekayasa pada salah satu dari mereka, dan CV pada yang lain, tidak akan ada masalah?
Milos
1
@ Milos: tidak, selama fitur tersebut menjadi parameter tetap untuk model untuk validasi silang, itu harus OK. Ini akan menjadi pembuatan hipotesis yang tepat (= pengembangan fitur pada set data A) / pengujian hipotesis (= mengukur kinerja fitur yang sekarang diperbaiki dengan set data B).
cbeleites
@cbeleites Ya, itulah yang ingin saya lakukan. Tentukan fitur pada A, lalu perbaiki fitur tersebut dan lakukan validasi silang untuk model pada B. Terima kasih. :)
Milos
@ Milos: perlu diingat, bahwa argumen Anda untuk kinerja yang dicapai bahkan lebih baik jika Anda sepenuhnya melatih model Anda pada A dan kemudian gunakan B hanya untuk pengujian.
cbeleites
5

Mari kita coba membuatnya sedikit intuitif. Pertimbangkan contoh ini: Anda memiliki prediksi biner dan dua biner. Anda menginginkan model dengan hanya satu prediktor. Kedua prediktor memiliki peluang untuk mengatakan 95% sama dengan dependen dan peluang 5% tidak setuju dengan dependen.

Sekarang, secara kebetulan pada data Anda, satu prediktor sama dengan ketergantungan pada seluruh data dalam 97% waktu dan yang lain hanya pada 93% waktu. Anda akan memilih prediktor dengan 97% dan membangun model Anda. Di setiap lipatan validasi silang Anda akan memiliki model dependen = prediktor, karena hampir selalu benar. Oleh karena itu Anda akan mendapatkan prediksi kinerja lintas 97%.

Sekarang, bisa dibilang, ok itu cuma sial. Tetapi jika prediktor dibuat seperti di atas maka Anda memiliki peluang 75% dari setidaknya satu dari mereka memiliki akurasi> 95% pada seluruh kumpulan data dan itu adalah yang akan Anda pilih. Jadi, Anda memiliki peluang 75% untuk melebih-lebihkan kinerja.

Dalam praktiknya, sama sekali tidak sepele untuk memperkirakan efeknya. Sangat mungkin bahwa pemilihan fitur Anda akan memilih fitur yang sama di setiap lipatan seolah-olah Anda melakukannya pada seluruh kumpulan data dan kemudian tidak akan ada bias. Efeknya juga menjadi lebih kecil jika Anda memiliki lebih banyak sampel tetapi fitur. Mungkin bermanfaat untuk menggunakan kedua cara dengan data Anda dan melihat bagaimana hasilnya berbeda.

Anda juga dapat menyisihkan sejumlah data (katakanlah 20%), gunakan cara Anda dan cara yang benar untuk mendapatkan perkiraan kinerja dengan memvalidasi silang pada 80% dan melihat prediksi kinerja mana yang terbukti lebih akurat ketika Anda mentransfer model Anda ke 20 % dari data yang disisihkan. Perhatikan bahwa agar ini berfungsi pemilihan fitur Anda sebelum CV juga harus dilakukan hanya pada 80% dari data. Jika tidak, ini tidak akan mensimulasikan transfer model Anda ke data di luar sampel Anda.

Erik
sumber
Bisakah Anda menguraikan lebih lanjut tentang cara yang benar dalam melakukan pemilihan fitur dengan contoh intuitif Anda? Terima kasih.
uared1776