Como dividir o conjunto de dados para validação cruzada, curva de aprendizado e avaliação final?

70

Qual é a estratégia apropriada para dividir o conjunto de dados?

I pedir feedback sobre a abordagem seguinte (não sobre os parâmetros individuais como test_sizeou n_iter, mas se eu usasse X, y, X_train, y_train, X_test, e y_testde forma adequada e se a sequência faz sentido):

(estendendo este exemplo da documentação do scikit-learn)

1. Carregue o conjunto de dados

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Divida o conjunto de treinamento e teste (por exemplo, 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Escolha um estimador

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Escolha o iterador de validação cruzada

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Ajuste os hiperparâmetros

aplicando o iterador de validação cruzada no conjunto de treinamento

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Algoritmo de depuração com curva de aprendizado

X_trainé dividido aleatoriamente em um treinamento e um conjunto de testes 10 vezes ( n_iter=10). Cada ponto na curva de treinamento de pontuação é a média de 10 pontos, onde o modelo foi treinados e avaliados no primeiro i exemplos de treinamento. Cada ponto na curva pontuação validação cruzada é a média de 10 pontos, onde o modelo foi treinado nos primeiros i exemplos de treinamento e avaliados em todos os exemplos do conjunto de teste.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Curva de aprendizado

plot_learning_curve () pode ser encontrado na versão atual do desenvolvedor do scikit-learn (0.15-git).

7. Avaliação final no conjunto de testes

classifier.score(X_test, y_test)

7a Teste de ajuste excessivo na seleção de modelos com validação cruzada aninhada (usando todo o conjunto de dados)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Pergunta adicional: faz sentido substituir a etapa 7 pela validação cruzada aninhada? Ou a cv aninhada deve ser vista como complementar à etapa 7

(o código parece funcionar com a validação cruzada k-fold no scikit-learn, mas não com o shuffle & split. Portanto, cvprecisa ser alterado acima para que o código funcione)

8. Treine o modelo final em todo o conjunto de dados

classifier.fit(X, y)

Edição: Agora eu concordo com cbeleites que o passo 7a não faz muito sentido nesta sequência. Então eu não adotaria isso.

manobrar
fonte
Qual regra de pontuação de precisão você está usando? Se for a precisão da classificação, uma regra de pontuação inadequada irá desfazer grande parte do trabalho que você realizou.
Frank Harrell
Eu usei o padrão que é realmente a precisão da classificação. Eu sei que, por exemplo, F1 seria mais apropriado. Mas aqui estou interessado apenas se as divisões forem usadas OK.
Tobip
3
Estou quase certo de que F1 é um novo nome para um conceito antigo. Eu acho que é contraproducente inventar novos nomes para coisas antigas. Mais importante, é uma regra de pontuação inadequada que resultará na seleção dos recursos errados e na adição de bastante ruído a todo o processo.
Frank Harrell
3
... em qualquer caso, a F1 compartilha os problemas de precisão que @FrankHarrell alude: eles decorrem da contagem de frações de casos de teste de classificações rígidas. Para obter uma das regras de pontuação adequadas de Frank, você precisa mudar para a saída probabilística do SVM e, por exemplo, usar a pontuação de Brier (erro quadrático médio) em vez da precisão. Eu acho que você também pode derivar uma versão do tipo MSE da F1. Tais medidas devem ser realmente melhores para a etapa de ajuste. Para comunicar o desempenho final, você também pode precisar das formas típicas (por exemplo, precisão, F1) de expressar o desempenho para sua comunidade.
Cbeleites
11
@ ta.ft: se a abordagem está errada ou não, depende do que você considera errado: a pesquisa em grade em proporções tem um sério risco de varrer a menos que você tenha um número ridiculamente grande de casos independentes. Portanto, para muitas situações, a alegação de que a pesquisa em grade produz o modelo ideal está errada. No entanto, se você fizer uma validação aninhada adequada, a validação externa fornecerá uma medida honesta do desempenho "ideal" do modelo escolhido. Então isso não está errado. Você simplesmente não tem garantia de que a pesquisa na grade tenha o modelo ideal. Quanto à literatura, atualizarei minha resposta.
Cbeleites 5/05

Respostas:

41

Não tenho certeza do que você deseja fazer na etapa 7a. Pelo que entendi agora, não faz sentido para mim.

Aqui está como eu entendo sua descrição: na etapa 7, você deseja comparar o desempenho de retenção com os resultados de uma validação cruzada que abrange as etapas 4 a 6. (portanto, sim, isso seria uma configuração aninhada).

Os principais pontos por que não acho que essa comparação faz muito sentido são:

  • Essa comparação não pode detectar duas das principais fontes de resultados de validação super-otimistas que encontro na prática:

    • vazamentos de dados (dependência) entre os dados de treinamento e teste causados ​​por uma estrutura hierárquica (também conhecida como cluster) e que não são contabilizados na divisão. No meu campo, normalmente temos várias (às vezes milhares) de leituras (= linhas na matriz de dados) do mesmo paciente ou replicação biológica de um experimento. Como não são independentes, a divisão da validação precisa ser feita no nível do paciente. No entanto, esse vazamento de dados ocorre, você o terá na divisão para o conjunto de espera e na divisão de validação cruzada. O processo de retenção é tão otimista quanto a validação cruzada.

    • Pré-processamento dos dados feitos em toda a matriz de dados, onde os cálculos não são independentes para cada linha, mas muitas / todas as linhas são usadas para calcular parâmetros para o pré-processamento. Exemplos típicos seriam, por exemplo, uma projeção de PCA antes da classificação "real".
      Novamente, isso afetaria sua validação de espera e a cruz externa, portanto você não pode detectá-la.

    Para os dados com os quais trabalho, ambos os erros podem facilmente subestimar a fração de erros de classificação em uma ordem de magnitude!

  • Se você estiver restrito a esse tipo de desempenho de fração contada de casos de teste, as comparações de modelos precisarão de números extremamente grandes de casos de teste ou diferenças ridiculamente grandes no desempenho real. Comparar dois classificadores com dados de treinamento ilimitados pode ser um bom começo para outras leituras.

No entanto, comparando a qualidade do modelo, a validação cruzada interna reivindica para o modelo "ótimo" e a validação cruzada externa ou retém a validação faz sentido: se a discrepância for alta, é questionável se a otimização da pesquisa na grade funcionou (você pode ter variação desnatada devido à alta variação da medida de desempenho). Essa comparação é mais fácil, pois você pode identificar problemas se a estimativa interna for ridiculamente boa em comparação com a outra - se não for, não será necessário se preocupar muito com a otimização. Mas, em qualquer caso, se sua medida externa (7) do desempenho for honesta e sólida, você terá pelo menos uma estimativa útil do modelo obtido, seja ele ideal ou não.

IMHO medir a curva de aprendizado ainda é um problema diferente. Eu provavelmente lidaria com isso separadamente, e acho que você precisa definir mais claramente para o que precisa a curva de aprendizado (você precisa da curva de aprendizado para um conjunto de dados do problema, dos dados e do método de classificação ou da curva de aprendizado? para esse conjunto de dados do problema, dados e método de classificação fornecidos) e várias outras decisões (por exemplo, como lidar com a complexidade do modelo em função do tamanho da amostra de treinamento? Otimize tudo novamente, use hiperparâmetros fixos, decida sobre função para corrigir hiperparâmetros, dependendo do tamanho do conjunto de treinamento?)

(Meus dados geralmente têm tão poucos casos independentes para obter a medida da curva de aprendizado suficientemente precisa para usá-la na prática - mas você pode ser melhor se suas 1200 linhas forem realmente independentes)


update: O que há de "errado" no exemplo do scikit-learn?

Antes de tudo, nada está errado com a validação cruzada aninhada aqui. A validação aninhada é de extrema importância para a otimização orientada a dados, e a validação cruzada é uma abordagem muito poderosa (principalmente se iterada / repetida).

Então, se algo está errado, depende do seu ponto de vista: desde que você faça uma validação aninhada honesta (mantendo os dados de teste externos estritamente independentes), a validação externa é uma medida adequada do desempenho do modelo "ideal". Nada de errado com isso.

Porém, várias coisas podem dar errado na pesquisa em grade dessas medidas de desempenho do tipo proporção para o ajuste do SVM por hiperparâmetro. Basicamente, eles significam que você (provavelmente?) Não pode confiar na otimização. No entanto, desde que sua divisão externa tenha sido realizada corretamente, mesmo que o modelo não seja o melhor possível, você terá uma estimativa honesta do desempenho do modelo obtido.

Vou tentar dar explicações intuitivas sobre por que a otimização pode estar com problemas:

  • p^np
    Var(p^)=p(1p)n

    Você precisa de um número ridiculamente grande de casos (pelo menos em comparação com o número de casos que geralmente posso ter) para obter a precisão necessária (senso de viés / variância) para estimar recall, precisão (senso de desempenho de aprendizado de máquina). É claro que isso também se aplica a proporções calculadas a partir de tais proporções. Dê uma olhada nos intervalos de confiança para proporções binomiais. Eles são surpreendentemente grandes! Frequentemente maior que a verdadeira melhoria no desempenho em relação à grade de hiperparâmetros. E estatisticamente falando, a pesquisa na grade é um enorme problema de comparação múltipla: quanto mais pontos da grade você avaliar, maior o risco de encontrar alguma combinação de hiperparâmetros que acidentalmente pareça muito boa para a divisão de teste / trem que você está avaliando. É isso que eu quero dizer com variação de skimming.

  • Intuitivamente, considere uma mudança hipotética de um hiperparâmetro, que lentamente causa a deterioração do modelo: um caso de teste se move em direção ao limite de decisão. As medidas de desempenho de proporção "rígida" não detectam isso até que o caso ultrapasse a fronteira e esteja do lado errado. No entanto, eles atribuem imediatamente um erro completo a uma alteração infinitamente pequena no hiperparâmetro.
    Para fazer a otimização numérica, você precisa que a medida de desempenho seja bem comportada. Isso significa: nem a parte nervosa (não continuamente diferenciável) da medida de desempenho do tipo proporção nem o fato de que, além desse salto, as mudanças ocorridas na verdade não sejam detectadas são adequadas para a otimização.
    Regras de pontuação adequadas são definidas de uma maneira particularmente adequada para otimização. Eles têm seu máximo global quando as probabilidades previstas correspondem às verdadeiras probabilidades de cada caso pertencer à classe em questão.

  • Para SVMs, você tem o problema adicional de que não apenas as medidas de desempenho, mas também o modelo reagem dessa maneira irregular: pequenas alterações no hiperparâmetro não mudam nada. O modelo muda apenas quando os hiperparâmetros são alterados o suficiente para fazer com que alguns casos deixem de ser vetor de suporte ou se tornem vetor de suporte. Novamente, esses modelos são difíceis de otimizar.

Literatura:


Atualização II: variação de desnatação

o que você pode pagar em termos de comparação de modelos depende obviamente do número de casos independentes. Vamos fazer uma simulação rápida e suja sobre o risco de varredura de skimming aqui:

scikit.learndiz que eles têm 1797 estão nos digitsdados.

  • 10×10
  • suponha que ambos os parâmetros (faixas) não afetem os modelos,
  • ou seja, todos os modelos têm o mesmo desempenho real de, digamos, 97% (desempenho típico para o digitsconjunto de dados).

  • 104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")

Aqui está a distribuição para o melhor desempenho observado:

simulação de variação de skimming

A linha vermelha marca o verdadeiro desempenho de todos os nossos modelos hipotéticos. Em média, observamos apenas 2/3 da taxa de erro real para o aparentemente melhor dos 100 modelos comparados (para a simulação, sabemos que todos eles funcionam igualmente com 97% de previsões corretas).

Esta simulação é obviamente muito simplificada:

  • Além da variação do tamanho da amostra de teste, há pelo menos a variação devido à instabilidade do modelo, portanto, estamos subestimando a variação aqui
  • Os parâmetros de ajuste que afetam a complexidade do modelo geralmente cobrem conjuntos de parâmetros nos quais os modelos são instáveis ​​e, portanto, apresentam alta variação.
  • Para os dígitos UCI do exemplo, a base de dados original possui ca. 11000 dígitos escritos por 44 pessoas. E se os dados forem agrupados de acordo com a pessoa que escreveu? (Ou seja, é mais fácil reconhecer um 8 escrito por alguém, se você souber como essa pessoa escreve, digamos, um 3?) O tamanho efetivo da amostra pode ser tão baixo quanto 44.
  • Os hiperparâmetros do modelo de ajuste podem levar à correlação entre os modelos (de fato, isso seria considerado bem comportado de uma perspectiva de otimização numérica). É difícil prever a influência disso (e suspeito que isso seja impossível sem levar em conta o tipo real de classificador).

Em geral, no entanto, tanto o baixo número de casos de teste independentes quanto o alto número de modelos comparados aumentam o viés. Além disso, o trabalho de Cawley e Talbot fornece um comportamento empírico observado.

cbeleites
fonte
@ cbleites: Se a pesquisa em grade pode não ser um método apropriado para encontrar o modelo ideal, qual método devo escolher?
Tobip 15/05
11
@ ta.ft: duas abordagens são: a) incorporam o conhecimento externo sobre sua aplicação e dados na modelagem para reduzir drasticamente o número de modelos que precisam ser comparados (= decida os hiperparâmetros em vez de otimizar). Pode ser melhor mudar para um classificador que possua hiperparâmetros intrinsecamente significativos, ou seja, onde você pode saber, a partir do aplicativo e do tipo de dados, qual deve ser (aproximadamente) o hiperparâmetro. b) compare os poucos modelos restantes pela regra de pontuação adequada. Por exemplo, a pontuação de Briers possui propriedades de variação muito melhores para muitos classificadores.
Cbeleites
11
Você também pode se recusar a otimizar (via decisões (a)). Se você obtiver um classificador suficientemente bom e puder argumentar que não tem chance de provar a superioridade de outro classificador, dado o tamanho da amostra disponível (por exemplo, faça alguns cálculos demo de McNemar, procure o tamanho da amostra necessário para comparações de proporção para um classificador melhor hipotético - existe uma boa chance de que elas sejam ridiculamente grandes, mesmo para melhorias hipotéticas ridiculamente grandes), você pode argumentar que a otimização não faz nenhum sentido e apenas cria um risco de sobreajuste.
Cbeleites
Eu não concordo com você em "variação de skimming". Se você tiver muitos pontos na grade para otimização do hiperparâmetro, um ponto poderá oportunamente ter sorte em uma dobra do CV; mas se você tiver, digamos 10 vezes o CV, ainda é improvável que um conjunto de parâmetros tenha sorte acidental em todas as 10 dobras do CV.
RNA
11
@RNA: A probabilidade de ter "sorte" em todas as dobras está diretamente conectada ao número total de casos (em todas as 10 dobras) e, normalmente, apenas a média de todas essas dobras é considerada. Atualizei a resposta com uma simulação de uma seleção hipotética do melhor dos 100 modelos (por exemplo, 2 hiperparâmetros com 10 etapas cada), que já está associado a um viés considerável para o cenário de exemplo (taxa de erro muito baixa em 1/3) . Muitas pessoas aqui raramente têm alguns milhares de casos independentes em mãos - por exemplo, eu raramente tenho até os 44 indivíduos que escreveram dígitos para o conjunto completo de dados de dígitos da UCI.
Cbeleites 28/08/14