A seleção de recursos deve ser realizada apenas nos dados de treinamento (ou todos os dados)? Passei por algumas discussões e artigos como Guyon (2003) e Singhi e Liu (2006) , mas ainda não tenho certeza sobre a resposta certa.
Minha configuração da experiência é a seguinte:
- Conjunto de dados: 50 controles saudáveis e 50 pacientes com doenças (recursos do cca 200 que podem ser relevantes para a previsão da doença).
- A tarefa é diagnosticar doenças com base nos recursos disponíveis.
O que eu faço é
- Pegue um conjunto de dados inteiro e execute a seleção de recursos (FS). Eu mantenho apenas os recursos selecionados para processamento adicional
- Divida para testar e treinar, treine o classificador usando dados de trem e recursos selecionados. Em seguida, aplique o classificador para testar os dados (novamente usando apenas os recursos selecionados). A validação de deixar um fora é usada.
- obter precisão de classificação
- Média: repita 1) -3) N vezes. (100).
Concordo que fazer FS em um conjunto de dados inteiro pode apresentar algum viés, mas minha opinião é que ele é "calculado em média" durante a média (etapa 4). Isso está correto? (A variação da precisão é )
1 Guyon, I. (2003) "Uma Introdução à Seleção de Variáveis e Recursos", The Journal of Machine Learning Research, vol. 3, pp. 1157-1182
2 Singhi, SK e Liu, H. (2006) "Viés de seleção de subconjuntos de recursos para aprendizado de classificação", continuação da ICML '06 Anais da 23ª conferência internacional sobre aprendizado de máquina, pp. 849-856
Apenas como um adendo às respostas aqui, tenho dois links que realmente me ajudaram a entender por que esse não é um bom procedimento:
http://nbviewer.jupyter.org/github/cs109/content/blob/master/lec_10_cross_val.ipynb
https://www.youtube.com/watch?v=S06JpVoNaA0
Editar: conforme solicitado, uma breve explicação do conteúdo dos links:
Suponha que eu esteja treinando um classificador e possua um conjunto de dados de 1000 amostras, com 1 milhão de recursos cada. Não posso processar todos eles, por isso preciso de menos recursos (por exemplo, posso calcular 300 recursos). Também tenho um conjunto de testes de 100 amostras para estimar com precisão minha precisão fora da amostra no mundo real.
Se eu filtrar meus 1 milhão de recursos até 300, selecionando esses recursos com uma correlação mais alta com os alvos de todo o conjunto de dados, cometi um erro (porque estou introduzindo um overfitting que não pode ser detectado posteriormente pela Validação Cruzada). Meu conjunto estendido mostrará isso devolvendo um valor de precisão ruim.
De acordo com os links acima, a maneira correta de fazer isso é dividir meu conjunto de dados em um conjunto de treinamento e um conjunto de Validação Cruzada e, em seguida, ajustar meu modelo (filtrando recursos, etc.) com base nesse conjunto de treinamento e na pontuação de CV associada. Se eu estiver usando dobras em K, devo ajustar do zero toda vez que fizer uma divisão / dobra e, em seguida, calcular a média dos resultados.
Programaticamente, você faz o seguinte:
É realmente importante que você execute a engenharia de recursos dentro do loop, no conjunto de sub-treinamento Ti, e não no conjunto de treinamento completo T1.
A razão para isso é que, quando você ajusta / engenheiro de recursos para o Ti, você testa no CVi, o que não é visto para esse modelo. Considerando que, se você encaixar / engenheiro de recursos em T1, qualquer CV que você escolher terá que ser um subconjunto T1 e, portanto, você será otimista, ou seja, sofrerá excesso de ajustes, porque estará treinando e testando nas mesmas amostras de dados.
Uma resposta muito boa do StackExchange é essa , que realmente explica mais detalhadamente e com um exemplo do código. Também veja isso como um adendo.
fonte
O bootstrap de "otimismo" do Efron-Gong é muito bom para isso. A idéia é usar todos os dados disponíveis para desenvolver o modelo preditivo e usar todos os dados para estimar o desempenho futuro provável desse mesmo modelo. E o tamanho da amostra é muito pequeno por um fator de 100 para que qualquer abordagem de amostra dividida funcione.
fonte