Existe uma regra prática sobre como dividir um conjunto de dados em conjuntos de treinamento e validação?

194

Existe uma regra prática sobre como melhor dividir dados em conjuntos de treinamento e validação? Uma divisão par 50/50 é aconselhável? Ou há vantagens claras de ter mais dados de treinamento em relação aos dados de validação (ou vice-versa)? Ou essa escolha depende praticamente do aplicativo?

Eu tenho usado principalmente 80% / 20% dos dados de treinamento e validação, respectivamente, mas eu escolhi essa divisão sem nenhuma razão de princípio. Alguém mais experiente em aprendizado de máquina pode me aconselhar?

robguinness
fonte
Se você não tem muitos dados disponíveis, considere en.wikipedia.org/wiki/Resampling_(statistics)#Jackknife
nair.ashvin

Respostas:

220

Existem duas preocupações concorrentes: com menos dados de treinamento, suas estimativas de parâmetros têm maior variação. Com menos dados de teste, sua estatística de desempenho terá maior variação. Em termos gerais, você deve se preocupar em dividir os dados de modo que nenhuma variação seja muito alta, o que tem mais a ver com o número absoluto de instâncias em cada categoria do que com a porcentagem.

Se você tiver um total de 100 instâncias, provavelmente está preso à validação cruzada, pois nenhuma divisão única fornecerá uma variação satisfatória em suas estimativas. Se você tiver 100.000 instâncias, não importa realmente se você escolhe uma divisão 80:20 ou uma divisão 90:10 (na verdade, você pode optar por usar menos dados de treinamento se o seu método for particularmente intensivo em computação).

Supondo que você tenha dados suficientes para executar dados de teste retidos adequados (em vez de validação cruzada), a seguir é uma maneira instrutiva de lidar com variações:

  1. Divida seus dados em treinamento e teste (80/20 é realmente um bom ponto de partida)
  2. Divida os dados do treinamento em treinamento e validação (novamente, 80/20 é uma divisão justa).
  3. Subamostra as seleções aleatórias dos seus dados de treinamento, treine o classificador com isso e registre o desempenho no conjunto de validação
  4. Tente uma série de execuções com diferentes quantidades de dados de treinamento: colete 20% deles aleatoriamente, digamos, 10 vezes e observe o desempenho nos dados de validação e faça o mesmo com 40%, 60%, 80%. Você verá um desempenho melhor com mais dados, mas também uma variação menor nas diferentes amostras aleatórias
  5. Para controlar a variação devido ao tamanho dos dados de teste, execute o mesmo procedimento ao contrário. Treine todos os seus dados de treinamento, faça uma amostragem aleatória de uma porcentagem de seus dados de validação várias vezes e observe o desempenho. Agora você deve achar que o desempenho médio em pequenas amostras de seus dados de validação é aproximadamente o mesmo que o desempenho em todos os dados de validação, mas a variação é muito maior com números menores de amostras de teste
Ben Allison
fonte
Obrigado, isso também é muito útil! Vou tentar. Para sua informação, tenho cerca de 6000 instâncias de dados de treinamento. Como estou usando o SVM, o desempenho é um problema.
robguinness
1
FWIW, a variação no desempenho pode ser calculada classificando todas as instâncias uma vez, pontuando as decisões sobre se estão corretas ou não e, em seguida, testando essas decisões em vez de instâncias de teste para produzir os efeitos do uso de diferentes tamanhos de conjuntos de testes
Ben Allison
E 6000 casos deve ser o suficiente para que as diferenças entre o uso de 10% ou 20% para o teste não será tão grande (você pode confirmar isso usando o método que eu descreva)
Ben Allison
1
Oi de novo. Estou um pouco confuso no ponto 5. Você disse ", em seguida, faça uma amostragem aleatória de uma porcentagem dos seus dados de validação várias vezes". Você queria ver os dados de teste ? Se eu entendi direito, devo dividir meus dados primeiro em conjuntos de dados de treinamento e teste e, em seguida, dividir parte de alguns dos meus conjuntos de dados de treinamento em um conjunto de dados de validação. Portanto, na etapa 5, se estou medindo a variação nos meus dados de teste, não devo amostrar aleatoriamente populações de meus dados de teste? Ou eu estou esquecendo de alguma coisa?
robguinness
2
O ponto é que, enquanto você brinca com parâmetros, observando os efeitos das mudanças, você deve usar seus dados de validação para testar. Se você começar a analisar os dados do teste e escolher estratégias com base no que obtiver a maior pontuação possível, terá uma sensação inflada do desempenho do seu método. Quando todos os seus parâmetros são ajustados e as decisões tomadas, em seguida, executar em seus dados de teste. Isso permite que você saiba em que tipo de desempenho obterá dados genuinamente novos e não observados (que provavelmente são do seu interesse!)
Ben Allison
54

Você ficaria surpreso ao descobrir que 80/20 é uma proporção bastante comum, geralmente chamada de princípio de Pareto . Geralmente é uma aposta segura se você usar essa proporção.

No entanto, dependendo da metodologia de treinamento / validação empregada, a proporção pode mudar. Por exemplo: se você usar a validação cruzada de 10 vezes, acabaria com um conjunto de validação de 10% em cada dobra.

Houve alguma pesquisa sobre qual é a proporção adequada entre o conjunto de treinamento e o conjunto de validação :

A fração de padrões reservados para o conjunto de validação deve ser inversamente proporcional à raiz quadrada do número de parâmetros ajustáveis ​​livres.

Em sua conclusão, eles especificam uma fórmula:

O conjunto de validação (v) para a proporção de tamanho do conjunto de treinamento (t), v / t, escala como ln (N / h-max), em que N é o número de famílias de reconhecedores e h-max é a maior complexidade dessas famílias.

O que eles querem dizer com complexidade é:

Cada família de reconhecedores é caracterizada por sua complexidade, que pode ou não estar relacionada à dimensão VC , ao comprimento da descrição, ao número de parâmetros ajustáveis ​​ou a outras medidas de complexidade.

Utilizando a primeira regra de ouro (o conjunto de validação deve ser inversamente proporcional à raiz quadrada do número de parâmetros ajustáveis ​​livres), você pode concluir que, se tiver 32 parâmetros ajustáveis, a raiz quadrada de 32 é ~ 5,65, a fração deve ser 1 / 5,65 ou 0,177 (v / t). Aproximadamente 17,7% devem ser reservados para validação e 82,3% para treinamento.

Kiril
fonte
2
O artigo, para aqueles que podem ter problemas para carregá-lo como eu (não sei por que), é: "Uma lei de escala para o tamanho da proporção do conjunto de treinamento" (I. Guyon, 1996, Relatório Técnico Não Publicado, AT&T Bell Laboratories )
Theforestecologist
2
A regra de ouro faz sentido? Se você tiver dois parâmetros ajustáveis, a proporção é 0,77, o que significa que você usaria 77% para validação. No entanto, o problema é a definição de parâmetro livre. Para um SVM linear, você pode definir o parâmetro de penalidade C para o termo de erro, que é um parâmetro, mas a complexidade é maior Dimensão + 1 para um SVM.
Reed Richards
4
Então meu tamanho de teste deve ser 1 se eu tiver uma rede neural ..?
precisa saber é o seguinte
51

No ano passado, participei do curso de aprendizado de máquina on-line do Prof: Andrew Ng. Sua recomendação foi:

Treinamento : 60%

Validação cruzada : 20%

Teste : 20%

Upul Bandara
fonte
20
coursera.org/learn/deep-neural-network/lecture/cxG1s/… in the modern big data era, where, for example, you might have a million examples in total, then the trend is that your dev (cross validation) and test sets have been becoming a much smaller percentage of the total. Ele sugere que poderia ser 99,5: 0,25: 0,25.
Nobu
9

Bem, você deve pensar em mais uma coisa.

Se você tem um conjunto de dados realmente grande, como 1.000.000 de exemplos, a divisão 80/10/10 pode ser desnecessária, porque 10% = 100.000 exemplos não são necessários para saber se o modelo funciona bem.

Talvez 99 / 0,5 / 0,5 seja suficiente, porque 5.000 exemplos podem representar a maior parte da variação nos dados e você pode facilmente dizer que o modelo funciona bem com base nesses 5.000 exemplos em teste e desenvolvimento.

DavidS1992
fonte
0,5% no conjunto de validação pode ser suficiente, mas eu argumentaria que você está assumindo um risco grande e desnecessário, pois não sabe que é suficiente ou não. Seu treinamento pode facilmente dar errado se você estiver usando um conjunto de validação muito pequeno, mas é quase impossível que ele dê errado usando um conjunto de validação grande.
Björn Lindqvist
2

Suponha que você tenha menos dados, sugiro tentar 70%, 80% e 90% e testar o que está dando um melhor resultado. No caso de 90%, há chances de que, para 10% do teste, você tenha baixa precisão.

Rishi Bansal
fonte
1

Talvez 63,2% / 36,8% seja uma escolha razoável. O motivo seria que, se você tivesse um tamanho total da amostra n e desejasse amostrar aleatoriamente com casos de substituição (também conhecidos como re-amostragem, como na estatística de inicialização) n fora do n inicial , a probabilidade de um caso individual ser selecionado no a nova amostra seria de aproximadamente 0,632, desde que n não seja muito pequeno, conforme explicado aqui: https://stats.stackexchange.com/a/88993/16263

Para uma amostra de n = 250, a probabilidade de um caso individual ser selecionado para uma nova amostra com 4 dígitos é 0,6329. Para uma amostra de n = 20000, a probabilidade é 0,6321.

user16263
fonte
1

Tudo depende dos dados disponíveis. Se você tiver uma quantidade considerável de dados, 80/20 é uma boa escolha, como mencionado acima. Porém, se você não fizer a validação cruzada com uma divisão 50/50, poderá ajudá-lo muito mais e impedir que você crie um modelo que ajuste demais seus dados de treinamento.

Mayank
fonte