Selezione del modello e convalida incrociata: la strada giusta


34

Esistono numerosi thread in CrossValidated sull'argomento di selezione del modello e convalida incrociata. Eccone alcuni:

Tuttavia, le risposte a questi thread sono abbastanza generiche e evidenziano principalmente i problemi con approcci particolari per la validazione incrociata e la selezione del modello.

Per rendere le cose il più concrete possibile , diciamo ad esempio che stiamo lavorando con un SVM con un kernel RBF: , e che Ho un set di dati di funzioni X ed etichette y e che desideroK(x,x)=(γ|xx|)2

  1. Trova i migliori valori possibili del mio modello ( eγC )
  2. Addestra SVM con il mio set di dati (per la distribuzione finale)
  3. Stimare l'errore di generalizzazione e l'incertezza (varianza) attorno a questo errore

Per fare ciò, farei personalmente una ricerca nella griglia, ad esempio provo ogni possibile combinazione di e . Per semplicità, possiamo assumere i seguenti intervalli:Cγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

Più specificamente, usando il mio set di dati completo faccio quanto segue:

  1. Per ogni coppia ( , ), eseguo ripetute iterazioni (ad es. 100 ripetizioni casuali) di -fold cross validation (ad es. ), sul mio set di dati, ovvero alleno il mio SVM su pieghe e valuto il errore sulla piega a sinistra, ripetendo tutte le pieghe diComplessivamente, raccolgo 100 x 10 = 1000 errori di test.CγKK=10K1K
  2. Per ciascuna di queste coppie ( , ), calcolo la media e la varianza di questi 1000 errori di test .CγμM,σM

Ora voglio scegliere il miglior modello (i migliori parametri del kernel) che userei per addestrare il mio SVM finale sull'insieme di dati completo. La mia comprensione è che la scelta del modello che presentava la media dell'errore più basso e la varianza e sarebbe la scelta giusta e che i questo modello sono sono le mie migliori stime del bias e della varianza dell'errore di generalizzazione del modello durante l'allenamento con il set di dati completo.μMσMμMσM

MA, dopo aver letto le risposte nei thread sopra, ho l'impressione che questo metodo per scegliere il miglior SVM per la distribuzione e / o per stimare il suo errore (prestazioni di generalizzazione), sia difettoso e che ci siano modi migliori di scegliere il migliore SVM e riportare il suo errore. Se sì, quali sono? Sto cercando una risposta concreta per favore.

Attenendosi a questo problema, in che modo posso scegliere il modello migliore e stimare correttamente il suo errore di generalizzazione ?


Per rendere le cose il più concrete possibile, ti preghiamo di comunicarci: quanti casi statisticamente indipendenti hai nel tuo set di dati? Qual è la funzione target che valuti per l'ottimizzazione / Che tipo di misura di errore usi? Osservate effettivamente un comportamento coerente della misura di errore scelta sulla griglia dei parametri? Nel caso tu stia parlando della classificazione e la tua misura di errore lo consente: in che modo i risultati iterati di convalida incrociata si confrontano con la varianza che ti aspetti (ma non riesci a misurare) a causa della dimensione del campione finito?
cbeleites supporta Monica il

Un articolo che potresti trovare interessante: optimumprediction.com/files/pdf/V2A5.pdf
user31256

2
+1 per una domanda molto chiara e dettagliata, nonché per una domanda molto pertinente per la comunità della scienza dei dati in generale.
NickBraunagel,

Risposte:


20

Il mio articolo in JMLR affronta questa domanda esatta e dimostra perché la procedura suggerita nella domanda (o almeno una molto simile) porta a stime prestazionali ottimizzate:

Gavin C. Cawley, Nicola LC Talbot, "Sull'adattamento eccessivo nella selezione dei modelli e conseguente pregiudizio nella selezione delle prestazioni", Journal of Machine Learning Research, 11 (lug): 2079-2107, 2010. ( www )

La cosa fondamentale da ricordare è che la convalida incrociata è una tecnica per stimare le prestazioni di generalizzazione per un metodo di generazione di un modello, piuttosto che del modello stesso. Quindi, se la scelta dei parametri del kernel fa parte del processo di generazione del modello, è necessario convalidare anche il processo di selezione del modello, altrimenti si otterrà una stima delle prestazioni ottimisticamente distorta (come accadrà con la procedura proposta).

Supponiamo di avere una funzione fit_model, che accetta un set di dati costituito dagli attributi X e le risposte Y desiderate e che restituisce il modello adattato per quel set di dati, inclusa la regolazione degli iperparametri (in questo caso kernel e parametri di regolarizzazione). Questa ottimizzazione degli iperparametri può essere eseguita in molti modi, ad esempio riducendo al minimo l'errore di convalida incrociata su X e T.

Passaggio 1: adattare il modello a tutti i dati disponibili, utilizzando la funzione fit_model. Questo ti dà il modello che userai durante il funzionamento.

Passaggio 2: valutazione delle prestazioni. Eseguire ripetute convalide incrociate utilizzando tutti i dati disponibili. In ogni piega, i dati sono suddivisi in un set di allenamento e un set di test. Montare il modello utilizzando il set di addestramento (registrare i valori di iperparametro per il modello montato) e valutare le prestazioni sul set di test. Usa la media su tutti i set di test come stima delle prestazioni (e forse guarda anche la diffusione dei valori).

Passaggio 3: Variabilità delle impostazioni degli iperparametri: eseguire l'analisi dei valori degli iperparametri raccolti nel passaggio 3. Tuttavia, devo sottolineare che non vi è nulla di speciale negli iperparametri, sono solo parametri del modello che sono stati stimati (indirettamente ) dai dati. Sono trattati come iperparametri anziché come parametri per comodità computazionale / matematica, ma non è così.

Il problema con l'uso della convalida incrociata qui è che i dati di addestramento e test non sono campioni indipendenti (poiché condividono dati), il che significa che è probabile che la stima della varianza della stima delle prestazioni e degli iperparametri (es. più piccolo di quanto sarebbe per campioni di dati realmente indipendenti in ciascuna piega). Invece di ripetere la convalida incrociata, probabilmente userei invece il bootstrap e comprimerei i modelli risultanti se questo fosse fattibile dal punto di vista computazionale.

Il punto chiave è che per ottenere una stima imparziale delle prestazioni, qualunque procedura si usi per generare il modello finale (fit_model) deve essere ripetuta nella sua interezza in modo indipendente in ogni piega della procedura di convalida incrociata.


Questa è un'ottima risposta Quando dici rather than repeated cross-validation you would go for bootstrapping: qual è esattamente la differenza? Entrambi coinvolgono molteplici ripetizioni di dividere i dati in traine testquindi la formazione in traine valutare in test, non è vero?
Josh,

4
Il bootstrap (campionamento con sostituzione) sembra un modo più naturale di eseguire un gran numero di ricampionamenti, poiché è più randomizzato della ripetuta convalida incrociata. Per il bootstrap, l'uso di gruppi insaccati è una bella funzionalità, con l'errore out-of-bag come stima delle prestazioni. Non c'è una grande quantità tra cui scegliere.
Dikran Marsupial,

Grazie @Dikran - Questo mi ha fatto meravigliare, supponendo che si usi ad esempio il bootstrap, come sceglieresti un buon modello considerando la media e la varianza tra le ripetizioni? (ovvero quale protocollo di selezione del modello seguiresti?). Questa domanda pone esattamente questa domanda. Ottenere il tuo contributo su quel thread sarebbe estremamente prezioso!
Josh,

@DikranMarsupial Potresti pubblicare un codice (ad esempio, Python o R) per i tuoi passaggi 1-3? Trovo molto più facile capire tali procedure quando vedo un codice concreto.
Tobip

1
Messaggio chiave: "Il punto chiave è che per ottenere una stima imparziale delle prestazioni, qualunque procedura si usi per generare il modello finale (fit_model) deve essere ripetuta nella sua interezza in modo indipendente in ogni piega della procedura di convalida incrociata". Questo messaggio esatto è anche riportato in The Elements of Statistical Learning (vedere la sezione 7.10.2): web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel

0

γC

Una procedura che ottimizza questi iperparametri e addestra un SVM con questi è anche solo un algoritmo di apprendimento automatico . Invece di ottimizzare solo i parametri interni dell'SVM (i vettori di supporto), ottimizza anche gli iperparametri.

Ora hai due problemi [che possono essere risolti in modo indipendente]:

Leggi l' uso improprio di convalida incrociata (rendicontazione delle prestazioni per il miglior valore di iperparametro) per assicurarti di non confonderle.


Una soluzione specifica (probabilmente non ottimale) al problema concreto della tua domanda:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

Qui, modelsarebbe il tuo "miglior modello" e loss_CVuna "stima adeguata del suo errore di generalizzazione" (anche se tendenzioso verso l'alto, ma non puoi avere la torta e mangiarla troppo).

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.