Enkode dan validasi silang
Baru-baru ini saya memikirkan tentang penggunaan yang tepat dari pengkodean dalam skema validasi silang. Cara pengkodean fitur yang biasanya disarankan adalah:
- Bagi data menjadi set latihan dan uji (tahan)
- Pasangkan pembuat enkode (baik
LabelEncoder
atauOneHotEncoder
) di set kereta - Transformasikan rangkaian rangkaian dan pengujian menggunakan encoder yang dipasang.
Cara ini diklaim dapat mencegah kebocoran data. Namun, hal ini tampaknya sering diabaikan selama validasi silang. Misalkan saya melakukan validasi silang pada set kereta yang disebutkan di atas. Jika saya mengenkode rangkaian kereta lalu melakukan validasi silang, itu tidak benar-benar meniru langkah-langkah di atas. Bukankah seharusnya pengkodean dilakukan "dalam" validasi silang? Misalnya, dengan asumsi bahwa kita melakukan validasi silang 5 kali lipat, bukankah kita harus memasukkan pembuat enkode pada 4 lipatan dan mentransformasikannya pada paruh ke-5 di setiap langkah validasi silang? Saya percaya itu adalah apa yang biasanya dilakukan dalam pengkodean target, tetapi tidak benar-benar dengan label atau pengkodean one-hot.
Oleh karena itu, pertanyaan saya adalah:
- Apakah saya benar tentang keharusan untuk memasukkan encoder pada 4 lipatan dan bukan pada lipatan validasi ke-5 di setiap langkah validasi silang jika kita benar-benar ingin mencegah overfitting?
- Jika tidak, mengapa sangat penting untuk melakukan semua 3 langkah yang disebutkan sebelumnya saat menangani rangkaian latihan dan pengujian (tahan)?
Jawaban
Anda benar, langkah encoding itu sendiri dapat menjadi sumber kebocoran data dan biasanya harus dilakukan di dalam loop CV hanya menggunakan set pelatihan saat ini, seperti yang Anda jelaskan.
Alasannya memang seperti yang Anda sebutkan di komentar: jika ada label kelas atau kategori fitur yang tidak muncul secara kebetulan dalam set pelatihan tertentu selama CV, model tersebut tidak seharusnya mengetahui bahwa kelas / kategori ini bahkan ada.
Secara umum saya akan berpikir bahwa masalah ini hanya dapat menurunkan kinerja pada set pengujian, jadi mungkin tidak seserius jenis kebocoran data lainnya. Namun, itu jelas merupakan desain eksperimental yang lebih bersih untuk dikodekan hanya dengan menggunakan set pelatihan.
Masalah terkait erat di NLP adalah ketika sistem tidak dirancang untuk menangani kata-kata di luar kosakata (OOV): jika semua kata dalam set pelatihan dan pengujian dikodekan (kesalahan yang sama), maka itu salah terlihat seolah-olah teks apa pun dapat sepenuhnya dikodekan, berpotensi menyebabkan kejutan buruk di kemudian hari.
Karena itu, biasanya ide yang baik untuk membuang fitur langka atau nilai label, dan jika ini dilakukan maka hasilnya harus sama dengan menggunakan metode yang tepat atau yang ceroboh.