Eu tenho um conjunto de dados de 140000 exemplos e 30 recursos para os quais estou treinando vários classificadores para uma classificação binária (SVM, Regressão Logística, Floresta Aleatória etc.)
Em muitos casos, o ajuste de hiperparâmetros em todo o conjunto de dados usando a pesquisa em grade ou aleatória é muito dispendioso no tempo.
Comecei a usar a seguinte técnica
- Subamostra meu conjunto de dados
- Use a fração obtida para ajustar os hiperparâmetros em
- Use os parâmetros obtidos para treinar um modelo usando o conjunto de dados inteiro
Para avaliar cada conjunto de parâmetros na segunda etapa, utilizo sklearn
s GridSearchCV
com cv = 10. Para avaliar o modelo final que criei na terceira etapa, utilizo sklearn
's cross_val_predict
. Nesse sentido, avalio meus modelos deixando 10% por cento dos dados de fora, treino com os demais e medo a precisão preditiva dos 10%, iterativamente, 10 vezes, depois calculando a média das pontuações.
O que me preocupou é que a precisão da previsão que recebo do treinamento em todo o conjunto de dados é muito próxima da avaliação que recebo ao ajustar os parâmetros para o melhor conjunto de parâmetros (cada conjunto de parâmetros testado gera uma pontuação obtida com a média de 10- resultados de validação com dobra cruzada).
Na maioria das vezes, a precisão que foi cross_val_predict
medida usando todos os exemplos de treinamento (conjunto de dados completo) está um pouco acima do que a avaliação dos melhores parâmetros retornou.
Para ilustrar isso aqui, está a avaliação de um conjunto de parâmetros (em um conjunto de dados menor do que o que descrevi acima, mas o efeito é o mesmo)
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
E aqui estão as pontuações médias (de cross_val_predict
) que recebi do treinamento em todo o conjunto de dados usando os melhores parâmetros
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
Como você pode ver, o treinamento em todo o conjunto de dados melhora os resultados. Também validei que o modelo mal ajustado (por exemplo, usando os valores padrão ou aleatórios para C
e gamma
) leva a uma precisão de previsão muito pior.
No geral, acho que ajustar os hiperparâmetros em um subconjunto não é o ideal, mas pode levar a resultados relativamente bons sem ter que esperar muito tempo. Por exemplo, antes de usar essa abordagem, usei o optunity
pacote para ajustar o hiperparâmetro em todo o conjunto de dados. Esse procedimento levaria de 3 a 5 dias para ser concluído e produziria resultados com precisão muito boa ou recuperação muito boa, mas não com ambas, portanto, para cada classe, a precisão ou a recuperação foram realmente altas (mais altas do que as outras os classificadores alcançaram) a medição do F1 foi realmente baixa. Pelo contrário, o uso da abordagem posterior leva a algumas horas de treinamento e a uma melhor medição da F1.
Minhas preocupações são:
Limito a precisão da minha classificação? Evito usar todo o poder de previsão que meu conjunto de dados pode oferecer ajustando apenas um subconjunto? Se esse dano de desempenho está acontecendo, é de alguma forma limitado por algum fator?