Convalida incrociata PCA e k-fold nel pacchetto di inserimento in R


16

Ho appena rivisto una lezione del corso di Machine Learning su Coursera. Nella sezione in cui il professore discute di PCA per i dati di pre-elaborazione in applicazioni di apprendimento supervisionato, afferma che il PCA deve essere eseguito solo sui dati di addestramento e quindi la mappatura viene utilizzata per trasformare la convalida incrociata e i set di test. Vedi anche PCA e suddivisione treno / test .

Tuttavia, nel caretpacchetto R, i dati di allenamento passati nella train()funzione sono già elaborati da PCA. Così, quando le esegue algoritmo k-piegano validazione incrociata, il set di validazione incrociata è già stato elaborato con PCA via preProcess()e predict()ed è in effetti usato nella PCA "raccordo".

La mia comprensione della situazione è corretta? Vale a dire che la procedura di caret per la convalida incrociata con PCA (o di fatto, con qualsiasi metodo di riscalamento / centraggio) è "sbagliata" perché la pre-elaborazione dei dati viene eseguita sul set di convalida incrociata e sul set di addestramento? E in caso affermativo, che impatto avrebbe sui risultati?


1
Domanda interessante. Il professor Ng spiega perché "la PCA dovrebbe essere eseguita solo sui dati di addestramento e quindi la mappatura viene utilizzata per trasformare la validazione incrociata e i set di test"? La mia intuizione è che l'impatto dovrebbe essere minimo, dato che si presume che i dati di treno / cv / test provengano dalla stessa distribuzione e che PCA non coinvolga le variabili di output / dipendenti.
miura,

1
@miura Sì. Quando si esegue la PCA, è necessario risolvere il numero minimo di k dimensioni nei vettori di output necessari per ottenere la "varianza mantenuta" desiderata. Questo parametro k è ora in vigore (a mio avviso) un parametro aggiuntivo del nostro algoritmo che dobbiamo adattare. Se eseguiamo PCA anche sul set di convalida incrociata, stiamo effettivamente addestrando una parte del nostro algoritmo sul set di CV, riducendo così il valore della convalida incrociata.
mchangun,

Penso che tu stia confondendo PCA e MDS ma in entrambi i metodi non imposti una varianza mantenuta desiderata. Ma puoi calcolarlo dalla regolazione che portano a ridurre a k dimensioni. Non è necessario adattarlo perché la prima dimensione ridurrà sempre più la varianza rispetto alla seconda, e la seconda più della terza ...
ll

Risposte:


18

Non ho visto la lezione, quindi non posso commentare ciò che è stato detto.

I miei $ 0,02: se vuoi ottenere buone stime delle prestazioni usando il ricampionamento, dovresti davvero fare tutte le operazioni durante il ricampionamento invece che prima. Questo è vero per la selezione delle funzionalità [1] e per operazioni non banali come PCA. Se aggiunge incertezza ai risultati, includilo nel ricampionamento.

Pensa alla regressione dei componenti principali: PCA seguita da regressione lineare su alcuni dei componenti. Anche i parametri di stima PCA (con rumore) e il numero di componenti devono essere scelti (valori diversi comporteranno risultati diversi => più rumore).

Supponiamo che abbiamo usato un CV di 10 volte con lo schema 1:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

o schema 2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

Dovrebbe essere chiaro che il secondo approccio dovrebbe produrre stime di errore che riflettano l'incertezza causata dalla PCA, la selezione del numero di componenti e la regressione lineare. In effetti, il CV nel primo schema non ha idea di cosa lo abbia preceduto.

Sono colpevole di non fare sempre tutte le operazioni con ricampionamento, ma solo quando non mi interessa davvero le stime delle prestazioni (il che è insolito).

C'è molta differenza tra i due schemi? Dipende dai dati e dalla pre-elaborazione. Se stai solo centrando e ridimensionando, probabilmente no. Se hai un sacco di dati, probabilmente no. Man mano che le dimensioni del set di allenamento diminuiscono, aumenta il rischio di ottenere stime scarse, specialmente se n è vicino a p.

Posso affermare con certezza per esperienza che non includere la selezione di funzioni supervisionate nel ricampionamento è una pessima idea (senza set di formazione di grandi dimensioni). Non vedo perché la pre-elaborazione sia immune a questo (in una certa misura).

@mchangun: penso che il numero di componenti sia un parametro di ottimizzazione e probabilmente vorrai selezionarlo utilizzando stime delle prestazioni che sono generalizzabili. Potresti scegliere automaticamente K in modo tale che almeno l'X% della varianza sia spiegato e includa quel processo all'interno del ricampionamento in modo da tenere conto del rumore in quel processo.

Max

[1] Ambroise, C., & McLachlan, G. (2002). Distorsione di selezione nell'estrazione genica sulla base di dati di espressione genica microarray. Atti della National Academy of Sciences, 99 (10), 6562-6566.


21

Non preelaborare i dati prima di eseguire la trainfunzione! Utilizzare l' preProcess argomento per la funzione del treno e la pre-elaborazione verrà applicata a ciascuna iterazione di ricampionamento.

ad esempio non farlo:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

Fai questo!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

1
Se eseguo il prProcess come da lei suggerito, devo preelaborare nuovi dati quando voglio utilizzare il modello per le previsioni? Al momento, lo faccio solo: pred <- predict(knnFit2, newdata) dove newdatanon è ridimensionato. Caret è abbastanza intelligente da sapere che deve essere preelaborato newdataprima di utilizzarlo per le previsioni?
Mchangun,

7
@mchangun no. caret salva i parametri di pre-elaborazione e pre-elaborerà i nuovi dati nella chiamata predict.caret. è abbastanza liscio!
Zach,
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.