Codificação e validação cruzada
Recentemente, tenho pensado sobre o uso adequado da codificação no esquema de validação cruzada. A maneira normalmente recomendada de codificar recursos é:
- Divida os dados em conjunto de treinamento e teste (resistência)
- Encaixe o codificador (
LabelEncoder
ouOneHotEncoder
) no conjunto de trem - Transforme o trem e o conjunto de teste usando o codificador instalado.
Esta forma é reivindicada para prevenir qualquer vazamento de dados. No entanto, isso parece ser frequentemente omitido durante a validação cruzada. Vamos supor que estou realizando validação cruzada no conjunto de trens mencionado anteriormente. Se eu codificar o conjunto de trens e executar a validação cruzada, isso realmente não imitará as etapas acima. A codificação não deveria ser realizada "dentro" da validação cruzada, então? Por exemplo, supondo que realizemos uma validação cruzada de 5 vezes, não deveríamos ajustar o codificador em 4 dobras e transformar na 5ª dobra em cada etapa de validação cruzada? Eu acredito que é o que geralmente é feito na codificação de destino, mas não realmente com a codificação de rótulo ou one-hot.
Portanto, minhas perguntas são:
- Estou certo sobre a necessidade de ajustar o codificador em 4 dobras e não na 5ª dobra de validação em cada etapa de validação cruzada se realmente quisermos evitar o sobreajuste?
- Se não, por que é realmente necessário executar todas as 3 etapas mencionadas antes ao lidar com o conjunto de treinamento e teste (espera)?
Respostas
Você está certo, a própria etapa de codificação pode ser uma fonte de vazamento de dados e normalmente deve ser feita dentro do loop CV usando apenas o conjunto de treinamento atual, como você descreve.
O motivo é de fato aquele que você mencionou no comentário: se houver um rótulo de classe ou uma categoria de recurso que não aparece por acaso em um determinado conjunto de treinamento durante o CV, o modelo não deve saber que esta classe / categoria mesmo existe.
Em geral, acho que esse problema só pode diminuir o desempenho no conjunto de teste, então provavelmente não é tão sério quanto outros tipos de vazamento de dados. Ainda assim, é definitivamente um design experimental mais limpo para codificar usando apenas o conjunto de treinamento.
Um problema intimamente relacionado na PNL é quando o sistema não é projetado para lidar com palavras fora do vocabulário (OOV): se todas as palavras no conjunto de treinamento e teste estão codificadas (mesmo erro), então parece erroneamente como se qualquer texto pode ser totalmente codificado, potencialmente causando surpresas ruins mais tarde.
Dito isso, geralmente é uma boa ideia descartar recursos raros ou valores de rótulo e, se isso for feito, o resultado deve ser o mesmo usando o método apropriado ou o método desleixado.