Selezione delle funzionalità e convalida incrociata


76

Recentemente ho letto molto su questo sito (@Aniko, @Dikran Marsupial, @Erik) e altrove sul problema del sovradimensionamento che si verifica con convalida incrociata - (Smialowski et al 2010 Bioinformatica, Hastie, Elementi di apprendimento statistico). Il suggerimento è che qualsiasi selezione di funzionalità supervisionata (utilizzando la correlazione con le etichette di classe) eseguita al di fuori della stima delle prestazioni del modello utilizzando la convalida incrociata (o altri metodi di stima del modello come il bootstrap) può comportare un overfitting.

Questo non mi sembra intuitivo - sicuramente se selezioni un set di funzionalità e poi valuti il ​​tuo modello usando solo le funzionalità selezionate usando la validazione incrociata, allora stai ottenendo una stima imparziale delle prestazioni del modello generalizzato su quelle caratteristiche (questo presuppone che il campione in studio sia rappresentativo della popolazione)?

Naturalmente, con questa procedura non è possibile rivendicare un set di funzionalità ottimale, ma è possibile riportare valide le prestazioni del set di funzionalità selezionato su dati non visti?

Accetto che la selezione delle funzionalità in base all'intero set di dati possa provocare una perdita di dati tra i set di test e quelli del treno. Ma se il set di funzionalità è statico dopo la selezione iniziale e non viene eseguita alcuna altra ottimizzazione, sicuramente è valido riportare le metriche delle prestazioni convalidate in modo incrociato?

Nel mio caso ho 56 funzioni e 259 casi e quindi #case> #features. Le funzionalità sono derivate dai dati del sensore.

Mi scuso se la mia domanda sembra derivata ma questo sembra un punto importante da chiarire.

Modifica: sull'implementazione della selezione delle funzionalità nell'ambito della convalida incrociata sul set di dati sopra descritto (grazie alle risposte seguenti), posso confermare che la selezione delle funzionalità prima della convalida incrociata in questo set di dati ha introdotto un significativobias. Questo bias / overfitting era maggiore quando lo faceva per una formulazione di 3 classi, rispetto alla formulazione di 2 classi. Penso che il fatto di aver usato la regressione graduale per la selezione delle funzioni abbia aumentato questo eccesso; a fini di confronto, su un set di dati diverso ma correlato, ho confrontato una routine sequenziale di selezione delle caratteristiche in avanti eseguita prima della convalida incrociata rispetto ai risultati che avevo precedentemente ottenuto con la selezione delle caratteristiche in CV. I risultati tra i due metodi non differivano notevolmente. Ciò può significare che la regressione graduale è più soggetta a sovralimentazione rispetto a FS sequenziale o può essere una stranezza di questo set di dati.


7
Non penso che sia (abbastanza) ciò che Hastie, et al. stanno sostenendo. L'argomentazione generale è che se la selezione delle caratteristiche utilizza la risposta, è meglio includerla come parte della procedura del CV. Se si esegue lo screening dei predittori, ad es. Osservando le loro varianze di campione ed escludendo i predittori con una piccola variazione, va bene come procedura one-shot.
cardinale

3
+1 tuttavia, anche in questo caso la convalida incrociata non rappresenta la varianza nel processo di selezione della funzione, il che potrebbe costituire un problema se la selezione della funzione è instabile. Se si esegue prima lo screening, la variabilità delle prestazioni in ciascuna piega rappresenterà la variabilità reale. Se si esegue lo screening in ciascuna piega, aumenterà in modo appropriato la variabilità delle prestazioni in ciascuna piega. Continuerei sempre a eseguire la proiezione in ogni piega se potessi permettermi la spesa computazionale.
Dikran Marsupial,

1
Penso che l'affermazione "QUALSIASI selezione di funzionalità eseguita prima della stima delle prestazioni del modello utilizzando la convalida incrociata può comportare un overfitting". è una citazione errata o una rappresentazione errata di ciò che Hastie e altri suggerirebbero. Se si cambia la parola "precedente" a "senza" ha più senso. Inoltre, la frase sembra suggerire che la convalida incrociata è l'unico modo per testare legittimamente l'adeguatezza delle variabili selezionate. Il bootstrap, ad esempio, potrebbe essere un altro approccio legittimo .
Michael Chernick

@MichaelChernick - d'accordo. Ho modificato sopra per riflettere meglio il mio significato.
BGreene,

1
@Bgreene: c'è una recente discussione su questo argomento che può essere letta su goo.gl/C8BUa .
Alekk,

Risposte:


69

Se si esegue la selezione delle funzioni su tutti i dati e quindi si esegue la convalida incrociata, i dati di test in ogni piega della procedura di convalida incrociata sono stati utilizzati anche per scegliere le funzionalità e questo è ciò che pregiudica l'analisi delle prestazioni.

Considera questo esempio. Generiamo alcuni dati target lanciando una moneta 10 volte e registrando se scende come testa o croce. Quindi generiamo 20 funzioni lanciando la moneta 10 volte per ogni caratteristica e scrivendo ciò che otteniamo. Eseguiamo quindi la selezione delle funzionalità selezionando la funzionalità che corrisponde ai dati di destinazione il più vicino possibile e usiamo quella come nostra previsione. Se poi eseguiamo la convalida incrociata, otterremo un tasso di errore previsto leggermente inferiore a 0,5. Questo perché abbiamo scelto la funzione sulla base di una correlazione sia sul set di addestramento che sul set di test in ogni piega della procedura di convalida incrociata. Tuttavia, il tasso di errore reale sarà 0,5 poiché i dati di destinazione sono semplicemente casuali. Se si esegue la selezione delle funzioni in modo indipendente all'interno di ogni piega della convalida incrociata, il valore atteso del tasso di errore è 0.

L'idea chiave è che la convalida incrociata è un modo per stimare le prestazioni di generalizzazione di un processo per la costruzione di un modello, quindi è necessario ripetere l'intero processo in ogni piega. Altrimenti si otterrà una stima distorta o una sottovalutazione della varianza della stima (o di entrambi).

HTH

Ecco un codice MATLAB che esegue una simulazione Monte-Carlo di questa configurazione, con 56 funzioni e 259 casi, per corrispondere al tuo esempio, l'output che fornisce è:

Stimatore distorto: erate = 0,429210 (0,397683 - 0,451737)

Stimatore non distorto: erate = 0.499689 (0.397683 - 0.590734)

Lo stimatore distorto è quello in cui la selezione della funzione viene eseguita prima della convalida incrociata, lo stimatore imparziale è quello in cui la selezione della funzione viene eseguita in modo indipendente in ogni piega della convalida incrociata. Ciò suggerisce che la distorsione può essere piuttosto grave in questo caso, a seconda della natura del compito di apprendimento.

NF    = 56;
NC    = 259;
NFOLD = 10;
NMC   = 1e+4;

% perform Monte-Carlo simulation of biased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform feature selection

   err       = mean(repmat(y,1,NF) ~= x);
   [err,idx] = min(err);

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, '  Biased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

% perform Monte-Carlo simulation of unbiased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      % perform feature selection

      err       = mean(repmat(y(partition~=j),1,NF) ~= x(partition~=j,:));
      [err,idx] = min(err);

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, 'Unbiased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

3
Grazie - questo è molto utile. Se segui l'approccio suggerito come valuti il ​​tuo modello finale? Dato che avrai più set di funzionalità, come scegli il set di funzionalità finale? Storicamente ho anche riportato risultati basati su una convalida incrociata singola con i parametri del modello e le caratteristiche scelte.
BGreene,

16
È meglio considerare la convalida incrociata come la valutazione delle prestazioni di una procedura per l'adattamento di un modello, piuttosto che del modello stesso. La cosa migliore da fare è normalmente eseguire la convalida incrociata come sopra, quindi creare il modello finale utilizzando l'intero set di dati utilizzando la stessa procedura utilizzata in ogni piega della procedura di convalida incrociata.
Dikran Marsupial,

2
In questo caso, stiamo quindi riportando i risultati della classificazione in base alla convalida incrociata (potenzialmente molti set di funzionalità diverse), ma riportando il modello in modo che contenga solo uno di questi set di funzionalità, ovvero i risultati della classificazione convalidata in modo incrociato non corrispondono necessariamente al set di funzionalità?
BGreene,

10
In sostanza sì, la convalida incrociata stima solo le prestazioni previste di un processo di costruzione del modello, non il modello stesso. Se il set di funzionalità varia notevolmente da una piega all'altra del cross-valdidation, significa che la selezione della funzione è instabile e probabilmente non molto significativa. È spesso preferibile utilizzare la regolarizzazione (ad es. Regressione della cresta) piuttosto che la selezione delle caratteristiche, soprattutto se quest'ultima è instabile.
Dikran Marsupial,

3
Questo è un post così importante. Incredibile quanti non lo applicano.
Chris A.,

12

Per aggiungere una descrizione leggermente diversa e più generale del problema:

Se si esegue qualsiasi tipo di pre-elaborazione basata sui dati , ad es

  1. ottimizzazione dei parametri guidata da cross validation / out-of-bootstrap
  2. riduzione della dimensionalità con tecniche come PCA o PLS per produrre input per il modello (ad esempio PLS-LDA, PCA-LDA)
  3. ...

e si desidera utilizzare la convalida incrociata / convalida fuori avvio (/ hold out) per stimare le prestazioni del modello finale , la pre-elaborazione basata sui dati deve essere eseguita sui dati di addestramento surrogato, cioè separatamente per ciascun modello surrogato.

Se la pre-elaborazione basata sui dati è di tipo 1., ciò porta a una convalida incrociata "doppia" o "nidificata": la stima dei parametri viene eseguita in una convalida incrociata utilizzando solo il set di addestramento della convalida incrociata "esterna". ElemStatLearn ha un'illustrazione ( https://web.stanford.edu/~hastie/Papers/ESLII.pdf Pagina 222 di stampa 5).

Si può dire che la pre-elaborazione fa davvero parte della costruzione del modello. viene eseguita solo la pre-elaborazione

  • indipendentemente per ogni caso o
  • indipendentemente dal set di dati effettivo

può essere rimosso dal ciclo di convalida per salvare i calcoli.

Quindi, al contrario: se il tuo modello è completamente costruito da conoscenze esterne al particolare set di dati (ad es. Decidi in anticipo dalle tue conoscenze esperte che i canali di misurazione 63 - 79 non possono eventualmente aiutare a risolvere il problema, puoi ovviamente escludere questi canali , costruisci il modello e lo convalidi incrociato. Lo stesso, se fai una regressione PLS e decidi per esperienza che 3 variabili latenti sono una scelta ragionevole (ma non giocare se 2 o 5 lv danno risultati migliori) allora puoi andare avanti con una normale convalida fuori avvio / crossstrap.


Purtroppo il link per la stampa 5 del libro ElemStatLearn non funziona. Mi chiedevo se l'illustrazione a cui ti riferivi fosse ancora sulla stessa pagina. Si prega di menzionare anche la didascalia.
rraadd88,

Quindi, se avessi due set di dati, selezionassi la funzione / ingegneria su uno di essi e CV sull'altro, non ci sarebbero problemi?
Milos,

1
@Milos: no, purché tali funzioni diventino parametri fissi per i modelli per la convalida incrociata, dovrebbe essere OK. Questa sarebbe una corretta generazione di ipotesi (= sviluppo di funzionalità sul set di dati A) / verifica di ipotesi (= misurazione delle prestazioni delle funzionalità ora fisse con set di dati B).
cbeleites,

@cbeleites Sì, è quello che intendevo fare. Determinare le funzionalità su A, quindi correggere quelle funzionalità ed eseguire la convalida incrociata per i modelli su B. Grazie. :)
Milos,

@Milos: tieni presente, tuttavia, che la tua argomentazione per le prestazioni ottenute è ancora migliore se alleni completamente il tuo modello su A e poi usi B solo per i test.
cbeleites,

5

Proviamo a renderlo un po 'intuitivo. Considera questo esempio: hai un predittore binario dipendente e due predittori binari. Vuoi un modello con un solo predittore. Entrambi i predittori hanno una probabilità del 95% di essere uguale al dipendente e del 5% di non essere d'accordo con il dipendente.

Ora, per caso sui tuoi dati, un predittore equivale alla dipendenza da tutti i dati nel 97% delle volte e l'altro solo nel 93% delle volte. Sceglierai il predittore con il 97% e costruirai i tuoi modelli. In ogni piega della convalida incrociata avrai il modello dipendente = predittore, perché è quasi sempre giusto. Pertanto si otterrà una prestazione prevista per il 97%.

Ora, potresti dire, ok, è solo sfortuna. Ma se i predittori sono costruiti come sopra, allora hai una probabilità del 75% di almeno uno di essi con un'accuratezza> 95% sull'intero set di dati e quello è quello che sceglierai. Quindi hai una possibilità del 75% di sopravvalutare le prestazioni.

In pratica, non è affatto banale stimare l'effetto. È del tutto possibile che la selezione delle funzionalità selezionasse le stesse funzionalità in ogni piega come se fosse stata eseguita sull'intero set di dati e quindi non vi sarà alcun pregiudizio. L'effetto si riduce anche se si hanno molti più campioni ma funzionalità. Potrebbe essere istruttivo utilizzare entrambi i modi con i tuoi dati e vedere come differiscono i risultati.

Puoi anche mettere da parte una quantità di dati (diciamo il 20%), utilizzare sia la tua strada sia il modo corretto per ottenere stime delle prestazioni effettuando una convalida incrociata sull'80% e vedere quale previsione delle prestazioni si rivela più accurata quando trasferisci il tuo modello su 20 % dei dati accantonati. Si noti che per far funzionare la selezione delle funzionalità prima del CV, è necessario eseguire solo l'80% dei dati. Altrimenti non simulerà il trasferimento del modello su dati esterni al campione.


Potresti approfondire il modo corretto di selezionare le funzionalità con il tuo esempio intuitivo? Grazie.
uared1776
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.