Suponha que tenhamos alguém construindo um modelo preditivo, mas que alguém não seja necessariamente versado em princípios estatísticos ou de aprendizado de máquina adequados. Talvez estejamos ajudando essa pessoa enquanto ela está aprendendo, ou talvez essa pessoa esteja usando algum tipo de pacote de software que requer conhecimento mínimo para usar.
Agora, essa pessoa pode muito bem reconhecer que o teste real vem da precisão (ou de qualquer outra métrica) dos dados fora da amostra . No entanto, minha preocupação é que existem muitas sutilezas para se preocupar. No caso simples, eles constroem seu modelo e o avaliam nos dados de treinamento e nos dados de teste retidos. Infelizmente, às vezes pode ser muito fácil nesse ponto voltar e ajustar alguns parâmetros de modelagem e verificar os resultados nos mesmos dados de "teste". Nesse ponto, os dados não são mais verdadeiros fora da amostra e o ajuste excessivo pode se tornar um problema.
Uma maneira potencial de resolver esse problema seria sugerir a criação de muitos conjuntos de dados fora da amostra, de modo que cada conjunto de dados de teste possa ser descartado após o uso e nem reutilizado. Isso requer muito gerenciamento de dados, especialmente que a divisão deve ser feita antes da análise (para que você precise saber quantas divisões anteriormente).
Talvez uma abordagem mais convencional seja a validação cruzada k-fold. No entanto, em certo sentido, isso perde a distinção entre um conjunto de dados de "treinamento" e "teste" que eu acho que pode ser útil, especialmente para aqueles que ainda estão aprendendo. Também não estou convencido de que isso faça sentido para todos os tipos de modelos preditivos.
Existe alguma maneira que eu negligenciei para ajudar a superar o problema de sobreajuste e teste de vazamento, mantendo-me um pouco claro para um usuário inexperiente?
fonte
Respostas:
Você está certo, este é um problema significativo no aprendizado de máquina / modelagem estatística. Essencialmente, a única maneira de realmente resolver esse problema é manter um conjunto de testes independente e mantê-lo em espera até o término do estudo e usá-lo para validação final.
No entanto, inevitavelmente as pessoas analisam os resultados no conjunto de testes e depois mudam seu modelo de acordo; no entanto, isso não resultará necessariamente em uma melhoria no desempenho da generalização, pois a diferença no desempenho de diferentes modelos pode ser em grande parte devido à amostra específica de dados de teste que temos. Nesse caso, ao fazer uma escolha, estamos substituindo efetivamente o erro de teste.
A maneira de limitar isso é fazer com que a variação do erro de teste seja a menor possível (ou seja, a variabilidade no erro de teste que veríamos se usássemos amostras diferentes de dados como o conjunto de testes, extraídas da mesma distribuição subjacente). Isso é mais facilmente alcançado usando um grande conjunto de testes, se possível, ou por exemplo, inicialização ou validação cruzada se não houver muitos dados disponíveis.
Descobri que esse tipo de ajuste excessivo na seleção de modelos é muito mais problemático do que geralmente é apreciado, especialmente no que diz respeito à estimativa de desempenho, consulte
GC Cawley e NLC Talbot, excesso de ajuste na seleção de modelos e viés de seleção subsequente na avaliação de desempenho, Journal of Machine Learning Research, 2010. Research, vol. 11, pp. 2079-2107, julho de 2010 (www)
Esse tipo de problema afeta especialmente o uso de conjuntos de dados de referência, que foram usados em muitos estudos, e cada novo estudo é implicitamente afetado pelos resultados de estudos anteriores, portanto, o desempenho observado provavelmente será uma estimativa super otimista da verdadeira desempenho do método. A maneira como tento contornar isso é olhar para muitos conjuntos de dados (para que o método não seja ajustado para um conjunto de dados específico) e também usar várias divisões aleatórias de teste / treinamento para estimativa de desempenho (para reduzir a variação da estimativa). No entanto, os resultados ainda precisam da ressalva de que esses parâmetros de referência foram excessivos.
Outro exemplo em que isso ocorre é nas competições de aprendizado de máquina com um quadro de líderes baseado em um conjunto de validação. Inevitavelmente, alguns concorrentes continuam mexendo com seu modelo para subir ainda mais no quadro de líderes, mas acabam chegando ao fundo do ranking final. A razão para isso é que suas múltiplas opções superaram o conjunto de validação (aprendendo efetivamente as variações aleatórias no pequeno conjunto de validação).
Se você não pode manter um conjunto de testes estatisticamente puro, receio que as duas melhores opções sejam (i) coletar novos dados para criar um novo conjunto estatisticamente puro ou (ii) fazer a ressalva de que o novo modelo foi baseado em uma escolha feita após observar o erro do conjunto de testes, portanto, a estimativa de desempenho provavelmente apresentará um viés otimista.
fonte
Uma maneira de garantir isso é certificar-se de que você codificou todas as coisas que faz para se ajustar ao modelo, até mesmo "mexer". Dessa forma, quando você executa o processo repetidamente, digamos, através da validação cruzada, mantém as coisas consistentes entre as execuções. Isso garante que todas as fontes potenciais de variação sejam capturadas pelo processo de validação cruzada.
A outra coisa de vital importância é garantir que você tenha uma amostra representativa nos dois conjuntos de dados. Se o seu conjunto de dados não é representativo do tipo de dados que você espera usar para prever, não há muito o que fazer. Toda modelagem se baseia na suposição de que "indução" funciona - as coisas que não observamos se comportam como as que observamos.
Como regra geral, fique longe de procedimentos complexos de ajuste de modelo, a menos que (i) você saiba o que está fazendo e (ii) tenha tentado os métodos mais simples e constatado que eles não funcionam, e como o método complexo corrige o problema. problemas com o método simples. "Simples" e "complexo" são significados no sentido de "simples" ou "complexo" para a pessoa que faz o ajuste. A razão pela qual isso é tão importante é que permite aplicar o que eu gosto de chamar de "teste de detecção" nos resultados. O resultado parece certo? Você não pode "cheirar" os resultados de um procedimento que não entende.
NOTA: a próxima parte bastante longa da minha resposta é baseada na minha experiência, que está na área , com possivelmente grande. Estou quase certo de que o que segue abaixo não seria aplicável ao ou casosN>>p p N≈p N<p
Quando você tem uma amostra grande, a diferença entre usar e não usar uma determinada observação é muito pequena, desde que sua modelagem não seja muito "local". Isso ocorre porque a influência de um determinado ponto de dados geralmente é da ordem de . Portanto, em grandes conjuntos de dados, os resíduos obtidos ao "reter" o conjunto de dados de teste são basicamente os mesmos que você obtém ao usá-los no conjunto de dados de treinamento. Você pode mostrar isso usando mínimos quadrados comuns. O resíduo obtido com a exclusão da ésima observação (ou seja, qual seria o erro do conjunto de testes se colocarmos a observação no conjunto de testes) é , onde é o resíduo do treinamento e1N i etesti=(1−hii)−1etraini etraini hii é a alavanca do th ponto de dados. Agora temos que , onde é o número de variáveis na regressão. Agora, se , é extremamente difícil para qualquer ser grande o suficiente para fazer uma diferença apreciável entre os erros do conjunto de testes e do conjunto de treinamento. Podemos tomar um exemplo simplificado, suponha que (intercepto e variável), a matriz de projeto seja (ambos os conjuntos de treinamento e teste) e a alavancagemi ∑ihii=p p N>>p hii p=2 1 N×p X
Onde , e . Por fim, é a variável preditora padronizada e mede quantos desvios padrão estão da média. Portanto, sabemos desde o início que o erro do conjunto de testes será muito maior que o erro do conjunto de treinamento para observações "na borda" do conjunto de treinamento. Mas é basicamente essa questão representativa novamente - as observações "no limite" são menos representativas do que as observações "no meio". Além disso, é necessário solicitar . Então, se você tiver observações, mesmo quex¯¯¯=N−1∑ixi x2¯¯¯¯¯=N−1∑ix2i s2x=x2¯¯¯¯¯−x¯¯¯2 x~i=xi−x¯¯¯sx xi 1N 100 x~i=5 (um outlier no espaço x pela maioria das definições), isso significa , e o erro de teste é subestimado por um fator de apenas . Se você tiver um conjunto de dados grande, digamos , é ainda menor, , que é menor que . De fato, para observações, seria necessário uma observação de para fazer uma subestimação de do erro do conjunto de testes, usando o erro do conjunto de treinamento.hii=26100 1−26100=74100 10000 1−2610000 1% 10000 x~=50 25%
Portanto, para grandes conjuntos de dados, o uso de um conjunto de testes não é apenas ineficiente, mas também desnecessário, desde que . Isso se aplica ao OLS e também se aplica aproximadamente aos GLMs (os detalhes são diferentes para o GLM, mas a conclusão geral é a mesma). Em mais de dimensões, os "outliers" são definidos pelas observações com grandes pontuações no "componente principal". Isso pode ser mostrado escrevendo Onde é a matriz de vetor próprio (ortogonal) para , com matriz de valor próprio . Nós temos queN>>p 2 hii=xTiEET(XTX)−1EETxi E XTX Λ hii=zTiΛ−1zi=∑pj=1z2jiΛjj zi=ETxi é a principal pontuação do componente para .xi
Se o seu conjunto de testes tiver observações, você obterá uma versão matricial , em que e são as linhas da matriz de design no conjunto de testes. Portanto, para a regressão OLS, você já sabe quais seriam os erros do "conjunto de testes" para todas as divisões possíveis dos dados em conjuntos de treinamento e teste. Nesse caso ( ), não há necessidade de dividir os dados. Você pode relatar erros de "melhor ou pior caso" de conjunto de teste de quase qualquer tamanho sem precisar dividir os dados. Isso pode economizar muito tempo e recursos do PC.k etest{k}=(Ik−H{k})−1etrain{k} H{k}=X{k}(XTX)−1XT{k} X{k} N>>p
Basicamente, tudo isso se reduz ao uso de um termo de penalidade, para explicar a diferença entre erros de treinamento e teste, como BIC ou AIC. Isso efetivamente alcança o mesmo resultado que o uso de um conjunto de testes, no entanto, você não é obrigado a jogar fora informações potencialmente úteis. Com o BIC, você está aproximando a evidência do modelo, que se parece matematicamente com:
Observe que, neste procedimento, não podemos estimar nenhum parâmetro interno - cada modelo deve ser totalmente especificado ou ter seus parâmetros internos integrados. No entanto, podemos fazer com que isso pareça validação cruzada (usando uma função de perda específica) usando repetidamente a regra do produto e, em seguida, registrando o resultado:Mi
Isso sugere uma forma de validação cruzada, mas onde o conjunto de treinamento está sendo atualizado constantemente, uma observação de cada vez do conjunto de testes - semelhante ao Kalman Filter. Prevemos a próxima observação do conjunto de testes usando o conjunto de treinamento atual, medimos o desvio do valor observado usando a probabilidade condicional de log e, em seguida, atualizamos o conjunto de treinamento para incluir a nova observação. Mas observe que este procedimento digere completamente todos os dados disponíveis, enquanto ao mesmo tempo garante que todas as observações sejam testadas como um caso "fora da amostra". Também é invariável, pois não importa o que você chama de "observação 1" ou "observação 10"; o resultado é o mesmo (os cálculos podem ser mais fáceis para algumas permutações do que outras). A função de perda também é "adaptativa", pois se definirmosLi=log[p(yi|y1…yi−1MiI)] , então a nitidez de depende de , porque a função de perda está sendo constantemente atualizada com novos dados.Li i
Eu sugeriria que avaliar modelos preditivos dessa maneira funcionaria muito bem.
fonte
Suponho que a única maneira de garantir isso é que outra pessoa tenha os dados de teste . Em um relacionamento cliente-consultor, isso pode ser gerenciado com bastante facilidade: o cliente fornece ao consultor o conjunto de treinamento sobre o qual os modelos serão construídos e, dentro desse conjunto de treinamento, o consultor pode dividir os dados da maneira que for necessária para garantir que o excesso de ajuste não ocorra. ocorrer; posteriormente, os modelos são devolvidos ao cliente para uso em seus dados de teste.
Para um pesquisador individual, é lógico que as melhores práticas seriam, portanto, imitar essa configuração. Isso significaria coletar alguns dados para teste, depois que toda a seleção do modelo tiver sido realizada. Infelizmente, como você diz, isso não é praticado por muitas pessoas, e até acontece com pessoas que deveriam conhecer melhor!
No entanto, em última análise, depende de para que o modelo está sendo usado. Se você está interessado apenas em prever esse único conjunto de dados, talvez possa superestimar tudo o que quiser? No entanto, se você estiver tentando promover seu modelo como um que generalize bem, ou use o modelo em alguma aplicação do mundo real, é claro que isso é de grande importância.
Há uma questão secundária que eu pensei que deveria mencionar, que é que, mesmo se você seguir todos os procedimentos corretamente, ainda poderá acabar com os modelos que estão sobreajustados, porque os dados não são realmente iid . Por exemplo, se houver correlações temporais nos dados, se você coletar todos os dados de treinamento das vezes de 1 a 3 e testar na hora 4, poderá descobrir que o erro de previsão é maior que o esperado. Como alternativa, poderia haver artefatos específicos do experimento, como o dispositivo de medição em uso ou o conjunto de sujeitos em experimentos em humanos, que faz com que a generalização dos modelos seja pior que o esperado.
fonte
view
permissões de banco de dados definidas de acordo, onde algumas equipes são privadas de dados de teste e outras são cegas.Esta é uma pergunta muito boa e um problema muito sutil. É claro que existem os erros mal intencionados, que derivam de alguém tentando enganá-lo. Mas há uma questão mais profunda de como evitar vazamentos acidentais e evitar erros honestos.
Deixe-me listar algumas boas práticas operacionais. Todos eles se originam de erros honestos que cometi em algum momento:
fonte
Muitos pontos importantes foram abordados nas excelentes respostas que já foram dadas.
Ultimamente, desenvolvi esta lista de verificação pessoal para independência estatística dos dados de teste:
Há outro tipo peculiar de vazamento de dados em meu campo: fazemos espectroscopia espacialmente resolvida de tecidos biológicos. A rotulagem de referência dos espectros de teste precisa ser cegada em relação às informações espectroscópicas, mesmo que seja tentador usar uma análise de cluster e depois descobrir qual classe cada grupo pertence (que seriam dados de teste semi-supervisionados que não são independente).
Por último, mas certamente não menos importante: ao codificar a validação de reamostragem, eu realmente verifico se os índices calculados no conjunto de dados não levam à captura de linhas de teste de pacientes, dias de treinamento etc.
Observe que a "divisão não realizada para garantir a independência" e a "divisão antes que ocorra qualquer cálculo que envolva mais de um caso" também pode ocorrer com testes que afirmam usar um conjunto de testes independente e este último, mesmo que o analista de dados seja cego para a referência dos casos de teste. Esses erros não podem ocorrer se os dados de teste forem retidos até que o modelo final seja apresentado.
* Estou usando pacientes como a hierarquia mais alta em dados apenas para facilitar a descrição.
** Sou químico analítico: a deriva do instrumento é um problema conhecido. De fato, parte da validação dos métodos de análise química é determinar com que freqüência as calibrações precisam ser verificadas em relação às amostras de validação e com que frequência a calibração precisa ser refeita.
FWIW: Na prática, trato de aplicativos em que
Pessoalmente, ainda não encontrei o aplicativo em que, para o desenvolvimento do classificador, recebo casos independentes suficientes para permitir a retirada de um conjunto de testes independente adequado. Assim, cheguei à conclusão de que a validação de reamostragem corretamente feita é a melhor alternativa enquanto o método ainda está em desenvolvimento. Estudos de validação adequados precisarão ser realizados eventualmente, mas é um enorme desperdício de recursos (ou os resultados não levarão informações úteis devido à variação), enquanto o desenvolvimento do método está em um estágio em que as coisas ainda mudam.
fonte
Se bem me lembro, algumas das competições de previsão (como a Netflix ou as do Kaggle) usam este esquema:
Existe um conjunto de treinamento, com as "respostas". Existe o conjunto de testes nº 1, para o qual o pesquisador fornece respostas. O pesquisador descobre sua pontuação. Existe o conjunto de testes nº 2, para o qual o pesquisador fornece respostas, MAS o pesquisador não descobre sua pontuação. O pesquisador não sabe quais casos de previsão estão nos itens 1 e 2.
Em algum momento, o conjunto 2 deve ficar visível, mas você pelo menos limitou a contaminação.
fonte
Em alguns casos, como preditores baseados em sequências biológicas, não é suficiente garantir que os casos não apareçam em mais de um conjunto. Você ainda precisa se preocupar com a dependência entre os conjuntos.
Por exemplo, para preditores baseados em sequência, é necessário remover a redundância garantindo que as seqüências em conjuntos diferentes (incluindo os diferentes conjuntos de validação cruzada) não compartilhem um alto nível de similaridade de sequência.
fonte
Eu diria que "validação cruzada k-fold" é a resposta certa do ponto de vista teórico, mas sua pergunta parece mais sobre coisas organizacionais e de ensino, então responderei de maneira diferente.
Quando as pessoas "ainda estão aprendendo", geralmente é pensado como se aprendessem a " aplicar rápida e diretamente" os algoritmos e todo o conhecimento "extra" (motivação do problema, preparação do conjunto de dados, validação, análise de erros, dicas práticas e assim por diante) ) serão aprendidos "mais tarde" quando estiverem "mais preparados".
Isto está totalmente errado.
Se queremos que um aluno ou quem entenda a diferença entre um conjunto de testes e um conjunto de treinamento, o pior será dar os dois conjuntos a dois indivíduos diferentes, como se pensássemos que "nesta fase" o "conhecimento extra" é prejudicial. É como uma abordagem em cascata no desenvolvimento de software - alguns meses de design puro, depois alguns meses de codificação pura, depois alguns meses de testes puros e um resultado descartável no final.
O aprendizado não deve ser uma cascata. Todas as partes da aprendizagem - motivação do problema, algoritmo, dicas práticas, avaliação de resultados - devem se reunir, em pequenas etapas. (Como abordagem ágil no desenvolvimento de software).
Talvez todo mundo aqui tenha passado pelo ml-class.org de Andrew Ng - eu colocaria o curso dele como um exemplo de um estilo de aprendizado "ágil" e robusto, se você preferir - o que nunca produziria uma questão de "como garantir que os dados de teste não vazem para os dados de treinamento ".
Note que eu posso ter entendido completamente sua pergunta, então peço desculpas! :)
fonte