Come dividere il set di dati per la validazione incrociata, la curva di apprendimento e la valutazione finale?


70

Qual è una strategia appropriata per suddividere il set di dati?

Chiedo feedback sul seguente approccio (non sui singoli parametri come test_sizeo n_iter, ma se usato X, y, X_train, y_train, X_test, e y_testin modo appropriato e se la sequenza senso):

(estendendo questo esempio dalla documentazione di scikit-learn)

1. Caricare il set di dati

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Suddividere in training e set di test (ad es. 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Scegli lo stimatore

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Scegli iteratore di convalida incrociata

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Sintonizzare gli iperparametri

applicare l'iteratore di convalida incrociata sul set di addestramento

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Algoritmo di debug con curva di apprendimento

X_trainviene diviso casualmente in un allenamento e un set di test 10 volte ( n_iter=10). Ogni punto della curva di formazione-score è la media di 10 punteggi in cui il modello è stato addestrato e valutato sui primi i esempi di addestramento. Ogni punto sulla curva del punteggio di convalida incrociata è la media di 10 punteggi in cui il modello è stato addestrato sui primi esempi di allenamento i e valutato su tutti gli esempi del set di test.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Curva di apprendimento

plot_learning_curve () può essere trovato nell'attuale versione di sviluppo di scikit-learn (0.15-git).

7. Valutazione finale sul set di test

classifier.score(X_test, y_test)

7a. Test di over-fitting nella selezione del modello con validazione incrociata nidificata (utilizzando l'intero set di dati)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Domanda aggiuntiva: ha senso sostituire il passaggio 7 con la convalida incrociata nidificata? O dovrebbe essere nidificato cv come complementare al passaggio 7

(il codice sembra funzionare con la convalida incrociata di k-fold in scikit-learn, ma non con shuffle e split. Quindi cvdeve essere modificato sopra per far funzionare il codice)

8. Addestra il modello finale sull'intero set di dati

classifier.fit(X, y)

EDIT: ora sono d'accordo con cbeleites che il passaggio 7a non ha molto senso in questa sequenza. Quindi non lo adotterò.


Quale regola del punteggio di precisione stai usando? Se si tratta di precisione di classificazione, una regola di punteggio così errata annullerà gran parte del lavoro svolto.
Frank Harrell,

Ho usato il valore predefinito che è in effetti l'accuratezza della classificazione. So che, ad esempio, la F1 sarebbe più appropriata. Ma qui sono solo interessato se le divisioni vengono utilizzate OK.
Tobip

3
Sono quasi certo che la F1 sia un nuovo nome per un vecchio concetto. Penso che sia controproducente inventare nuovi nomi per cose vecchie. Ancora più importante, è una regola di punteggio impropria che comporterà la selezione di funzioni sbagliate e l'aggiunta di una buona quantità di rumore nell'intero processo.
Frank Harrell,

3
... in ogni caso F1 condivide i problemi di precisione a cui @FrankHarrell allude: questi derivano dal conteggio delle frazioni di casi di test di classificazioni difficili. Per ottenere una delle regole di punteggio corrette di Frank, dovresti passare all'output probabilistico dell'SVM, quindi ad esempio utilizzare il punteggio di Brier (errore quadratico medio) invece dell'accuratezza. Suppongo che potresti anche derivare una versione di tipo MSE di F1. Tali misure dovrebbero in effetti essere migliori per la fase di ottimizzazione. Per comunicare la performance finale, potresti anche aver bisogno dei modi tipici (es. Accuratezza, F1) di esprimere la performance per la tua community.
cbeleites,

1
@ ta.ft: se l'approccio è sbagliato o no dipende da cosa consideri sbagliato: la ricerca della griglia sulle proporzioni ha un serio rischio di scrematura a meno che tu non abbia un numero ridicolmente elevato di casi indipendenti. Pertanto, per molte situazioni l'affermazione che la ricerca della griglia produce il modello ottimale è errata. Tuttavia, se si esegue una corretta convalida nidificata, la convalida esterna fornisce una misura onesta delle prestazioni del modello "ottimale" scelto. Quindi non è sbagliato. Non hai la garanzia che la ricerca della griglia abbia ottenuto il modello ottimale. Per quanto riguarda la letteratura, aggiornerò la mia risposta.
cbeleites,

Risposte:


41

Non sono sicuro di cosa tu voglia fare nel passaggio 7a. Come lo capisco adesso, non ha senso per me.

Ecco come comprendo la tua descrizione: al passaggio 7, si desidera confrontare le prestazioni di controllo con i risultati di una convalida incrociata che abbraccia i passaggi da 4 a 6. (quindi sì, sarebbe una configurazione nidificata).

I punti principali per cui non credo che questo confronto abbia molto senso sono:

  • Questo confronto non può rilevare due delle principali fonti di risultati di validazione iperottimistici che incontro nella pratica:

    • perdite di dati (dipendenza) tra i dati di training e test che sono causati da una struttura di dati gerarchica (aka cluster) e che non sono presi in considerazione nella suddivisione. Nel mio campo, abbiamo in genere più (a volte migliaia) di letture (= righe nella matrice dei dati) dello stesso paziente o replicato biologico di un esperimento. Questi non sono indipendenti, quindi la suddivisione della convalida deve essere eseguita a livello di paziente. Tuttavia, si verifica una tale perdita di dati, la avrai sia nella divisione per il set di controllo che nella divisione di convalida incrociata. Hold-out sarà quindi ottimisticamente distorto come la validazione incrociata.

    • Preelaborazione dei dati eseguita sull'intera matrice di dati, in cui i calcoli non sono indipendenti per ogni riga ma molte / tutte le righe vengono utilizzate per calcolare i parametri per la preelaborazione. Esempi tipici sarebbero ad esempio una proiezione PCA prima della classificazione "effettiva".
      Ancora una volta, ciò influenzerebbe sia il tuo controllo che la convalida incrociata esterna, quindi non puoi rilevarlo.

    Per i dati con cui lavoro, entrambi gli errori possono facilmente sottovalutare la frazione di errori di classificazione di un ordine di grandezza!

  • Se si è limitati a questa frazione contata del tipo di prestazioni dei casi di test, i confronti tra modelli richiedono un numero estremamente elevato di casi di test o differenze ridicolmente elevate nelle prestazioni reali. Il confronto di 2 classificatori con dati di allenamento illimitati può essere un buon inizio per ulteriori letture.

Tuttavia, confrontare la qualità del modello rivendicato dalla convalida incrociata interna per il modello "ottimale" e la convalida incrociata esterna o la convalida di esclusione ha un senso: se la discrepanza è elevata, è lecito chiedersi se l'ottimizzazione della ricerca della griglia ha funzionato (si potrebbe avere varianza scremata a causa dell'alta varianza della misura di prestazione). Questo confronto è più semplice in quanto è possibile individuare i problemi se la stima interna è ridicolmente buona rispetto agli altri - in caso contrario, non è necessario preoccuparsi troppo dell'ottimizzazione. Ma in ogni caso, se la tua misurazione esterna (7) della performance è onesta e solida, hai almeno una stima utile del modello ottenuto, che sia ottimale o meno.

L'IMHO che misura la curva di apprendimento è ancora un problema diverso. Probabilmente mi occuperei di questo separatamente e penso che devi definire più chiaramente ciò di cui hai bisogno per la curva di apprendimento (hai bisogno della curva di apprendimento per un set di dati del problema, dei dati e del metodo di classificazione dati o della curva di apprendimento per questo set di dati del dato problema, dati e classificazione mehtod) e una serie di ulteriori decisioni (ad es. come gestire la complessità del modello in funzione della dimensione del campione di training? Ottimizzare tutto di nuovo, utilizzare iperparametri fissi, decidere funzione per correggere gli iperparametri a seconda delle dimensioni del set di allenamento?)

(I miei dati di solito hanno così pochi casi indipendenti per ottenere la misurazione della curva di apprendimento sufficientemente precisa per usarlo in pratica - ma potresti essere migliore se le tue 1200 righe sono effettivamente indipendenti)


aggiornamento: cosa c'è di "sbagliato" nell'esempio di scikit-learn?

Prima di tutto, qui non c'è nulla di sbagliato nella convalida incrociata nidificata. La convalida nidificata è della massima importanza per l'ottimizzazione basata sui dati e la convalida incrociata è un approccio molto potente (in particolare se ripetuto / ripetuto).

Quindi, se qualcosa non va affatto dipende dal tuo punto di vista: fintanto che esegui una validazione nidificata onesta (mantenendo i dati del test esterno strettamente indipendenti), la validazione esterna è una misura adeguata delle prestazioni del modello "ottimale". Niente di sbagliato in questo.

Ma molte cose possono andare e vanno male con la ricerca in griglia di queste misure di prestazioni di tipo proporzionale per l'ottimizzazione dell'iperparametro di SVM. Fondamentalmente significano che potresti (probabilmente?) Non poter contare sull'ottimizzazione. Tuttavia, finché la divisione esterna è stata eseguita correttamente, anche se il modello non è il migliore possibile, si ha una stima onesta delle prestazioni del modello ottenuto.

Proverò a fornire spiegazioni intuitive sul motivo per cui l'ottimizzazione potrebbe essere in difficoltà:

  • Dal punto di vista matematico / statistico, il problema con le proporzioni è che le proporzioni misurate sono soggette a un'enorme varianza a causa della dimensione finita del campione di prova (a seconda anche della reale prestazione del modello, ): npVar( p )=p(1-p)p^np
    Var(p^)=p(1p)n

    Hai bisogno di un numero ridicolmente enorme di casi (almeno rispetto al numero di casi che di solito posso avere) al fine di ottenere la precisione necessaria (senso di bias / varianza) per stimare il richiamo, la precisione (senso delle prestazioni di apprendimento automatico). Questo ovviamente si applica anche ai rapporti calcolati da tali proporzioni. Dai un'occhiata agli intervalli di confidenza per le proporzioni binomiali. Sono incredibilmente grandi! Spesso più grande del vero miglioramento delle prestazioni sulla griglia dell'iperparametro. E statisticamente parlando, la ricerca della griglia è un enorme problema di confronto multiplo: più punti della griglia si valuta, maggiore è il rischio di trovare una combinazione di iperparametri che accidentalmente sembra molto buono per la divisione treno / test che si sta valutando. Questo è ciò che intendo con varianza scrematura.

  • Intuitivamente, considera un ipotetico cambiamento di un iperparametro, che provoca lentamente il deterioramento del modello: un caso di test si sposta verso il limite decisionale. Le misure di prestazione "rigide" non rilevano questo fino a quando il caso non attraversa il confine e si trova dalla parte sbagliata. Quindi, tuttavia, assegnano immediatamente un errore completo per una variazione infinitamente piccola nell'iperparametro.
    Per eseguire l'ottimizzazione numerica, è necessario che la misura delle prestazioni sia ben educata. Ciò significa: né la parte jumpy (non continuamente differenziabile) della misura della prestazione di tipo proporzionale, né il fatto che, a parte quel salto, non vengano rilevati cambiamenti che si verificano effettivamente, sono adatti per l'ottimizzazione.
    Le regole di punteggio corrette sono definite in un modo particolarmente adatto per l'ottimizzazione. Hanno il loro massimo globale quando le probabilità previste corrispondono alle probabilità reali per ciascun caso di appartenere alla classe in questione.

  • Per gli SVM hai l'ulteriore problema che non solo le misure delle prestazioni ma anche il modello reagisce in questo modo brusco: i piccoli cambiamenti dell'iperparametro non cambieranno nulla. Il modello cambia solo quando gli iperparametri sono abbastanza modificati da causare in alcuni casi l'arresto del vettore di supporto o il vettore di supporto. Ancora una volta, tali modelli sono difficili da ottimizzare.

Letteratura:


Aggiornamento II: varianza scrematura

ciò che puoi permetterti in termini di confronto tra modelli dipende ovviamente dal numero di casi indipendenti. Facciamo una simulazione veloce e sporca sul rischio di scrematura varianza qui:

scikit.learndice che hanno 1797 sono nei digitsdati.

  • supponiamo che vengano confrontati 100 modelli, ad esempio una griglia per 2 parametri.10×10
  • supponiamo che entrambi i parametri (intervalli) non influenzino affatto i modelli,
  • cioè, tutti i modelli hanno le stesse prestazioni reali, diciamo, del 97% (prestazioni tipiche per il digitsset di dati).

  • Esegui simulazioni di "test di questi modelli" con dimensioni campione = 1797 righe nel set di dati104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")
    

Ecco la distribuzione per le migliori prestazioni osservate:

simulazione varianza scrematura

La linea rossa segna la vera prestazione di tutti i nostri ipotetici modelli. In media, osserviamo solo 2/3 del tasso di errore reale per il modello apparentemente migliore dei 100 modelli confrontati (per la simulazione sappiamo che funzionano tutti allo stesso modo con previsioni corrette del 97%).

Questa simulazione è ovviamente molto semplificata:

  • Oltre alla varianza della dimensione del campione di prova, esiste almeno la varianza dovuta all'instabilità del modello, quindi qui sottovalutiamo la varianza
  • L'ottimizzazione dei parametri che influiscono sulla complessità del modello coprirà in genere set di parametri in cui i modelli sono instabili e pertanto presentano una varianza elevata.
  • Per le cifre UCI dell'esempio, la base di dati originale ha ca. 11000 cifre scritte da 44 persone. Cosa succede se i dati sono raggruppati in base alla persona che ha scritto? (Vale a dire è più facile riconoscere un 8 scritto da qualcuno se sai come quella persona scrive, diciamo, un 3?) La dimensione effettiva del campione può quindi essere inferiore a 44.
  • L'ottimizzazione degli iperparametri del modello può portare alla correlazione tra i modelli (in effetti, sarebbe considerato ben comportato da una prospettiva di ottimizzazione numerica). È difficile prevederne l'influenza (e sospetto che ciò sia impossibile senza tener conto del tipo effettivo di classificatore).

In generale, tuttavia, sia il basso numero di casi di test indipendenti sia il numero elevato di modelli confrontati aumentano la distorsione. Inoltre, il documento di Cawley e Talbot fornisce un comportamento empirico osservato.


@cbleites: se la ricerca della griglia potrebbe non essere un metodo appropriato per trovare il modello ottimale, quale metodo dovrei scegliere?
Tobip

1
@ ta.ft: due approcci sono a) incorporano nella modellazione la stessa conoscenza esterna della tua applicazione e dei dati al fine di ridurre drasticamente il numero di modelli che devono essere confrontati (= decidi gli iperparametri invece di ottimizzare). Nel complesso potrebbe essere meglio passare a un classificatore con iperparametri intrinsecamente significativi, ovvero dove è possibile sapere dall'applicazione e dal tipo di dati quale dovrebbe essere (approssimativamente) l'iperparametro. b) confrontare i pochi modelli rimanenti con una regola di punteggio adeguata. Ad esempio, il punteggio Brier ha proprietà di varianza molto migliori per molti classificatori.
cbeleites,

1
Puoi anche rifiutare di ottimizzare (tramite le decisioni (a)). Se ottieni un classificatore abbastanza buono e puoi sostenere che non hai alcuna possibilità di dimostrare la superiorità di un altro classificatore date le dimensioni del campione disponibile (ad esempio, esegui alcuni calcoli dimostrativi di McNemar, cerca le dimensioni del campione necessarie per confronti di proporzioni per un ipotetico miglior classificatore - c'è una buona possibilità che questi siano ridicolmente grandi anche per miglioramenti ipotetici ridicolmente grandi), si può sostenere che l'ottimizzazione non ha alcun senso e crea semplicemente un rischio di overfitting.
cbeleites,

Non sono d'accordo con te sulla "varianza della scrematura". Se nella griglia sono presenti molti punti per l'ottimizzazione dell'iperparametro, un punto potrebbe essere opportunisticamente fortunato in una piega del CV; ma se hai, diciamo CV 10 volte, è ancora improbabile che un insieme di parametri possa accidentalmente essere fortunato su tutte e 10 le pieghe del CV.
RNA,

1
@RNA: la probabilità di essere "fortunati" in tutte le pieghe è direttamente collegata al numero totale di casi (in tutte le 10 pieghe) e in genere viene considerata solo la media su tutte quelle pieghe. Ho aggiornato la risposta con una simulazione di un ipotetico prelievo del migliore dei 100 modelli (diciamo, 2 iperparametri con 10 passi ciascuno), che è già associato a un notevole pregiudizio per lo scenario di esempio (tasso di errore troppo basso di 1/3) . Molte persone qui raramente hanno qualche migliaio di casi indipendenti a portata di mano, ad esempio raramente ho anche le 44 persone che hanno scritto cifre per l'intero set di dati delle cifre dell'UCI.
cbeleites,
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.