Codificação e validação cruzada

Aug 18 2020

Recentemente, tenho pensado sobre o uso adequado da codificação no esquema de validação cruzada. A maneira normalmente recomendada de codificar recursos é:

  1. Divida os dados em conjunto de treinamento e teste (resistência)
  2. Encaixe o codificador ( LabelEncoderou OneHotEncoder) no conjunto de trem
  3. 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:

  1. 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?
  2. 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

1 Erwan Aug 18 2020 at 07:50

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.