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 caret
pacote 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?
fonte
Respostas:
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:
ou esquema 2:
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.
fonte
Não pré-processe os dados antes de executar a
train
função! Use opreProcess
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:
faça isso!
fonte
pred <- predict(knnFit2, newdata)
ondenewdata
não é escalado. A Caret é inteligente o suficiente para saber que precisa pré-processarnewdata
antes de usá-lo para previsões?