Come ti sei già osservato, la scelta delle funzionalità (selezione delle funzionalità) potrebbe avere un impatto su quali iperparametri per il tuo algoritmo sono ottimali e quali iperparametri selezionati per il tuo algoritmo potrebbero avere un impatto su quale scelta delle funzionalità sarebbe ottimale.
Quindi, sì, se davvero ti interessa davvero spremere ogni singola percentuale delle prestazioni dal tuo modello e puoi permetterti la quantità richiesta di calcolo, la soluzione migliore è probabilmente quella di fare la selezione delle caratteristiche e l'ottimizzazione dell'iperparametro "allo stesso tempo". Probabilmente non è facile (a seconda di come si fa la selezione delle funzionalità). Il modo in cui immagino che funzioni sarebbe come avere diversi set di funzionalità come candidati e trattare la selezione di un set di funzionalità tra tutti i set candidati come un iperparametro aggiuntivo.
In pratica, però, potrebbe non essere fattibile. In generale, se non puoi permetterti di valutare tutte le possibili combinazioni, ti consiglierei:
Ottimizza in modo molto lento gli iperparametri, solo per assicurarti di non assegnare valori estremamente negativi ad alcuni iperparametri. Questo spesso può essere fatto solo a mano se hai una buona comprensione intuitiva dei tuoi iperparametri o se esegui una procedura di ottimizzazione dell'iperparametro molto breve usando solo un mucchio di funzioni che altrimenti decenti sono buone.
Selezione delle caratteristiche, con iperparametri che forse non sono ottimizzati al 100% ma almeno non estremamente terribili. Se hai già almeno un algoritmo di apprendimento automatico configurato in modo abbastanza decente, avere buone funzionalità sarà significativamente più importante per le tue prestazioni rispetto agli iperparametri a micro-ottimizzazione. Esempi estremi: se non si dispone di funzionalità, non è possibile prevedere nulla. Se hai una funzione cheat che contiene l'etichetta di classe, puoi classificare perfettamente tutto.
Ottimizza gli iperparametri con le funzionalità selezionate nel passaggio precedente. Questa dovrebbe essere una buona serie di funzioni ora, dove in realtà potrebbe valere la pena ottimizzare un po 'l'iperparam.
Per rispondere alla domanda aggiuntiva che Nikolas ha pubblicato nei commenti, chiedendo come tutte queste cose (selezione delle caratteristiche, ottimizzazione dell'iperparametro) interagiscono con la validazione incrociata di k-fold: direi che dipende.
Ogni volta che utilizzi i dati in una delle pieghe per qualsiasi cosa e poi valuta le prestazioni su quella stessa piega, ottieni una stima distorta delle tue prestazioni (sopravvaluterai le prestazioni). Pertanto, se si utilizzano i dati in tutte le pieghe per la fase di selezione della funzione e quindi si valutano le prestazioni su ciascuna di queste pieghe, si otterranno stime distorte delle prestazioni per ciascuna di esse (il che non va bene). Allo stesso modo, se si dispone dell'ottimizzazione dell'iperparametro basata sui dati e si utilizzano i dati di determinate pieghe (o tutte le pieghe) e si valuta su quelle stesse pieghe, si otterranno nuovamente stime distorte delle prestazioni. Le possibili soluzioni sono:
Ripetere la pipeline completa all'interno di ogni piega separatamente (ad es. All'interno di ogni piega, selezionare la funzione + ottimizzazione dell'iperparametro e modello di addestramento). Ciò significa che la convalida incrociata di k-fold fornisce stime imparziali delle prestazioni di questa pipeline completa .
Dividi il tuo set di dati iniziale in un '' set di dati di preelaborazione '' e un '' set di dati treno / test ''. È possibile eseguire la selezione delle funzioni + l'ottimizzazione dell'iperparametro nel '' set di dati di preelaborazione ''. Quindi, correggi le funzionalità e gli iperparametri selezionati ed esegui la convalida incrociata di k-fold sul '' set di dati treno / test ''. Ciò significa che la convalida incrociata di k-fold fornisce stime imparziali delle prestazioni dell'algoritmo ML dati i valori fissi del set di funzioni e dell'iperparametro .
Nota come le due soluzioni generano stime leggermente diverse delle prestazioni. Quale è più interessante dipende dal tuo caso d'uso, dipende da come prevedi di implementare le tue soluzioni di machine learning in pratica. Se, ad esempio, sei un'azienda che intende avere la pipeline completa di selezione delle caratteristiche + ottimizzazione dell'iperparametro + formazione in esecuzione automaticamente ogni giorno / settimana / mese / anno / qualunque cosa, sarai anche interessato alle prestazioni di quel completo pipeline e vorrai la prima soluzione.
Se, d'altra parte, puoi permetterti di fare la selezione della funzione + l'ottimizzazione dell'iperparametro solo una volta nella tua vita, e in seguito solo un po 'periodicamente ri-addestrare l'algoritmo (con valori di set di funzionalità e iperparam fissi), quindi le prestazioni di quel solo passo sarà quello che ti interessa e dovresti scegliere la seconda soluzione