Li as seguintes postagens para validação cruzada aninhada e ainda não tenho 100% de certeza do que devo fazer com a seleção de modelo com validação cruzada aninhada:
- Validação cruzada aninhada para seleção de modelo
- Seleção de modelos e validação cruzada: o caminho certo
Para explicar minha confusão, deixe-me tentar percorrer a seleção do modelo com o método de validação cruzada aninhada passo a passo.
- Crie um loop de CV externo com o K-Fold. Isso será usado para estimar o desempenho dos hiperparâmetros que "venceram" cada loop interno do CV.
- Use o GridSearchCV para criar um loop CV interno, onde, em cada loop interno, o GSCV percorre todas as combinações possíveis do espaço de parâmetros e cria o melhor conjunto de parâmetros.
- Depois que o GSCV encontrou os melhores parâmetros no loop interno, ele é testado com o conjunto de testes no loop externo para obter uma estimativa do desempenho.
- O loop externo é atualizado para a próxima dobra como conjunto de teste e o restante como conjunto de treinamento, e 1-3 repetições. O total possível de parâmetros "vencedores" é o número de dobras designadas no loop externo. Portanto, se o loop externo tiver 5 dobras, você terá uma estimativa de desempenho de um algoritmo com 5 conjuntos diferentes de hiper parâmetros, NÃO o desempenho de um conjunto específico de hiper parâmetros.
Essa abordagem é ilustrada na página de exemplo do SKLearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
Pergunta: Após 4. , como você determina quais hiper parâmetros funcionaram melhor? Entendo que você deseja treinar seu algoritmo (por exemplo, regressão logística, floresta aleatória etc.) com o conjunto de dados COMPLETO no final. Mas como você determina quais hiper parâmetros funcionaram melhor em sua validação cruzada aninhada? Meu entendimento é que, para cada loop interno, um conjunto diferente de hiper parâmetros vencerá. E para o loop externo, você está obtendo uma estimativa do desempenho do GridSearchCV, mas não está obtendo nenhum conjunto específico de hiper parâmetros. Então, na criação do modelo final, como você sabe quais hiper parâmetros usar? Essa é a lógica que falta, que tenho dificuldade em entender de outras etapas.
Agradecemos antecipadamente por qualquer dica, especialmente se @Dikran Marsupial e @cbeleites puderem participar!
Editar: se puder, em sua resposta, use termos como "algoritmo" e "hiper parâmetros". Eu acho que uma fonte de confusão para mim é quando as pessoas usam o termo "modelo" ou "seleção de modelo". Fico confuso se eles estão falando sobre a seleção de qual algoritmo usar ou quais hiper parâmetros usar.
Edit 2: Criei um notebook que mostra duas maneiras de fazer a validação cruzada aninhada. A primeira maneira é a mostrada no exemplo do SKLearn, e a outra mais longa é a que escrevi. A maneira mostrada no SKLearn não expõe os hiperparâmetros "vencedores", mas a minha maneira mais longa sim. Mas a questão permanece a mesma. Depois de concluir a validação cruzada aninhada, mesmo com os hiperparâmetros expostos, o que faço agora? Como você pode ver pelos hiperparâmetros no final do notebook, eles variam bastante.
fonte
Respostas:
(Tenho certeza de que já escrevi a maior parte disso em alguma resposta - mas não consigo encontrá-la agora. Se alguém se deparar com essa resposta, vincule-a). Eu vejo duas abordagens ligeiramente diferentes aqui, que eu acho que são sensatas.
Mas primeiro alguma terminologia:
Eu acho que a diferença entre eles está relacionada à diferença entre alguém que desenvolve novos algoritmos de treinamento que normalmente descrevem uma classe de algoritmos de treinamento junto com alguns parâmetros de direção (os hiperparâmetros) que são difíceis / impossíveis de corrigir (ou pelo menos para corrigir como devem ser decididos / estimados) sem o conhecimento do aplicativo / domínio.
Abordagem 1: exigir resultados de otimização estáveis
Com essa abordagem, o "treinamento do modelo" é o ajuste dos parâmetros do modelo "normal" e são fornecidos hiperparâmetros . Uma validação cruzada interna, por exemplo, cuida da otimização do hiperparâmetro.
A etapa / suposição crucial aqui para resolver o dilema cujo conjunto de hiperparâmetros deve ser escolhido é exigir que a otimização seja estável . A validação cruzada para fins de validação pressupõe que todos os modelos substitutos sejam suficientemente semelhantes ao modelo final (obtido pelo mesmo algoritmo de treinamento aplicado a todo o conjunto de dados) para permitir tratá-los como iguais (entre si e com o modelo final). Se essa suposição se quebrar e
Como os modelos substitutos ainda são iguais (ou equivalentes) entre si, mas não ao modelo final, estamos falando do conhecido viés pessimista da validação cruzada.
Se também o modelo substituto não é igual / equivalente um ao outro, temos problemas com instabilidade .
Para os resultados de otimização do loop interno, isso significa que, se a otimização for estável, não haverá conflito na escolha de hiperparâmetros . E se uma variação considerável for observada nos resultados da validação cruzada interna, a otimização não será estável . As situações instáveis de treinamento têm problemas muito piores do que apenas a decisão de qual parâmetro é escolhido, e eu realmente recomendo dar um passo atrás nesse caso e iniciar o processo de modelagem novamente.
Há uma exceção aqui: porém, pode haver vários mínimos locais na otimização, produzindo desempenho igual para fins práticos. Exigir também que a escolha entre eles seja estável pode ser um forte requisito desnecessário - mas não sei como sair desse dilema.
Observe que se nem todos os modelos produzirem o mesmo conjunto de parâmetros vencedor, você não deve usar estimativas de loop externo como erro de generalização aqui:
Abordagem 2: trate o ajuste do hiperparâmetro como parte do treinamento do modelo
Essa abordagem une as perspectivas do "desenvolvedor do algoritmo de treinamento" e do usuário aplicado do algoritmo de treinamento.
O desenvolvedor do algoritmo de treinamento fornece um algoritmo de treinamento "nu"
model = train_naked (trainingdata, hyperparameters)
. Como o usuário aplicado precisa,tunedmodel = train_tuned (trainingdata)
ele também cuida da fixação dos hiperparâmetros.train_tuned
pode ser implementado, por exemplo, envolvendo um otimizador baseado em validação cruzada em torno do algoritmo de treinamento nutrain_naked
.train_tuned
pode então ser usado como qualquer outro algoritmo de treinamento que não exija entrada de hiperparâmetro, por exemplo, sua saídatunedmodel
pode ser submetida a validação cruzada. Agora, os hiperparâmetros são verificados quanto à estabilidade, assim como os parâmetros "normais" devem ser verificados quanto à estabilidade como parte da avaliação da validação cruzada.Na verdade, é isso que você faz e avalia na validação cruzada aninhada se você mediar o desempenho de todos os modelos vencedores, independentemente de seus conjuntos de parâmetros individuais.
Qual é a diferença?
Possivelmente, acabamos com diferentes modelos finais seguindo essas 2 abordagens:
train_naked (all data, hyperparameters from optimization)
train_tuned (all data)
e - conforme isso executa a otimização do hiperparâmetro novamente no conjunto de dados maior - isso pode acabar com um conjunto diferente de hiperparâmetros.Mas, novamente, a mesma lógica se aplica: se acharmos que o modelo final possui parâmetros substancialmente diferentes dos modelos substitutos de validação cruzada, esse é um sintoma da suposição 1 sendo violada. Então, IMHO, novamente não temos um conflito, mas sim uma verificação se nossas suposições (implícitas) são justificadas. E, se não estiverem, não devemos apostar demais em ter uma boa estimativa do desempenho desse modelo final.
Tenho a impressão (também de ver o número de perguntas / confusões semelhantes aqui no CV) que muitas pessoas pensam em validação cruzada aninhada fazendo a abordagem 1. Mas o erro de generalização geralmente é estimado de acordo com a abordagem 2, então esse é o caminho a seguir. modelo final também.
Exemplo de íris
Resumo: a otimização é basicamente inútil. O tamanho da amostra disponível não permite distinções entre o desempenho de qualquer um dos conjuntos de parâmetros aqui.
Do ponto de vista da aplicação, no entanto, a conclusão é que não importa qual dos quatro conjuntos de parâmetros você escolhe - o que não é uma má notícia: você encontrou um platô de parâmetros comparativamente estável. Aí vem a vantagem da validação aninhada adequada do modelo ajustado: enquanto você não é capaz de afirmar que é o modelo ideal, você ainda pode afirmar que o modelo construído em todos os dados usando a abordagem 2 terá aproximadamente 97% de precisão (intervalo de confiança de 95% para 145 casos corretos em 150 testes: 92 - 99%)
Observe que a abordagem 1 também não está tão longe quanto parece - veja abaixo: sua otimização acidentalmente perdeu um "vencedor" relativamente claro por causa de laços (na verdade, esse é outro sintoma muito revelador do problema do tamanho da amostra).
Embora eu não tenha profundidade suficiente nos SVMs para "ver" que C = 1 deve ser uma boa opção aqui, eu usaria o kernel linear mais restritivo. Além disso, como você fez a otimização, não há nada errado em escolher o conjunto de parâmetros vencedor, mesmo que você saiba que todos os conjuntos de parâmetros levam a um desempenho praticamente igual.
No futuro, no entanto, considere se sua experiência gera estimativas aproximadas de qual desempenho você pode esperar e aproximadamente qual modelo seria uma boa escolha. Em seguida, construa esse modelo (com hiperparâmetros corrigidos manualmente) e calcule um intervalo de confiança para seu desempenho. Use isso para decidir se a tentativa de otimizar é sensata. (Devo acrescentar que estou trabalhando principalmente com dados em que não é fácil obter mais 10 casos independentes - se você estiver em um campo com grandes tamanhos de amostras independentes, as coisas parecerão muito melhores para você)
versão longa:
Quanto aos resultados de exemplo no
iris
conjunto de dados.iris
tem 150 casos, é considerado o SVM com uma grade de 2 x 2 parâmetros (2 núcleos, 2 ordens de grandeza para a penalidadeC
).O loop interno possui divisões de 129 (2x) e 132 (6x) casos. O "melhor" conjunto de parâmetros é indeciso entre o kernel linear ou rbf, ambos com C = 1. No entanto, as exatidões do teste interno são todas (incluindo o C = 10 sempre perdedor) dentro de 94 - 98,5% da precisão observada. A maior diferença que temos em uma das divisões é de 3 vs. 8 erros para rbf com C = 1 vs. 10.
Não há como essa diferença significativa. Não sei como extrair as previsões para casos individuais no currículo, mas mesmo assumindo que os 3 erros foram compartilhados, e o modelo C = 10 cometeu 5 erros adicionais:
Lembre-se de que existem 6 comparações pareadas na grade 2 x 2; portanto, precisamos corrigir várias comparações também.
Abordagem 1
Em 3 das 4 divisões externas em que rbf "venceu" o kernel linear, elas realmente tinham a mesma precisão estimada (acho que min em caso de empate retorna o primeiro índice adequado).
Alterando a grade para
params = {'kernel':['linear', 'rbf'],'C':[1,10]}
rendimentosAbordagem 2:
Aqui
clf
está o seu modelo final. Comrandom_state = 2
, rbf com C = 1 ganha:(acontece cerca de 1 em 5 vezes, 1 em 6 vezes
linear
erbf
comC = 1
empate no ranking 1)fonte
Li sua pergunta e a resposta acima duas vezes (primeira vez há 3 meses). Estou interessado e também quero encontrar a maneira absolutamente apropriada de validação cruzada para meus dados. Depois de muito pensar e ler, parece que encontro os buracos e aqui está minha solução:
Raciocínio:
fonte
Você não usa a validação cruzada aninhada para selecionar os hiper parâmetros do algoritmo; esse método é usado para estimar o erro de generalização do seu procedimento de construção de modelo . Onde, pelo procedimento de construção do modelo, pretendo todas as etapas que você aplicou para alcançar o modelo final que você usará em campo.D e produz como saída um "algoritmo", composto por um conjunto fixo de transformações de pré-processamento, recursos e, finalmente, valores de hiper parâmetros.
Um procedimento de criação de modelo pode ser composto pelas regras que você aplicou para decidir qual pré-processamento aplicar aos dados, qual recurso usar e, finalmente, quais hiperparâmetros usar. Pense nisso como uma espécie de "meta-algoritmo" que recebe como entrada um conjunto de dados específico
Por exemplo, digamos que você tenhaX, y como matriz de design e destino e você deseja treinar um classificador: x recursos em X que têm maior correlação com y .
1. que use apenas o primeiro
2. você escolhe os valores dos hiperparâmetros minimizando uma estimativa de erro de validação cruzada de 10 vezes.
Se você aplicar essas duas etapas a um par específico deX′, y′ você obterá um algoritmo específico com um conjunto definido de recursos e hiper parâmetros fixos que não serão necessariamente os mesmos que você obteria para X, y embora o procedimento de criação do modelo seja idêntico, isto é: etapas 1 + 2 que não estão vinculadas a nenhum conjunto de dados específico.
Digamos que você tenha feito tudo o que precede sem ter dividido seus dados em teste de trem porque possui um pequeno conjunto de dados, como estima o erro de generalização do classificador que você acabou de criar? Você pode usar o melhor erro encontrado na validação cruzada na etapa 2?
Não , o primeiro grande problema está na etapa 1, na qual você usa todos os dados para selecionar os recursos a serem usados. Portanto, mesmo quando você faz a validação cruzada na etapa 2, os recursos já terão visto e lembrado de algumas informações presentes na dobra de teste a cada execução de validação cruzada. O resultado será uma estimativa excessivamente otimista do erro de teste e isso é chamadoapresentam polarização selecção à sua disposição; portanto, em certo sentido, você está ajustando os hiper parâmetros aos seus dados com o risco de superajustá-los, e isso é chamado de viés de seleção de modelo. Para explicar isso em sua estimativa, você precisaria colocar a etapa de seleção de recurso dentro do loop de validação cruzada da etapa 2.
Ok, agora estamos bem? O melhor erro encontrado na validação cruzada com a etapa de seleção de recurso dentro do loop é uma estimativa justa do erro de generalização?
Em teoria, a resposta ainda é não , o problema é que seus hiper parâmetros foram escolhidos para minimizar o erro de validação cruzada no número de conjunto de dados específico de hiper parâmetros a serem ajustados é relativamente grande. Para explicar isso ao estimar o erro de generalização, você aplicaria uma validação cruzada aninhada conforme descrito, que forneceria uma estimativa correta do seu erro de generalização.. Mas isso é uma preocupação na prática? Depende da aplicação específica: é provável que se torne mais severo, como um ajuste excessivo no treinamento, quando o conjunto de dados é pequeno e o
Finalmente, para responder à sua última pergunta, depois de ter uma estimativa justa do seu erro de generalização de "procedimento de construção de modelo" com uma validação cruzada aninhada, você simplesmente aplicaria o procedimento (etapa 1 + 2) a todo o conjunto de dados, obtendo um modelo com um conjunto fixo de recurso e definir valores de hiper parâmetros, mas lembre-se de que o erro que esperamos que este modelo tenha em dados não vistos é a estimativa de validação cruzada aninhada .
fonte