Validação cruzada de PCA e k-fold no pacote de intercalação em R

16

Acabei de assistir novamente a uma palestra do curso Machine Learning no Coursera. Na seção em que o professor discute o PCA para pré-processamento de dados em aplicativos de aprendizado supervisionado, ele diz que o PCA deve ser executado apenas nos dados de treinamento e, em seguida, o mapeamento é usado para transformar os conjuntos de testes e validação cruzada. Consulte também PCA e a divisão trem / teste .

No entanto, no caretpacote R, os dados de treinamento que você passa para a train()função já são processados ​​pelo PCA. Portanto, quando o algoritmo executa validação cruzada k-fold, o conjunto de validação cruzada já foi processado com o PCA viapreProcess() e predict()e é, de facto, usado no APC "encaixe".

Meu entendimento da situação está correto? Ou seja, o procedimento de intercalação com validação cruzada com PCA (ou, de fato, com qualquer método de redimensionamento / centralização) está "errado" porque o pré-processamento dos dados é realizado no conjunto de validação cruzada e no conjunto de treinamento? E se sim, qual o impacto que isso teria nos resultados?

Mchangun
fonte
11
Pergunta interessante. O professor Ng fornece razões pelas quais "o PCA deve ser executado apenas nos dados de treinamento e, em seguida, o mapeamento é usado para transformar a validação cruzada e os conjuntos de testes"? Minha intuição é que o impacto seja mínimo, já que se supõe que os dados de train / cv / test provêm da mesma distribuição e o PCA não envolve as variáveis ​​de saída / dependentes.
precisa
11
@miura Sim, ele faz. Ao executar o PCA, precisamos resolver o número mínimo de dimensões k nos vetores de saída necessários para atingir a "variação retida" desejada. Este parâmetro k agora está em vigor (no meu entendimento), um parâmetro extra do nosso algoritmo que precisamos ajustar. Se também executarmos o PCA no conjunto de validação cruzada, estamos treinando uma parte do nosso algoritmo no conjunto de CV, diminuindo assim o valor da validação cruzada.
Mchangun
Eu acho que você está confundindo PCA e MDS, mas em ambos os métodos você não define uma variação retida desejada. Mas você pode calculá-lo a partir do ajuste que eles trazem para reduzir para k dimensões. Você não precisa ajustá-lo porque a primeira dimensão sempre reduzirá mais variação do que a segunda e a segunda mais do que a terceira ...
llrs

Respostas:

18

Eu não vi a palestra, então não posso comentar sobre o que foi dito.

Meus US $ 0,02: se você deseja obter boas estimativas de desempenho usando a reamostragem, realmente deve executar todas as operações durante a reamostragem em vez de antes. Isso é realmente verdade tanto na seleção de recursos [1] quanto nas operações não triviais como o PCA. Se adicionar incerteza aos resultados, inclua-a na reamostragem.

Pense na regressão de componentes principais: PCA seguido de regressão linear em alguns dos componentes. O PCA estima parâmetros (com ruído) e o número de componentes também deve ser escolhido (valores diferentes resultarão em resultados diferentes => mais ruído).

Digamos que usamos CV de 10 vezes com o esquema 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:

ou esquema 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:

Deve ficar claro que a segunda abordagem deve produzir estimativas de erro que refletem a incerteza causada pelo PCA, seleção do número de componentes e regressão linear. De fato, o currículo no primeiro esquema não faz ideia do que o precedeu.

Sou culpado de nem sempre fazer todas as operações com reamostragem, mas apenas quando realmente não me importo com estimativas de desempenho (o que é incomum).

Existe muita diferença entre os dois esquemas? Depende dos dados e do pré-processamento. Se você está apenas centralizando e dimensionando, provavelmente não. Se você tem uma tonelada de dados, provavelmente não. À medida que o tamanho do conjunto de treinamento diminui, o risco de obter estimativas ruins aumenta, especialmente se n estiver próximo de p.

Posso afirmar com certeza pela experiência que não incluir a seleção supervisionada de recursos na reamostragem é uma péssima ideia (sem grandes conjuntos de treinamento). Não vejo por que o pré-processamento seria imune a isso (até certo ponto).

@mchangun: Eu acho que o número de componentes é um parâmetro de ajuste e você provavelmente deseja selecioná-lo usando estimativas de desempenho que são generalizáveis. Você pode escolher K automaticamente, de modo que pelo menos X% da variação seja explicada e inclua esse processo na reamostragem, para que contabilizemos o ruído nesse processo.

Máx.

[1] Ambroise, C., & McLachlan, G. (2002). Viés de seleção na extração de genes com base em dados de expressão de genes de microarrays. Anais da Academia Nacional de Ciências, 99 (10), 6562-6566.

topepo
fonte
21

Não pré-processe os dados antes de executar a trainfunção! Use o preProcess argumento para a função train, e o pré-processamento será aplicado a cada iteração de re-amostragem.

por exemplo , não faça isso:

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"))

faça isso!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))
Zach
fonte
11
Se eu executar o pré-processo conforme sugerido, preciso pré-processar novos dados quando desejar usar o modelo para previsões? No momento, eu apenas faço: pred <- predict(knnFit2, newdata) onde newdatanão é escalado. A Caret é inteligente o suficiente para saber que precisa pré-processar newdataantes de usá-lo para previsões?
mchangun
7
@mchangun no. O circunflexo salva os parâmetros de pré-processamento e pré-processa os novos dados na chamada prever.caret. é bem liso!
Zach