Por que não treinar o modelo final em todos os dados após executar os dados de teste da base de ajuste do hiperparâmetro e os dados de validação da base de seleção de modelo?

9

Por dados completos, quero dizer treinar + testar + validação

Depois de corrigir meu hiperparâmetro usando os dados de validação e escolher o modelo usando os dados de teste, não será melhor ter um modelo treinado em todos os dados para que os parâmetros sejam melhor treinados do que ter o modelo treinado apenas dados de trem

Apoorva Abhishekh
fonte
2
NUNCA conserte seus hiperparâmetros usando seus dados de teste. Você acabou de estragar todo o seu experimento removendo seu grupo de controle cego (conjunto de testes).
JahKnows
@JahKnows Depois de terminar de ajustar os hiper parâmetros para um modelo, não entendo o dano, exceto que não saberei o quão bom ele generaliza em um conjunto de dados diferente. Como estraguei meu experimento? estou esquecendo de algo?
Apoorva Abhishekh

Respostas:

8

A questão está sob uma suposição errada. Muitas pessoas fazem o que você diz que "não podem" fazer.

De fato, a implementação da pesquisa de grade no pacote sklearn amplamente implantado faz exatamente isso. A menos que refit=Falseele treine novamente o modelo final usando todos os dados.

Para alguns hiperparâmetros, acho que isso pode não ser muito desejável, porque eles são relativos ao volume de dados. Por exemplo, considere a min_samples_leaftática de pré-poda para uma árvore de decisão . Se você tiver mais dados, a pré-poda pode não ter o desempenho desejado.

Porém, novamente, a maioria das pessoas treina de fato usando os dados completos após a validação cruzada, para que eles acabem com o melhor modelo possível.

Adendo: @NeilSlater diz abaixo que algumas pessoas realizam hold-out em cima do CV. Em outras palavras, eles fazem uma divisão de teste de trem e, em seguida, realizam a seleção do modelo no treinamento. Segundo ele, eles treinam novamente usando o conjunto de treinamento original dividido, mas não o conjunto de testes. O conjunto de testes é então usado para realizar uma estimativa final do modelo. Pessoalmente, vejo três falhas nisso: (a) não resolve o problema que mencionei, com alguns hiperparâmetros dependentes do volume de treinamento, pois você está treinando de qualquer maneira; (b) ao testar muitos modelos, prefiro mais sofisticados métodos como validação cruzada aninhada para que nenhum dado seja desperdiçado e (c) a retenção é um método terrível para inferir como um modelo será generalizado quando você tiver poucos dados.

Ricardo Cruz
fonte
O recurso é sobre a reutilização da validação cruzada, mas ainda não é aconselhável reutilizar os dados de teste, porque você só possui suposições da validação cruzada e não mede o desempenho. Qualquer parâmetro de bug ou problema (como o exemplo que você fornece) pode tornar o modelo indetectivelmente pior.
Neil Slater
@NeilSlater Eu não entendo o que você disse aqui: "O recurso é sobre re-utilizando validação cruzada"
Ricardo Cruz
"feature" -> a refitopção da função GridSearchCV. Ele não se ajusta para incluir dados de teste retidos (nem sequer consegue ver esses dados).
Neil Slater
@ NeilSlater, você pode facilmente verificar o código se não acredita em mim (aqui) . Se refit = True, "ajuste o melhor estimador usando o conjunto de dados inteiro".
Ricardo Cruz
11
@NeilSlater, essa não é a minha experiência, mas adicionei sua experiência ao meu comentário para que outros possam se beneficiar. Obrigado.
Ricardo Cruz
1

Sim você pode.

Como os dados de teste devem vir de distribuição semelhante para treinar dados, você não quebrará seu modelo. Se você treinou o modelo adequadamente, não notará nenhuma alteração significativa (exceto uma métrica de precisão melhor nos dados de teste / validação anteriores).

Mas é raro que os dados de teste sejam precisamente da mesma distribuição que os dados de trem, portanto, no cenário real de caso de aplicativo, você pode obter uma melhor generalização do seu modelo.

Il'ya Zhenin
fonte
11
O problema de incluir os dados de teste de acordo com esta sugestão é que agora você não tem como medir a generalidade do modelo. Sim, você pode esperar que ele generalize melhor. No entanto, você não sabe , porque você removeu sua capacidade de medi-lo. Sugiro acrescentar essa ressalva e explicar por que às vezes isso ainda está bom (por exemplo, ao receber novos dados, você pode tratar isso como um novo conjunto de testes e criar uma nova medição ao longo do tempo, enquanto aproveita o melhor modelo. - é um risco embora)
Neil Slater
@ NeilSlater: Entendo que removi minha capacidade de medir a qualidade geral em um conjunto de dados diferente. Mas, se eu tiver teste e validação, mesmo após o ajuste de hiperparâmetros, posso treinar meu modelo novamente em train + test, ainda restarei um retendo para verificar se o modelo é generalizado. Eu sei que isso é diferente do que eu pedi. Mas eu só quero saber a sua opinião.
Apoorva Abhishekh
11
@ApoorvaAbhishekh: Se você ainda tivesse outro conjunto de dados, então sim, você pode usá-lo como o novo conjunto de testes contra o novo modelo treinado em new_train = {trem antigo, cv antigo, teste antigo}. Então você obteria uma medida de generalização. Embora você tenha cuidado para não usá-lo em excesso - se houver algum problema com o novo conjunto combinado (por exemplo, a parada precoce precisa ser alterada devido a mais dados), você também não poderá usá-lo como o novo conjunto cv. . . a menos que você tenha outro holdout definido na reserva. . .
Neil Slater
@NeilSlater Em teoria, você precisa de um novo conjunto de dados para conhecer o desempenho. Na prática, você pode ter certeza de que seu modelo tem um bom desempenho, pois você trabalhou com ele há muito tempo e sabe o que esperar. Mas geralmente você também tem outros dados para verificar o desempenho de um modelo, por exemplo, na visão computacional - dados não rotulados. Não está certo, mas funciona também. Claro que é um caso extremo, mas quero dizer que pode funcionar. Eu sempre tenho um conjunto de testes que não misturo em treinamento.
Il'ya Zhenin
1

A resposta para esta pergunta depende do algoritmo de treinamento (tecnologia) que você usa. Por exemplo, eu vi algumas abordagens na classificação de conjuntos, nas quais conjuntos de treinamento e validação (mas não testes) são combinados no final. É muito importante saber que mesmo a validação é usada principalmente para decidir os hiper parâmetros, alguns desses parâmetros podem ser uma função dos dados usados ​​para o treinamento. Por exemplo, na validação DNN costumava saber quando parar, porque o ajuste excessivo pode ocorrer como resultado do ajuste contínuo dos parâmetros (pesos) da rede, precisamos de uma maneira de saber quando parar. Sem o conjunto de validação, você estará andando cegamente no processo de treinamento. Por outro lado, se você usar exatamente o mesmo número de iterações especificado anteriormente, existe um grande prob que você não obterá com essas amostras adicionais. O conjunto de testes não deve ser tocado, como indicado acima, sem o conjunto de testes, você não terá um método para avaliar seu modelo. Isso é jogo, você NÃO PODE entregar nenhum modelo ou solução sem a estimativa de sua precisão na verdadeira distribuição de dados (representada pelos dados de teste).

Bashar Haddad
fonte
Eu quis dizer após o treinamento em dados de trem, o ajuste de hiperparâmetros em dados de validação e a escolha do modelo com base nos dados de teste. Posso treinar meu modelo com base em todos os dados. Ou posso combinar os dados de treinamento e os dados de validação após concluir o ajuste do hiperparâmetro e estimar a precisão usando os dados de teste. Desculpas por escrevê-lo incorretamente. Corrigido agora.
Apoorva Abhishekh