Come si utilizza il set di dati "test" dopo la convalida incrociata?


25

In alcune lezioni ed esercitazioni che ho visto, suggeriscono di dividere i dati in tre parti: formazione, convalida e test. Ma non è chiaro come utilizzare il set di dati di test, né come questo approccio sia migliore della convalida incrociata sull'intero set di dati.

Supponiamo di aver salvato il 20% dei nostri dati come set di test. Quindi prendiamo il resto, lo dividiamo in k fold e, usando la validazione incrociata, troviamo il modello che fa la migliore previsione su dati sconosciuti da questo set di dati. Diciamo che il miglior modello che abbiamo trovato ci offre una precisione del 75% .

Diversi tutorial e molte domande su vari siti Web di domande e risposte affermano che ora possiamo verificare il nostro modello su un set di dati (test) salvato. Ma non riesco ancora a capire esattamente come viene fatto, né che senso abbia.

Supponiamo di avere un'accuratezza del 70% sul set di dati di test. Quindi cosa facciamo dopo? Proviamo un altro modello, e poi un altro, fino a quando non avremo un punteggio elevato nel nostro set di dati di test? Ma in questo caso sembra davvero che troveremo il modello adatto al nostro set di test limitato (solo il 20%) . Ciò non significa che troveremo il modello che è il migliore in generale.

Inoltre, come possiamo considerare questo punteggio come una valutazione generale del modello, se viene calcolato solo su un set di dati limitato? Se questo punteggio è basso, forse siamo stati sfortunati e abbiamo selezionato dati di test "cattivi".

D'altra parte, se usiamo tutti i dati che abbiamo e quindi scegliamo il modello usando la validazione incrociata di k-fold, troveremo il modello che fa la migliore previsione su dati sconosciuti dall'intero set di dati che abbiamo.


1
Valuta il tuo modello migliore su quel set di test e riporta le prestazioni su di esso. È la tua migliore stima delle prestazioni del tuo modello. Ti consiglio di leggere i primi due capitoli dell'eccellente libro "Imparare dai dati" di Yaser Abu-Mostafa. Molto succinto e molto accessibile. work.caltech.edu/telecourse.html
Vladislavs Dovgalecs

1
Grazie per il libro che hai suggerito! Ma per quanto riguarda la tua risposta alla domanda: dici che è la "migliore stima delle prestazioni del tuo modello", ma in realtà è la stima delle prestazioni di un modello su un piccolo set di test (20%) , non lo fa indica il modello la prestazione in generale.
Serhiy,

2
In realtà è la migliore stima delle prestazioni del modello in generale. Il modello potrebbe essere distorto e / o soffrire di un'elevata varianza, ma le prestazioni del modello sul set di test sono l'indicatore migliore come si comporterebbe su qualsiasi dato non visto.
Vladislavs Dovgalecs,

Grazie xeon! L'unica cosa che non mi è ancora chiara è cosa facciamo dopo aver valutato il modello utilizzando il set di dati di test ?
Serhiy,

Spedisci il modello se sei soddisfatto dei risultati o trovi caratteristiche / algoritmo / dati migliori per migliorare il modello.
Vladislavs Dovgalecs,

Risposte:


20

È simile a un'altra domanda a cui ho risposto in merito alla convalida incrociata e ai set di test . Il concetto chiave da comprendere qui sono set di dati indipendenti . Considera solo due scenari:

  1. Se disponi di molte risorse, dovresti raccogliere idealmente un set di dati e formare il tuo modello tramite la convalida incrociata. Quindi dovresti raccogliere un altro set di dati completamente indipendente e testare il tuo modello. Tuttavia, come ho detto prima, questo di solito non è possibile per molti ricercatori.

Ora, se sono un ricercatore che non è così fortunato cosa devo fare? Bene, puoi provare a imitare quello scenario esatto:

  1. Prima di eseguire qualsiasi training modello, prendi una suddivisione dei tuoi dati e li lasci da parte ( mai toccati durante la validazione incrociata ). Questo per simulare lo stesso set di dati indipendente menzionato nello scenario ideale sopra. Anche se proviene dallo stesso set di dati, l'addestramento del modello non prenderà alcuna informazione da quei campioni (dove con la validazione incrociata vengono utilizzati tutti i dati). Una volta addestrato il modello, lo applicheresti al tuo set di test , ancora una volta che non è mai stato visto durante l'allenamento, e otterrai i risultati. Questo viene fatto per assicurarsi che il tuo modello sia più generalizzabile e non abbia appena appreso i tuoi dati.

Per rispondere alle altre tue preoccupazioni:

Supponiamo di avere un'accuratezza del 70% sul set di dati di test, quindi cosa facciamo dopo? Proviamo un altro modello e poi un altro fino a quando non avremo un punteggio elevato sul nostro set di dati di test?

In un certo senso, l'idea è che stai creando il miglior modello possibile dai tuoi dati e quindi valutandolo su alcuni altri dati che non ha mai visto prima. Puoi rivalutare il tuo schema di convalida incrociata ma una volta che hai un modello sintonizzato (cioè i parametri ipertestuali) stai andando avanti con quel modello perché era il meglio che potevi fare. La chiave è di NON UTILIZZARE MAI I DATI DI PROVA PER LA SINTONIA . Il risultato dei dati del test è la prestazione del modello su dati "generali". La replica di questo processo eliminerebbe l'indipendenza dei set di dati (che era l'intero punto). Questo è anche l'indirizzo in un'altra domanda sui dati di test / validazione .

Inoltre, come possiamo considerare questo punteggio come una valutazione generale del modello, se viene calcolato su un set di dati limitato? Se questo punteggio è basso, forse siamo stati sfortunati a selezionare dati di test "cattivi".

Questo è improbabile se hai diviso correttamente i tuoi dati. Dovresti dividere i dati in modo casuale (anche se potenzialmente stratificato per il bilanciamento delle classi). Se il set di dati è abbastanza grande da dividere i dati in tre parti, il sottoinsieme di test dovrebbe essere abbastanza grande da avere una probabilità molto bassa di scegliere solo dati errati. È più probabile che il tuo modello sia stato indossato troppo.


3
Grazie per una spiegazione così dettagliata! L'unica cosa che non mi è ancora chiara è cosa facciamo dopo aver valutato il modello utilizzando il set di dati di test ? E se il risultato è davvero basso? Proviamo un altro modello?
Serhiy,

Come ho detto sopra, puoi rivalutare la tua convalida incrociata e vedere se il tuo metodo può essere migliorato fintanto che non usi i tuoi dati di "test" per l'addestramento del modello. Se il risultato è basso, è probabile che tu abbia adattato troppo il tuo modello. Il tuo set di dati potrebbe avere solo un così grande potere predittivo.
cdeterman,

La validazione incrociata non si divide semplicemente ripetutamente in training e set di test (ad esempio il set di test è il primo 20%, quindi il secondo 20%, quindi il terzo e così via, oppure tutti selezionano casualmente il 20% per il test n volte e calcolano l'accuratezza media) e facendo esattamente la stessa cosa, che descrivi facendo con il set di test? Non lo mostra affatto all'algoritmo fino al test?
Zelphir Kaltstahl,

2
@Zelphir no, ogni piega viene valutata più volte con ciascuna combinazione di iperparametro. La semplice scelta del risultato migliore può riportare risultati più elevati rispetto a un set di test "indipendente". L'idea è di vedere quali parametri si generalizzano attraverso queste pieghe e usare quell'architettura su un set di test che non ha mai visto per determinare quanto sia "generalizzabile" il modello.
cdeterman,

1
Voglio aggiungere che in realtà l'atto di guardare le prestazioni sul tuo set di test indipendente e decidere di tornare indietro e riqualificare il tuo modello rende il tuo set di test non più completamente indipendente . In effetti, potresti farlo all'infinito molte volte fino a ottenere una precisione perfetta. Per quanto riguarda il riferimento accademico, raccomando il libro "Imparare dai dati", c'è anche un corso online gratuito dell'autore ( work.caltech.edu/telecourse.html ).
Michael,

4

Se tutto ciò che farai è addestrare un modello con impostazioni predefinite sul set di dati non elaborati o minimamente preelaborati (ad es. Codifica a caldo e / o rimozione di NA), non hai bisogno di un set di test separato, puoi semplicemente allenarti sul tuo allena il set e testa il tuo set di validazione, o ancora meglio, allena l'intero set usando la validazione incrociata per stimare le tue prestazioni.

Tuttavia, non appena la tua conoscenza dei dati ti porta ad apportare modifiche alla tua strategia originale, ora hai "contaminato" il tuo risultato. Alcuni esempi includono:

  • Scelta del modello: hai testato la logistica, il lazo, la foresta casuale, XGBoost e hai supportato macchine vettoriali e hai scelto il modello migliore

  • Ottimizzazione dei parametri: hai sintonizzato un XGBoost per trovare gli iperparametri ottimali

  • Selezione funzionalità: hai utilizzato la selezione all'indietro, l'algoritmo genetico, la boruta, ecc. Per scegliere un sottoinsieme ottimale di funzioni da includere nel modello

  • Imputazione mancante: hai imputato le variabili mancanti con la media o con un modello semplice basato sulle altre variabili

  • Trasformazione delle caratteristiche: hai centrato e ridimensionato le tue variabili numeriche per sostituirle con un punteggio z (numero di deviazioni standard dalla media)

In tutti i casi di cui sopra, l'utilizzo di un singolo set di controllo, o persino la convalida incrociata, non ti fornirà una stima realistica delle prestazioni del mondo reale perché stai utilizzando informazioni che non avrai su dati futuri nelle tue decisioni. Invece, stai scegliendo il miglior modello, i migliori iperparametri, il miglior set di funzionalità, ecc. Per i tuoi dati, e probabilmente sarai leggermente "troppo adatto" alla tua strategia per i tuoi dati. Per ottenere una stima onesta delle prestazioni del mondo reale, è necessario assegnarle un punteggio ai dati che non sono entrati nel processo decisionale, quindi la pratica comune di utilizzare un set di test indipendente separato dall'allenamento (modellazione) e dalla convalida ( selezionando un modello, caratteristiche, iperparametri, ecc.) set.

In alternativa alla tenuta di un set di test, è possibile invece utilizzare una tecnica chiamata convalida incrociata nidificata. Ciò richiede di codificare l'intera strategia di modellazione (trasformazione, imputazione, selezione delle caratteristiche, selezione del modello, ottimizzazione dell'iperparametro) come una funzione non parametrica e quindi eseguire la convalida incrociata sull'intera funzione come se fosse semplicemente una funzione di adattamento del modello. Questo è difficile da fare nella maggior parte dei pacchetti ML, ma può essere implementato abbastanza facilmente in R con il pacchetto mlr usando i wrapper per definire la tua strategia di allenamento e quindi ricampionando il tuo studente avvolto:

https://mlr.mlr-org.com/articles/tutorial/nested_resampling.html


1

Suppongo che stai facendo la classificazione.

Prendi i tuoi dati e li divide in 70/30 in sottoinsiemi di TrainingData / testData. Prendere il sottoinsieme trainingData e dividerlo nuovamente 70/30 in sottoinsiemi trainingData / validateData. Ora hai 3 sottoinsiemi dei tuoi dati originali: trainingData (.7 * .7), validateData (.7 * .3) e testData (.3).

Addestra il tuo modello con trainingData. Quindi, controlli le prestazioni di quel modello usando validateData, che possiamo considerare indipendente dall'addestramento dei dati e quindi una buona valutazione di come il modello si sta generalizzando. Facciamo finta di ottenere una precisione del 75%.

Ora riqualifichi il tuo modello un numero arbitrario di volte. Ad ogni riqualificazione, stai valutando un diverso set di iperparametri (i parametri che vengono inviati al tuo modello in primo luogo rispetto a quelli per i quali il tuo modello sta ottimizzando) ma stai ancora usando il sottoinsieme trainingData. Ad ogni riqualificazione, verifichi di nuovo quanto bene si generalizza il nuovo modello controllando le prestazioni su validateData.

Dopo aver verificato ogni combinazione di iperparametri che intendi valutare, scegli il set di iperparametri che ti ha dato le migliori prestazioni su validateData - facciamo finta che le tue migliori prestazioni su validateData fossero accurate all'80%. Questi sono i tuoi iperparametri finali e il modello definito da tali iperparametri è quello che utilizzerai per questo passaggio successivo.

Ora prendi il modello che utilizza i tuoi iperparametri finali e valuti testData. Questa è la prima volta che testData è stato toccato dall'inizio dell'intero processo! Se ottieni prestazioni TestData comparabili alle tue prestazioni su validateData (anche se di solito sarà leggermente inferiore), puoi essere sicuro che il tuo modello funzioni come previsto e si generalizza bene! Se ciò accade, questo è il tuo modello finale!

Perché tutto questo? Stai cercando di evitare un eccesso di adattamento. Esiste sempre il rischio che ci si adatti eccessivamente ai dati utilizzati durante l'addestramento e l'ottimizzazione (ovvero la convalida) del modello. Se ti alleni, ottimizzi (esegui la convalida) e esegui il test utilizzando solo un set di dati, ci sono buone probabilità che tu li monti troppo e non si generalizzi bene. Rompendo i set di dati di allenamento e test (e supponendo che tu ti sintonizzi usando i dati del test), hai la possibilità di controllarti internamente, ma c'è ancora la possibilità che tu stia semplicemente sovrascrivendo i dati del test ora. Ecco perché sveliamo un terzo set di dati, convalidiamo, quindi abbiamo un ulteriore livello per mantenerci onesti internamente. L'ottimizzazione con validateData ci impedisce di sovralimentare con trainingData. I test finali con testData ci impediscono di sovralimentare per validare i dati.


In che modo questa risposta è diversa dalla risposta accettata ?
Jan Kukacka,

La domanda originale è esplicitamente posta su un flusso di lavoro che non include la convalida incrociata. Ho letto la sua domanda per chiedermi come funziona e perché è affidabile. La risposta accettata discute un flusso di lavoro che include ancora la convalida incrociata. Volevo spiegare come lo fanno le persone senza necessariamente usare la validazione incrociata nel caso in cui qualcuno sia un principiante e forse non lo sia ancora. Scusami se pubblicare questo messaggio è sbagliato - Sono un nuovo utente e non intendo infrangere una regola.
John D

0

Vediamolo nel modo seguente

  1. Pratica comune

    a) Dati di allenamento - utilizzati per la scelta dei parametri del modello.

     i) E.g., finding intercept and slope parameters for an ordinary linear 
        regression model. 
    
     ii) The noise in the training data-set is used in some extent 
         in over-fitting model parameters. 
    

    b) Dati di convalida - utilizzati per la scelta di iperparametri.

     i)  E.g., we may want to test three different models at step 1.a, say 
         linear model with one, two or three variables.   
    
     ii) The validation data-set is independent from training data, and thus, they provide 
         'unbiased' evaluation to the models, which help to decide which 
         hyper-parameter to use. 
    
     iii) We note that, a model trained in 1.a, say y = b_0+b_1*x_1, does 
         not learn anything from this data-set. So, the noise in this data- 
         set is not used to over-fit the parameters (b_0, b_1), but, over- 
         fit exists in choosing which linear model to use (in terms of 
         number of variables). 
    

    c) Dati di test: utilizzati per ottenere la sicurezza dell'output dai due passaggi precedenti

    i) Used once a model is completely trained
    
  2. Un altro modo di guardare alla parte 1

    a) Il nostro pool di candidati modello è un set di 5 dimenson, ovvero

    i) Dimension 1: number of variables to keep in the regression model, 
       e.g., [1, 2, 3].
    
    ii) Dimension 2-5: (b_0, b_1, b_2, b_3). 
    

    b) Il passaggio 1a riduce i candidati modello da 5 dimensioni a 1 dimensione.

    c) Il passaggio 1b riduce i candidati modello da 1 dimensione a 0 dimensione, che rappresenta un singolo modello.

    d) Tuttavia, l'OP potrebbe pensare che l'output 'finale' sopra non stia funzionando abbastanza bene sul set di dati di test, e quindi ripetere nuovamente l'intero processo, ad esempio usando la regressione della cresta invece della normale regressione lineare. Quindi il set di dati di test viene utilizzato più volte e quindi il rumore in questi dati potrebbe produrre un eccesso di adattamento nel decidere se utilizzare la regressione lineare o la regressione della cresta.

    e) Per gestire un pool di modelli ad alta dimensione con parametri, iperparametri, tipi di modello e metodi di pre-elaborazione, qualsiasi suddivisione dei dati a nostra disposizione sta essenzialmente definendo un processo decisionale che

    i)  Sequentially reducing the model pool to zero-dimension.
    
    ii) Allocating data noise overfitting to different steps of dimension 
        reductions (overfitting the noise in the data is not avoidable but 
        could be allocated smartly). 
    
  3. Conclusione e risposte alla domanda del PO

    a) Due split (training e test), tre split (training, validazione e test) o un numero maggiore di split riguardano essenzialmente la riduzione della dimensionalità e l'allocazione dei dati (in particolare rumore e rischio di sovra-adattamento).

    b) Ad un certo punto, potresti trovare un pool di candidati modello "finale", e poi, puoi pensare a come progettare il processo di riduzione sequenziale della dimensione in modo tale che

    i) At each step of reducing the dimensions, the output is satisfactory, 
      e.g., not using just 10 data points with large noise to estimate a 
      six-parameter liner model. 
    
    ii) There are enough data for you to reduce the dimension to zero 
       finally. 
    

    c) Cosa succede se non riesci a raggiungere b

    i) Use model and data insight to reduce the overall dimensionality of 
      your model pool. E.g., liner regression is sensitive to outliers thus 
      not good for data with many large outliers. 
    
    ii) Choose robust non-parametric models or models with less number of 
       parameter if possible. 
    
    iii) Smartly allocating the data available at each step of reducing the 
        dimensionality. There is some goodness of fit tests to help us decide 
        whether the data we use to train the model is enough or not. 
    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.