Sinto que esta questão está relacionada à teoria por trás da validação cruzada. Apresento aqui minha descoberta empírica e escrevi uma pergunta relacionada à teoria da validação cruzada lá .
Eu tenho dois modelos M1 e M2, uso o mesmo conjunto de dados para treiná-los e execute a validação cruzada usando o mesmo conjunto de dados para encontrar os parâmetros ideais para cada modelo. Digamos que, eventualmente, eu descobri que M1 sob seu parâmetro ideal, tem um desempenho melhor que M2 sob seu parâmetro ideal em termos de 10 vezes a pontuação de validação cruzada. Agora, se eu tiver outro conjunto de dados de teste independente com preditores e rótulos e esse conjunto de dados de teste for gerado a partir da mesma distribuição do meu conjunto de dados de treinamento, antes de aplicar esses dois modelos bem ajustados nesse novo conjunto de dados de teste, posso reivindicar ou devo esperar que o M1 ainda tenha um desempenho melhor que o M2 nesse novo conjunto de dados de teste?
Eu estava jogando o exemplo do Kaggle Titanic. Eu tenho 2 modelo xgboost, M1 está bem ajustado e M2 está menos bem ajustado, no sentido de que M1 tem uma melhor validação cruzada de 10 vezes, realizada no conjunto de dados de treinamento. Porém, quando enviei os dois, descobri que o modelo menos ajustado realmente tem melhores pontuações no conjunto de dados de teste. Como poderia ser? E se for verdade, o que devemos procurar quando ajustamos os dados em diferentes modelos e ajustamos os parâmetros do modelo?
Aqui estão meus resultados de envio específicos: fiz uma pesquisa em grade aleatória
params_fixed = {'silent': 1,'base_score': 0.5,'reg_lambda': 1,
'max_delta_step': 0,'scale_pos_weight':1,'nthread': 4,
'objective': 'binary:logistic'}
params_grid = {'max_depth': list(np.arange(1,10)),
'gamma': [0,0.05,0.1,0.3, 0.5,0.7,0.9],
'n_estimators':[1,2,5,7,10,15,19,25,30,50],
'learning_rate': [0.01,0.03,0.05,0.1,0.3,0.5,0.7,0.9,1],
'subsample': [0.5,0.7,0.9], 'colsample_bytree': [0.5,0.7,0.9],
'min_child_weight': [1,2,3,5], 'reg_alpha': [1e-5, 1e-2, 0.1, 0.5,1,10]
}
rs_grid = RandomizedSearchCV(
estimator=XGBClassifier(**params_fixed, seed=seed),
param_distributions=params_grid,
n_iter=5000,
cv=10,
scoring='accuracy',
random_state=seed
)
Cada vez que eu mudo a variável n_iter
. Primeiro, eu defino n_iter=10
, ele me fornece um conjunto de valores desses hiper parâmetros, vamos chamar esse vetore a pontuação cv (taxa de precisão) é 0,83389 , então eu usopara treinar meu modelo e gerar previsão no conjunto de dados de teste independente e, quando envio ao Kaggle, ele gera uma precisão verdadeira no conjunto de dados de teste 0.79426
Segundo, defino n_iter=100
, isso me dáe o escore cv é 0,83614 , ou seja, maior que o primeiro, faz sentido, mas quando me submeto a Kaggle, 0,78469 , menor que o primeiro.
Terceiro, defino n_iter = 1000
, isso me dáe a pontuação cv é 0,83951 , ou seja, maior que o segundo, faz sentido, mas quando me submeto ao Kaggle, 0,77990 , menor que o segundo.
Quarto, eu defino n_iter = 5000
, isso me dáe a pontuação cv é 0,84512 , ou seja, maior que o terceiro, faz sentido, mas quando me submeto a Kaggle, 0,72249 , menor que o terceiro.
Isso é realmente frustrado. O modelo está cada vez melhor na pontuação de validação cruzada, mas quando executado em um conjunto de dados independente real, seu desempenho está ficando cada vez pior. Interpretei as pontuações do CV da maneira exatamente oposta? Vejo algum artigo mencionado que a pontuação do CV pode ser otimista demais para inferir a verdadeira pontuação do teste. No entanto, mesmo que isso seja verdade, acho que as pontuações de CV para todos os meus quatro modelos devem ser otimistas quanto à sua própria pontuação de teste, ou seja, a ordem deve preservar. Mas, ao aplicar no conjunto de dados de teste real, a ordem foi revertida.
A única razão pela qual posso imaginar seria que o conjunto de dados de teste tem uma distribuição diferente do conjunto de dados de treinamento. No entanto, se for esse o caso, acredito que não exista um método sob o sol que possa curar esse problema.
fonte
Sim você deveria. Claro que sob as condições que
Eu posso pensar em duas razões:
O conjunto de dados de teste não é realmente gerado da mesma maneira. Portanto, é melhor não confiar no conjunto de testes Kaggle ao qual você não tem acesso. Use os dados que você possui.
Você está em excesso, o que significa que não está executando a validação cruzada corretamente. Certifique-se de que o treinamento dos parâmetros ocorra nos dados do treinamento e, ao mesmo tempo, que a validação ocorra nos dados que você não usou para o treinamento. Compare os histogramas das perdas de treinamento e as perdas de validação. As perdas de treinamento devem ser consistentemente menores que as perdas de validação. Faça o mesmo com as perdas nos dados de teste para obter uma imagem consistente.
Nota final e final: Espera-se que o desempenho no conjunto de testes seja inferior ao desempenho no conjunto de validação. Isso ocorre porque o modelo é escolhido com base no conjunto de validação. Portanto, é tendencioso para esse conjunto de dados.
fonte
É possível. Pense em um cenário simples em que o modelo
M1
aprendeu melhor a variação do conjunto de dados de treinamento doD
que o modelo,M2
pois seus parâmetros são melhor ajustados. Isso significa umM1
desempenho melhorD
queM2
.Mas quando os testamos no conjunto de testes
T
, é possível que ele tenha umM2
desempenho melhor, poisM1
pode estar se ajustando excessivamenteD
enquantoM2
não estava. Portanto,M1
executa piorT
queM2
.Isso pode ser devido ao fato de você ter realizado sua validação cruzada no mesmo conjunto de dados em vez de um conjunto de validação. Se você treinar e validar no mesmo conjunto, é provável que perca o fato de que isso pode estar se adaptando demais. Portanto, é sempre melhor treinar, validar e testar em diferentes conjuntos de dados. Então o fluxo deve ser
fonte
D
já tenha levado em conta os problemas de sobreajuste. Entendo que, se você não realizar a validação cruzada, ou seja, basta ajustar o modelo no conjunto de dadosD
e resolver o problema de otimização e obter os parâmetros ideais, esse modelo terá o menor erro de trem e é muito provável um sobreajuste. Nesse caso, concordo que esseoptimized
modelo tenderá a ter um desempenho ruim em um conjunto de dados de teste independente. Mas acho que esse problema foi tratado pela validação cruzada no conjunto de dadosD
, não é?D
, primeiro você corta aleatoriamenteD
em aproximadamente 10 pedaços de tamanho igual e, em cada iteração, ajusta M1 e M2 no mesmo 9/10 deD
, em seguida, aplica-os da mesma maneira 1 / 10D
para obter o seutest error
, em seguida, repita esse processo 10 vezes e a cada vez, o conjunto de trens e o conjunto de testes são diferentes da iteração anterior. Depois de 10 iterações, você calcula a média do erro de teste para M1 e M2, e descobre que M1 tem menos erro de teste. Não basta concluir que M1 é melhor que M2 e esse procedimento parece já terA teoria por trás da validação cruzada (validação cruzada em V) foi abordada em muitos artigos. Há uma prova disso em um conjunto de documentos publicados de 2003 a 2007. Por favor, consulte: - oracle selector. 2006 - super aprendiz 2007 - super aprendiz na previsão 2010 - validação cruzada unificada 2003
fonte