Ho un set di dati di 140000 esempi e 30 funzionalità per le quali sto addestrando diversi classificatori per una classificazione binaria (SVM, Regressione logistica, Foresta casuale ecc.)
In molti casi l'ottimizzazione dell'iperparametro sull'intero set di dati utilizzando la ricerca Grid o Random è troppo dispendiosa in termini di tempo.
Ho iniziato a utilizzare la seguente tecnica
- Sottocampione il mio set di dati
- Utilizzare la frazione ottenuta per sintonizzare gli iperparametri
- Utilizzare i parametri ottenuti per addestrare un modello utilizzando l'intero set di dati
Per valutare ogni set di parametri nel secondo passaggio, utilizzo sklearn
's GridSearchCV
con cv = 10. Per valutare il modello finale che creo nel terzo passaggio, utilizzo quello sklearn
di cross_val_predict
. In tal senso, valuto i miei modelli lasciando fuori un 10% di dati, mi alleno sul resto e misuro l'accuratezza predittiva sul 10%, iterativamente 10 volte, quindi prendendo la media dei punteggi.
Ciò che mi ha fatto preoccupare è che l'accuratezza della previsione che ottengo dall'allenamento su tutto il mio set di dati, è molto vicina alla valutazione che ottengo quando si sintonizzano i parametri per il miglior set di parametri (ogni set di parametri testato genera un punteggio ottenuto dalla media 10- risultati della convalida incrociata).
La maggior parte delle volte l'accuratezza cross_val_predict
misurata utilizzando tutti gli esempi di addestramento (set di dati completo) è leggermente superiore a quanto restituito dalla valutazione dei migliori parametri.
Per illustrare questo qui è la valutazione di un set di parametri (su un set di dati più piccolo di quello che ho descritto sopra ma l'effetto è lo stesso)
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
Ed ecco i punteggi medi (da cross_val_predict
) che ho ottenuto dall'allenamento su tutto il mio set di dati usando i migliori parametri
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
Come puoi vedere, la formazione sull'intero set di dati migliora i risultati. Ho anche validato quel modello mal regolato (ad es. Usando i valori predefiniti o valori casuali per C
egamma
) porta ad una precisione di previsione molto peggiore.
Nel complesso, penso che sintonizzare gli iperparametri su un sottoinsieme non sia l'ideale, ma può potenzialmente portare a risultati relativamente buoni senza dover aspettare troppo a lungo. Per esempio, prima di usare quell'approccio ho usato il optunity
pacchetto per ottimizzare l'iperparametro sull'intero set di dati. Il completamento di questa procedura richiederebbe 3-5 giorni e produrrebbe risultati che avevano una precisione molto buona o un ottimo richiamo ma non entrambi, quindi anche se per ogni classe la precisione o il richiamo erano davvero alti (più alti di qualsiasi altro i classificatori avevano raggiunto) la misura f1 era davvero bassa. Al contrario, l'uso dell'approccio successivo porta ad alcune ore di allenamento e ad una migliore misurazione f1.
Le mie preoccupazioni sono:
Limito la precisione della mia classificazione? Evito di utilizzare tutta la potenza di previsione che il mio set di dati può offrire ottimizzando solo un sottoinsieme? Se si verifica un tale danno delle prestazioni, è in qualche modo limitato da qualche fattore?