Lidando com bom desempenho em dados de treinamento e validação, mas muito ruim em dados de teste

8

Eu tenho um problema de regressão com 5-6k variáveis. Divido meus dados em três conjuntos não sobrepostos: treinamento, validação e teste. Treino usando apenas o conjunto de treinamento e gere muitos modelos diferentes de regressão linear escolhendo um conjunto diferente de 200 variáveis ​​para cada modelo (eu tento cerca de 100 mil desses subconjuntos). Classifico um modelo como . Usando esse critério, acabo escolhendo um modelo. Acontece que o modelo escolhido tem R ^ 2 muito semelhante nos dados de treinamento e validação. No entanto, quando tento esse modelo nos dados de teste, ele tem R ^ 2 muito menor . Parece que, de alguma forma, estou me adaptando tanto aos dados de treinamento quanto à validação. Alguma idéia de como posso obter um modelo mais robusto? min(Rtraining data2,Rvalidation data2)R2R2

Tentei aumentar o tamanho dos dados de treinamento, mas isso não ajudou. Estou pensando em talvez diminuir o tamanho de cada subconjunto.

Eu tentei usar a regularização. No entanto, os modelos que eu obtenho usando o laço ou a rede elástica têm R ^ 2 muito menor R2no conjunto de treinamento e no conjunto de validação, em comparação com o modelo que eu obtenho fazendo a abordagem de seleção de subconjunto. Portanto, não considero esses modelos, pois presumo que, se o Modelo A tiver um desempenho melhor que o Modelo B, tanto no conjunto de treinamento quanto no conjunto de validação, o Modelo A é claramente melhor que o Modelo B. Eu ficaria muito curioso se você discordo disso.

Em uma nota relacionada, você acha que R2 é um critério ruim para escolher meus modelos?

user10
fonte

Respostas:

5

Embora isso pareça um sobreajuste, acho que é mais provável que você tenha algum tipo de "bug" em seu código ou processo. Começaria verificando se o seu conjunto de testes não é sistematicamente diferente do conjunto de treinamento / validação. Suponha que seus dados sejam classificados por data (ou o que for). Se você usou os primeiros 50% para treinamento, os próximos 25% para validação e o restante para testes, pode estratificar acidentalmente seus dados de uma maneira que torne os dados de treinamento um pouco representativos dos dados de validação, mas menos para o teste de dados. Isso é bastante fácil de fazer por acidente.

Você também deve garantir que não esteja "mergulhando duas vezes" nos dados de validação de alguma forma, o que às vezes acontece acidentalmente.

Como alternativa, o próprio @Frank Harrell da CV relatou que uma única divisão de trem / teste é muitas vezes variável demais para fornecer informações úteis sobre o desempenho de um sistema (talvez ele possa pesar com uma citação ou alguns dados). Você pode considerar algo como validação cruzada ou bootstrapping, que permitiria medir a média e a variação de sua medida de precisão.

Ao contrário do Mikera, não acho que o problema seja o seu mecanismo de pontuação. Dito isto, não consigo imaginar uma situação em que seu , então sugiro uma pontuação usando apenas os dados de validação.Rtraining2<Rvalidation2

De maneira mais geral, acho que ou algo parecido é uma escolha razoável para medir o desempenho de um modelo de saída contínua, supondo que você esteja ciente de suas possíveis advertências. Dependendo exatamente do que você está fazendo, também convém observar o erro máximo ou o pior dos casos. Se você está de alguma forma discretizando sua saída (regressão logística, alguns limites externos), então olhar para precisão / recall / AUC pode ser uma idéia melhor.R2

Matt Krause
fonte
Obrigado pela sua resposta Matt. Na verdade, eu tenho dados classificados por data. Divido-o em 3 partes e uso a primeira parte para treinamento, a próxima parte para validação e a última parte para teste. Para meu aplicativo, os dados de teste sempre serão cronologicamente após o conjunto de treinamento e validação, embora eu possa misturar o conjunto de treinamento e validação da maneira que desejar (incluindo a validação cruzada). Vou tentar a validação cruzada. Embora, eu não espero que faça isso bem, porque meu no conjunto de treinamento e validação está bem próximo. <Rest continuou no próximo comentário>R2
user10
Também vou verificar a variação em para dias diferentes. Se a variação for alta, espero que a validação cruzada seja útil. Caso contrário, eu esperaria que ele desse resultados semelhantes ao ter apenas uma validação definida como eu já tenho. Obrigado novamente! R2
usar o seguinte comando
A encomenda em si não é o problema; é que o conjunto de treinamento pode ser mais representativo do conjunto de validação do que o conjunto de testes. Por exemplo, imagine que você está prevendo as vendas de uma loja. Se o seu conjunto de treinamento contiver junho, julho e agosto, provavelmente também será bom prever as vendas de setembro (o conjunto de validação). No entanto, pode desmoronar completamente quando testado em vendas de novembro e dezembro de: as pessoas estão comprando presentes de Natal e roupas de inverno em vez de calções e protetor solar, etc.
Matt Krause
1

Você está se ajustando demais porque está usando min(training r-square,validation r-square)dados para produzir uma pontuação, que por sua vez está sendo usada para orientar a seleção do modelo. Como é provável que seu quadrado r de treinamento seja igual ou inferior (afinal, você acabou de executar uma regressão), isso é aproximadamente equivalente a fazer a seleção de modelo no quadrado r dos dados de treinamento.

Isso tem o efeito de se ajustar muito bem aos dados de treinamento e ignorar os dados de validação.

Se você usou apenas validation r-squareentão, deve obter um resultado melhor.

Mikera
fonte
Mas não é esse o ponto de ter um conjunto de dados de validação? Não devo escolher apenas um modelo com baixo erro no conjunto de validação (ou seja, fora da amostra)?
usar o seguinte comando
Desculpe, eu entendi um pouco sua pergunta. Eu alterei a resposta.
Mikera
Desde que eu executei uma regressão, meu treinamento geralmente deve ser maior que a validação e, como eu uso o mínimo, não é equivalente a fazer a seleção do modelo usando o conjunto de validação? Acontece que, como uso min, recebo um bom para treinamento e validação, que infelizmente não se traduz no conjunto de testes. Obrigado! R 2 R 2R2R2R2
usar o seguinte comando