Dovresti eseguire una serie di test artificiali, cercando di rilevare funzionalità pertinenti utilizzando metodi diversi e sapendo in anticipo quali sottoinsiemi di variabili di input influenzano la variabile di output.
Un buon trucco sarebbe quello di mantenere un insieme di variabili di input casuali con diverse distribuzioni e assicurarsi che gli algoritmi di selezione delle funzionalità li taggino come non rilevanti.
Un altro trucco sarebbe assicurarsi che, dopo aver permesso le righe, le variabili contrassegnate come rilevanti smettano di essere classificate come rilevanti.
Quanto sopra si applica ad entrambi gli approcci di filtro e wrapper.
Assicurati anche di gestire i casi quando presi separatamente (uno per uno) le variabili non mostrano alcuna influenza sul bersaglio, ma se presi congiuntamente rivelano una forte dipendenza. Esempio potrebbe essere un noto problema XOR (controlla il codice Python):
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_selection import f_regression, mutual_info_regression,mutual_info_classif
x=np.random.randn(5000,3)
y=np.where(np.logical_xor(x[:,0]>0,x[:,1]>0),1,0)
plt.scatter(x[y==1,0],x[y==1,1],c='r',marker='x')
plt.scatter(x[y==0,0],x[y==0,1],c='b',marker='o')
plt.show()
print(mutual_info_classif(x, y))
Produzione:
[0. 0. 0.00429746]
Pertanto, il metodo di filtro presumibilmente potente (ma univariato) (calcolo delle informazioni reciproche tra variabili out e input) non è stato in grado di rilevare alcuna relazione nel set di dati. Considerando che sappiamo per certo che è una dipendenza al 100% e possiamo prevedere Y con una precisione del 100% conoscendo X.
Una buona idea sarebbe quella di creare una sorta di benchmark per i metodi di selezione delle funzionalità, qualcuno vuole partecipare?