Codifica e convalida incrociata
Recentemente ho pensato al corretto utilizzo della codifica all'interno di schemi di convalida incrociata. Il modo solitamente consigliato per codificare le caratteristiche è:
- Suddividi i dati in set di training e test (hold-out)
- Montare l'encoder (o
LabelEncoder
oOneHotEncoder
) sul treno - Trasforma sia il treno che il set di prova utilizzando l'encoder montato.
In questo modo viene richiesto di prevenire qualsiasi perdita di dati. Tuttavia, questo sembra essere spesso omesso durante la convalida incrociata. Supponiamo che io esegua la convalida incrociata sul suddetto set di treni. Se codifico il set di treni e quindi eseguo la convalida incrociata, in realtà non imita i passaggi precedenti. La codifica non dovrebbe quindi essere eseguita "all'interno" della convalida incrociata? Ad esempio, supponendo di eseguire 5 volte la convalida incrociata, non dovremmo adattare il codificatore su 4 volte e trasformare in 5 volte in ogni passaggio di convalida incrociata? Credo che sia ciò che di solito si fa nella codifica di destinazione, ma non proprio con l'etichetta o la codifica one-hot.
Le mie domande quindi sono:
- Ho ragione sulla necessità di adattare il codificatore su 4 pieghe e non sulla 5a piega di convalida in ogni fase di convalida incrociata se vogliamo davvero prevenire l'overfitting?
- In caso contrario, perché è davvero necessario eseguire tutti e 3 i passaggi menzionati prima mentre si ha a che fare con il set di training e test (hold-out)?
Risposte
Hai ragione, il passaggio di codifica stesso può essere una fonte di fuga di dati e normalmente dovrebbe essere fatto all'interno del ciclo CV utilizzando solo il set di addestramento corrente, come descrivi.
Il motivo è proprio quello che hai menzionato nel commento: se c'è un'etichetta di classe o una categoria di caratteristiche che non compare per caso in un particolare set di formazione durante il CV, il modello non dovrebbe sapere che questa classe / categoria esiste.
In generale, penso che questo problema possa solo ridurre le prestazioni sul set di test, quindi probabilmente non è così grave come altri tipi di perdita di dati. Tuttavia, è sicuramente un design sperimentale più pulito da codificare utilizzando solo il set di addestramento.
Un problema strettamente correlato in PNL è quando il sistema non è progettato per gestire parole fuori dal vocabolario (OOV): se tutte le parole sia nel training che nel test sono codificate (stesso errore), allora sembra erroneamente che qualsiasi testo può essere completamente codificato, causando potenzialmente brutte sorprese in seguito.
Detto questo, di solito è una buona idea scartare caratteristiche rare o valori di etichetta, e se ciò viene fatto, il risultato dovrebbe essere lo stesso utilizzando il metodo corretto o quello sciatto.