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_size
ou n_iter
, mas se eu usasse X
, y
, X_train
, y_train
, X_test
, e y_test
de 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()
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, cv
precisa 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.
Respostas:
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:
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:
Gneiting, T. & Raftery, AE: Regras, previsão e estimativa de pontuação estritamente apropriadas, Journal of the American Statistical Association, 102, 359-378 (2007). DOI: 10.1198 / 016214506000001437
Brereton, R .: Chemometrics para reconhecimento de padrões, Wiley, (2009).
destaca o comportamento irregular do SVM em função dos hiperparâmetros.
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.learn
diz que eles têm 1797 estão nosdigits
dados.ou seja, todos os modelos têm o mesmo desempenho real de, digamos, 97% (desempenho típico para o
digits
conjunto de dados).digits
Aqui está a distribuição para o melhor desempenho observado:
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:
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.
fonte