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 X
dados reais ( xmat
) são correlacionados entre si e em graus diferentes com a y
variável ( ymat
). Forneci o código R, mas minha pergunta não é sobre R, mas sobre os métodos. Xmat
inclui variáveis X V1 a V100 enquanto ymat
inclui 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 y
base 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:
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,]
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
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 validation
vs CV
? Exemplos trabalhados seriam apreciados.
fonte
Respostas:
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ó.
Medindo o erro de previsão. Uma comparação dos métodos de penalização de validação cruzada, bootstrap e covariância
Estimando a taxa de erro de classificação: Validação cruzada repetida, retenção repetida e autoinicialização
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 validação cruzada de 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 .
fonte
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:
Qualquer situação : use
k-fold cross validation
com 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).
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.
fonte
rms
pacotevalidate
e nascalibrate
funções do R.