Como você já observou a si mesmo, sua escolha de recursos (seleção de recursos) pode ter um impacto sobre quais hiperparâmetros para o seu algoritmo são ótimos e quais parâmetros que você seleciona para seu algoritmo podem ter um impacto sobre qual opção de recursos seria ideal.
Portanto, sim, se você realmente se preocupa em extrair todos os por cento do desempenho do seu modelo e pode pagar a quantidade necessária de computação, a melhor solução é provavelmente fazer a seleção de recursos e o ajuste de hiperparâmetros "ao mesmo tempo". Isso provavelmente não é fácil (dependendo de como você seleciona os recursos). A maneira como eu imagino que funcione seria como ter diferentes conjuntos de recursos como candidatos e tratar a seleção de um conjunto de recursos dentre todos esses conjuntos de candidatos como um hiperparâmetro adicional.
Na prática, isso pode não ser realmente viável. Em geral, se você não puder avaliar todas as combinações possíveis, recomendo:
Otimize livremente os hiperparâmetros, apenas para garantir que você não atribua valores extremamente ruins a alguns hiperparâmetros. Isso geralmente pode ser feito manualmente, se você tiver uma boa compreensão intuitiva de seus hiperparâmetros ou com um procedimento muito breve de otimização de hiperparâmetros, usando apenas um monte de recursos que você sabe que são decentemente bons.
Seleção de recurso, com hiperparâmetros que talvez não sejam 100% otimizados, mas pelo menos não extremamente terríveis. Se você já possui pelo menos um algoritmo de aprendizado de máquina configurado de maneira decente, ter bons recursos será significativamente mais importante para o seu desempenho do que os hiperparâmetros de otimização micro. Exemplos extremos: se você não possui recursos, não pode prever nada. Se você tem um recurso de trapaça que contém o rótulo da classe, pode classificar tudo perfeitamente.
Otimize os hiperparâmetros com os recursos selecionados na etapa acima. Esse deve ser um bom conjunto de recursos agora, onde pode valer a pena otimizar um pouco os hiperparams.
Para abordar a questão adicional que Nikolas postou nos comentários, analisando como todas essas coisas (seleção de recursos, otimização de hiperparâmetros) interagem com a validação cruzada k-fold: Eu diria que depende.
Sempre que você usa dados em uma das dobras para qualquer coisa e avalia o desempenho nessa mesma dobra, você obtém uma estimativa tendenciosa do seu desempenho (você superestima o desempenho). Portanto, se você usar dados em todas as dobras para a etapa de seleção de recursos e avaliar o desempenho em cada uma dessas dobras, obterá estimativas tendenciosas do desempenho de cada uma delas (o que não é bom). Da mesma forma, se você tiver otimização por hiperparâmetro orientada a dados e usar dados de certas dobras (ou todas as dobras) e depois avaliar essas mesmas dobras, obterá novamente estimativas tendenciosas de desempenho. As soluções possíveis são:
Repita o pipeline completo dentro de cada dobra separadamente (por exemplo, dentro de cada dobra, faça a seleção de recursos + otimização do hiperparâmetro e modelo de treinamento). Isso significa que a validação cruzada k-fold fornece estimativas imparciais do desempenho desse pipeline completo .
Divida seu conjunto de dados inicial em um '' conjunto de dados de pré-processamento '' e um '' conjunto de dados de treinamento / teste ''. Você pode fazer sua seleção de recursos + otimização de hiperparâmetros no '' conjunto de dados de pré-processamento ''. Em seguida, você corrige os recursos e hiperparâmetros selecionados e realiza a validação cruzada com dobras k no '' conjunto de dados de treinamento / teste ''. Isso significa que a validação cruzada k-fold fornece estimativas imparciais do desempenho do seu algoritmo ML, considerando os valores fixos do conjunto de recursos e do hiperparâmetro .
Observe como as duas soluções resultam em estimativas de desempenho ligeiramente diferentes. Qual é o mais interessante depende do seu caso de uso, depende de como você planeja implementar suas soluções de aprendizado de máquina na prática. Se você é, por exemplo, uma empresa que pretende ter o pipeline completo de seleção de recursos, otimização de hiperparâmetros e treinamento, executando automaticamente todos os dias / semana / mês / ano / o que for, você também estará interessado no desempenho completo pipeline e você desejará a primeira solução.
Se, por outro lado, você puder apenas fazer a seleção de recursos + otimização do hiperparâmetro uma única vez na sua vida, e depois treinar regularmente regularmente seu algoritmo (com os valores do conjunto de recursos e do hiperparâmetro fixados), então o desempenho apenas dessa etapa será o que você está interessado, e você deve ir para a segunda solução