Como sei qual o melhor método de validação cruzada?


36

Estou tentando descobrir qual método de validação cruzada é melhor para minha situação.

Os dados a seguir são apenas um exemplo para solucionar o problema (em R), mas meus Xdados reais ( xmat) são correlacionados entre si e em graus diferentes com a yvariável ( ymat). Forneci o código R, mas minha pergunta não é sobre R, mas sobre os métodos. Xmatinclui variáveis ​​X V1 a V100 enquanto ymatinclui uma única variável y.

set.seed(1233)
xmat           <- matrix(sample(-1:1, 20000, replace = TRUE), ncol = 100)
colnames(xmat) <- paste("V", 1:100, sep ="")
rownames(xmat) <- paste("S", 1:200, sep ="")
  # the real y data are correlated with xmat
ymat           <- matrix(rnorm(200, 70,20), ncol = 1)
rownames(ymat) <- paste("S", 1:200, sep="")

Eu gostaria de construir um modelo de previsão com ybase em todas as variáveis xmat. Portanto, será um modelo de regressão linear y ~ V1 + V2 + V3+ ... + V100. Em uma revisão, posso ver os três métodos de validação cruzados a seguir:

  1. Divida os dados em cerca de metade e use um para treinamento e outra metade para teste (validação cruzada):

    prop       <- 0.5 # proportion of subset data
    set.seed(1234)
      # training data set 
    training.s <- sample (1:nrow(xmat), round(prop*nrow(xmat),0))
    xmat.train <- xmat[training.s,]
    ymat.train <- ymat[training.s,]
    
      # testing data set 
    testing.s <- setdiff(1:nrow(xmat), training)
    xmat.test <- xmat[testing.s,]
    ymat.test <- ymat[testing.s,]
    
  2. Validação cruzada K-fold - usando validação cruzada 10 vezes:

    mydata <- data.frame(ymat, xmat)
    fit    <- lm(ymat ~ ., data=mydata)
    library(DAAG)
    cv.lm(df=mydata, fit, m=10) # ten-fold cross validation 
    
  3. Mascarando um valor ou poucos valores por vez : neste método, mascaramos aleatoriamente um valor no conjunto de dados (y), substituindo-o por NA e prevendo-o. O processo é repetido n vezes.

    n = 500 
    predicted.v <- rep(NA, n)
    real.v      <- rep(NA, n)
    
    for (i in 1:n){
      masked.id <- sample (1:nrow(xmat), 1)
      ymat1     <- ymat 
      real.v[i] <- ymat[masked.id,]
      ymat1[masked.id,] <- NA
      mydata            <- data.frame(ymat1, xmat)
      fit               <- lm(ymat1 ~ ., data=mydata)
      predicted.v[i]    <- fit$fitted.values[masked.id]
    }
    

Como sei qual é o melhor para qualquer situação? Existem outros métodos? Bootstrap validationvs CV? Exemplos trabalhados seriam apreciados.


Você está interessado em verificar a validade dos dados ou em verificar as estimativas ou valores previstos dos coeficientes b.
Subhash C. Davar

Estou interessado em verificar as estimativas ou valores previstos dos coeficientes b
rdorlearn

O problema que tenho com o método nº 1 é que o tamanho da amostra é muito menor do que o que você tem na realidade. Portanto, as faixas de confiança / variabilidade estimadas provavelmente serão muito maiores. Além disso, acho que os métodos 2 e 3 terão desempenho semelhante. Se eu fosse você, comece com a validação cruzada K-fold para K = 5,6, ..., 14,15 e veja se seus resultados são bastante semelhantes.
Kian

Além disso, você pretende fazer a seleção de modelos para reduzir o número de covariáveis? 100 parece bastante.
Kian

@ user2432701 Não, eu gostaria de usar todos 100.
rdorlearn

Respostas:


34

Como o OP colocou uma recompensa nessa questão, deve atrair alguma atenção e, portanto, é o lugar certo para discutir algumas idéias gerais, mesmo que não responda diretamente ao OP.

Primeiro nome:

a) validação cruzada é o nome geral para todas as técnicas de estimativa / medida que usam um conjunto de testes diferente do conjunto de trens. Sinônimo: estimativas fora da amostra ou extra-amostra. Antônimo: estimativa em amostra.

Estimativa dentro da amostra são técnicas que usam algumas informações no conjunto de treinamento para estimar a qualidade do modelo (não necessariamente erro). Isso é muito comum se o modelo tem um viés alto - isto é - faz fortes suposições sobre os dados. Nos modelos lineares (um modelo de alto viés), como no exemplo da pergunta, utiliza-se o desvio ao quadrado R, AIC, BIC, como medida da qualidade do modelo - todos esses são estimadores dentro da amostra. No SVM, por exemplo, os dados da razão no vetor de suporte para o número de dados são uma estimativa de amostra do erro do modelo.

Existem muitas técnicas de validação cruzada:

b) retenção é o método nº 1 acima. Divida o conjunto em um treinamento e um teste. Há uma longa história de discussões e práticas sobre os tamanhos relativos do conjunto de treinamento e teste.

c) k- fold - método # 2 acima. Bastante padrão.

d) Deixar um fora - método # 3 acima.

e) autoinicialização : se o seu aparelho tiver N dados, selecione aleatoriamente N amostras COM SUBSTITUIÇÃO do aparelho e use-as como treinamento. Os dados do conjunto original que não foram amostras em nenhum momento são usados ​​como o conjunto de teste. Existem diferentes maneiras de calcular a estimativa final do erro do modelo que usa o erro para o conjunto de testes (fora da amostra) e o erro para o conjunto de trens (dentro da amostra). Veja, por exemplo, o .632 bootstrap. Eu acho que também existe uma fórmula .632+ - elas são fórmulas que estimam o verdadeiro erro do modelo usando erros fora da amostra e dentro da amostra.

f) Ortogonal à seleção do método acima é a questão da repetição. Exceto por deixar de fora, todos os métodos acima podem ser repetidos várias vezes. De fato, pode-se falar sobre REPEATED hold-out, ou REPEATED k- fold. Para ser justo, quase sempre o método de autoinicialização é usado de forma repetida.


A próxima pergunta é: qual método é "melhor". O problema é o que "melhor" significa.

1) A primeira resposta é se cada um desses métodos é enviesado para a estimativa do erro do modelo (para uma quantidade infinita de dados futuros).

2) A segunda alternativa é quão rápido ou quão bem cada um desses métodos converge para o verdadeiro erro do modelo (se eles não são tendenciosos). Eu acredito que este ainda é um tópico de pesquisa. Deixe-me apontar para esses dois documentos (atrás do pay-wall), mas o resumo nos dá uma compreensão do que eles estão tentando realizar. Observe também que é muito comum chamar k- fold como "validação cruzada" por si só.

Provavelmente existem muitos outros trabalhos sobre esses tópicos. Esses são apenas alguns exemplos.

3) Outro aspecto de "melhor" é: dada uma medida específica do erro do modelo usando uma das técnicas acima, até que ponto você pode ter certeza de que o erro correto do modelo está próximo.

Em geral, nesse caso, você deseja tomar muitas medidas do erro e calcular um intervalo de confiança (ou um intervalo credível se você seguir uma abordagem bayesiana). Nesse caso, o problema é quanto você pode confiar na variação do conjunto de medidas de erro. Observe que, exceto para deixar de fora, todas as técnicas acima fornecerão muitas medidas diferentes ( k medidas para uma dobra k , n medidas para uma retenção n repetida) e, assim, você poderá medir a variação (ou desvio padrão ) deste conjunto e calcule um intervalo de confiança para a medida de erro.

Aqui as coisas ficam um pouco complicadas. Pelo que entendi do artigo Nenhum estimador imparcial da variação da validação cruzada k- fold (não atrás do paywall), não se pode confiar na variação que você obtém de uma k- fold - portanto, não se pode construir um bom intervalo de confiança a partir de k - dobras. Também pelo que entendi do artigo Testes estatísticos aproximados para comparar algoritmos de aprendizado de classificação supervisionada (não atrás do paywall), técnicas que usam medidas repetidas ( k repetidasretenção repetida e repetida - não tenho certeza sobre o bootstrap) subestimará a verdadeira variação da medida de erro (é um pouco fácil ver isso - já que você está amostrando de um conjunto finito se repetir a medida um número muito grande algumas vezes, os mesmos valores continuarão se repetindo, que mantêm a média a mesma, mas reduzem a variação). Assim, as técnicas de medidas repetidas serão otimistas demais no intervalo de confiança.

Este último artigo sugere fazer duas vezes 5 vezes repetidas - que ele chama de CV 5 × 2 - como um bom equilíbrio de muitas medidas (10), mas não de muitas repetições.

EDITAR:

Obviamente, existem ótimas respostas no Cross Validated para algumas dessas perguntas (embora às vezes elas não concordem entre si). Aqui estão alguns:

Validação cruzada ou bootstrapping para avaliar o desempenho da classificação?

Diferenças entre validação cruzada e bootstrapping para estimar o erro de previsão

Validação cruzada ou bootstrapping para avaliar o desempenho da classificação?

Noções básicas sobre autoinicialização para validação e seleção de modelo

Em geral, a tags é sua amiga aqui.


Então, qual é a melhor solução? Eu não sei. Eu uso CV 5 × 2 quando preciso ser muito rigoroso, quando preciso ter certeza de que uma técnica é melhor que outra, especialmente em publicações. E uso um hold out se não estou planejando fazer alguma medida de variação ou desvio padrão ou se tenho restrições de tempo - há apenas um modelo aprendendo em um hold-out .


Quanto às propriedades de variação complicadas da validação cruzada, acho que é preciso ter cuidado com o que a variação deve ser medida. IIRC, Bengio et al. concentre-se na variação para um conjunto de dados de tamanho n para o problema em questão. Que é diferente (e maior) da incerteza aleatória para as previsões de um modelo de formação sobre os conjunto de dados que tenho em mãos. Veja também a taxonomia de problemas no artigo de Dietterich, acima.
Cbeleites suporta Monica

7

Por favor, consulte a página da Wikipedia para obter as definições dos métodos (elas fazem um trabalho muito melhor do que eu poderia fazer aqui).

Depois de dar uma olhada nessa página, o seguinte pode ser útil para você. Deixe-me focar na parte da pergunta em que alguém deseja escolher um desses métodos para o processo de modelagem. Como essa é uma escolha bastante frequente que se faz, e eles podem se beneficiar de conhecimentos adicionais, eis a minha resposta para duas situações:

  1. Qualquer situação : use k-fold cross validationcom um número adequado de repetições (digamos 5 ou 10).

    • A divisão dos dados em uma metade, o treinamento na primeira metade e a validação na outra é uma etapa da validação cruzada de duas vezes (a outra etapa é repetir o mesmo exercício com as duas metades intercambiadas). Portanto, descarte a estratégia de "dividir os dados pela metade".

    • Muitos documentos de aprendizado de máquina e de mineração de dados usam a validação cruzada k-fold (não tem citação); portanto, use-o, a menos que você tenha muito cuidado nesta etapa.

    • Agora, deixe um método de fora e outros métodos como ' deixe p de fora ' e ' divisão e repetição aleatória ' (essencialmente como o processo de inicialização descrito acima) são definitivamente bons candidatos.

    • Se o tamanho dos seus dados for N, a validação cruzada de dobra em N será essencialmente a mesma que deixar de fora.

    • 'leave p out' e 'bootstrap' são um pouco mais diferentes do que a validação cruzada k fold, mas a diferença está essencialmente na maneira como as dobras são definidas e no número de repetições 'k' que acontecem.

    • Como diz a página da wiki, o k-fold e o ' leave p out ' são estimadores decentes do ' desempenho / ajuste esperado ' (embora as apostas não sejam válidas em relação à variação desses estimadores).

  2. Sua situação: você tem apenas um tamanho de amostra 200 em comparação com o número de recursos (100). Eu acho que há uma chance muito alta de que haja vários modelos lineares com o mesmo desempenho. Eu sugeriria o uso da validação cruzada k-fold com> 10 repetições . Escolha um valor de 3 ou 5.

    • Razão para o valor k: escolha genérica.

    • Razão do valor de repetição: Um valor decentemente alto para repetição é provavelmente crítico aqui, porque a saída de um único cálculo de validação cruzada de dobra em k pode ser aceitável para dobrar a variabilidade / aleatoriedade que introduzimos.

Pensamentos adicionais:

  • Talvez eu também empregasse os métodos ' deixe p de fora ' e ' bootstrap como repetição aleatória de divisão aleatória ' (além da validação cruzada com dobras k) para a mesma medida de desempenho / ajuste para verificar se as saídas do meu método de validação cruzada com dobras k parecem boas.

  • Embora você queira usar todos os 100 recursos, como alguém sugeriu, preste atenção à multicolinearidade / correlação e talvez reduza o número de recursos.


Verifique também esta resposta: stats.stackexchange.com/questions/69291/…
Theja

Eu analisaria muito disso e iria diretamente para o bootstrap de otimismo do Efron-Gong, conforme implementado no rmspacote validatee nas calibratefunções do R.
31575 Frank Fellowsky
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.