HyperOpt demistificato

Come automatizzare l'ottimizzazione del modello con HyperOpt

Ti piacciono i modelli tuning? Se la tua risposta è “sì”, questo post lo è non per voi.

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Un cartone animato di mio nonno — sito web.

In questo blog tratteremo l'algoritmo estremamente popolare di ottimizzazione automatizzata degli iperparametri chiamato Stimatori Parzen basati su alberi (TPE). TPE è supportato dal pacchetto open source HyperOpt. Sfruttando HyperOpt e TPE, gli ingegneri del machine learning possono farlo sviluppare rapidamente modelli altamente ottimizzati senza alcuna regolazione manuale.

Senza ulteriori indugi, tuffiamoci!

HyperOpt è un pacchetto Python open source che utilizza un algoritmo chiamato Tree-based Parzen Esimtors (TPE) per selezionare gli iperparametri del modello che ottimizzano una funzione obiettivo definita dall'utente. Definendo semplicemente la forma funzionale e i limiti di ciascun iperparametro, TPE effettua ricerche approfondite ma efficienti nell'iperspazio complesso per raggiungere i valori ottimali.

TPE è un algoritmo sequenziale che sfrutta l'aggiornamento bayesiano e segue la sequenza seguente.

  1. Addestra un modello con diversi set di iperparametri selezionati casualmente, restituendo valori di funzioni obiettivo.
  2. Dividere i valori della funzione obiettivo osservati in gruppi “buoni” e “cattivi”, secondo una certa soglia gamma (γ).
  3. Calcola il punteggio di “promettenza”, che è giusto P(x|buono) / P(x|cattivo).
  4. Determinare gli iperparametri che massimizzano la promessa tramite modelli misti.
  5. Adatta il nostro modello utilizzando gli iperparametri del passaggio 4.
  6. Ripetere i passaggi 2–5 fino al criterio di arresto.

Ecco un esempio di codice rapido.

Ok, erano un sacco di parole grosse. Rallentiamo e capiamo davvero cosa sta succedendo.

1.1 — Il nostro obiettivo

I data scientist sono impegnati. Vogliamo produrre modelli davvero buoni, ma farlo in modo efficiente e possibilmente pratico.

Tuttavia, alcuni passaggi nel ciclo di vita della modellazione ML sono molto difficili da automatizzare. L’analisi esplorativa dei dati (EDA) e l’ingegneria delle funzionalità, ad esempio, sono solitamente specifiche per argomento e richiedono l’intuizione umana. L’ottimizzazione del modello, d’altro canto, è un processo iterativo in cui i computer possono eccellere.

Il nostro obiettivo in questo post è capire come sfruttare gli algoritmi per automatizzare il processo di ottimizzazione del modello.

Per aiutarci a pensare a questo obiettivo, usiamo un'analogia: siamo pirati alla ricerca di tesori sepolti. È anche importante notare che siamo pirati molto efficienti che cercano di ridurre al minimo il tempo da dedicare alla ricerca del tesoro sepolto. Quindi, come dovremmo ridurre al minimo il tempo impiegato nella ricerca? La risposta è usa una mappa!

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
figura 1: esempio di spazio di ricerca iperparametro 3D. La posizione dello scrigno del tesoro è ottimale a livello globale. Immagine dell'autore.

Nella figura 1 abbiamo una mappa fittizia che mostra dove si trova il nostro tesoro. Dopo tante arrampicate e scavi, non sarebbe troppo difficile raggiungere quel tesoro perché sappiamo esattamente dove si trova.

Ma cosa succede quando non abbiamo una mappa?

Quando ci viene assegnato il compito di mettere a punto un modello, purtroppo non ci viene fornita una mappa. Il nostro terreno, che corrisponde allo spazio di ricerca dell'iperparmetro, è sconosciuto. Inoltre, è sconosciuta anche la posizione del nostro tesoro, che corrisponde all’insieme ottimale di iperparametri.

Con questa impostazione, parliamo di alcuni potenziali modi per esplorare in modo efficiente questo spazio e trovare qualche tesoro!

1.2 — Soluzioni potenziali

Il metodo originale per l'ottimizzazione del modello è "manuale": l'ingegnere testerà effettivamente manualmente molte configurazioni diverse e vedrà quale combinazione di iperparametri produce il modello migliore. Sebbene informativo, questo processo è inefficiente. Ci deve essere un modo migliore...

1.2.1 — Ricerca in griglia (peggiore)

Il nostro primo algoritmo di ottimizzazione è la ricerca in griglia. La ricerca della griglia verifica in modo iterativo tutte le possibili combinazioni di iperparametri all'interno di una griglia specificata dall'utente.

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 2: esempio di layout della griglia di ricerca. Immagine dell'autore

Ad esempio, nella figura 2, ovunque vedi un punto rosso è dove riqualificheremo e valuteremo il nostro modello. Questo quadro è inefficiente perché riutilizza iperparametri errati. Ad esempio, se l'iperparametro 2 ha un impatto minimo sulla nostra funzione obiettivo, testeremo comunque tutte le combinazioni dei suoi valori, aumentando così il numero di iterazioni richiesto di 10 volte (in questo esempio).

Ma prima di proseguire, è importante notare che la ricerca su griglia è ancora abbastanza popolare perché garantisce di trovare un risultato ottimale data una griglia specificata correttamente. Se decidi di utilizzare il metodo, assicurati di trasformare la tua griglia per riflettere la forma funzionale dei tuoi iperparametri. Ad esempio, max_ Depth per a classificatore casuale di foreste è un numero intero: non lasciarlo cercare in uno spazio continuo. È anche improbabile che abbia una distribuzione uniforme: se conosci la forma funzionale del tuo iperparametro, trasforma la griglia per rifletterla.

In sintesi, la ricerca a griglia è soggetta alla maledizione della dimensionalità e ricalcola le informazioni tra le valutazioni, ma è ancora ampiamente utilizzata.

1.2.2 — Ricerca casuale (buono)

Il nostro secondo algoritmo è la ricerca casuale. La ricerca casuale tenta valori casuali all'interno di una griglia specificata dall'utente. A differenza della ricerca su griglia, non siamo relegati a testare ogni possibile combinazione di iperparametri, il che aumenta l'efficienza.

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 3: esempio di ricerca casuale. Immagine dell'autore.

Ecco un fatto interessante: la ricerca casuale troverà (in media) una configurazione di iperparametri superiore del 5% all'interno 60 iterazioni. Detto questo, come con la ricerca su griglia, devi trasformare il tuo spazio di ricerca per riflettere la forma funzionale di ciascun iperparametro.

La ricerca casuale è una buona base per l'ottimizzazione degli iperparametri.

1.2.3 — Ottimizzazione bayesiana (migliore)

Il nostro terzo candidato è il nostro primo algoritmo di ottimizzazione sequenziale basata su modelli (SMBO). La differenza concettuale chiave rispetto alle tecniche precedenti siamo noi utilizzare in modo iterativo le esecuzioni precedenti per determinare i futuri punti di esplorazione.

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 4: esempio di ottimizzazione bayesiana — src. Immagine dell'autore.

L'ottimizzazione degli iperparametri bayesiani mira a sviluppare una distribuzione probabilistica del nostro spazio di ricerca degli iperparametri. Da lì, utilizza una funzione di acquisizione, come il miglioramento atteso, per trasformare il nostro iperspazio in modo che sia più “ricercabile”. Infine, utilizza un algoritmo di ottimizzazione, come la discesa stocastica del gradiente, per trovare gli iperparametri che massimizzano la nostra funzione di acquisizione. Questi iperparametri vengono utilizzati per adattare il nostro modello e il processo viene ripetuto fino alla convergenza.

L'ottimizzazione bayesiana in genere supera la ricerca casuale, tuttavia presenta alcune limitazioni fondamentali come la richiesta di iperparametri numerici.

1.2.4 — Stimatori Parzen basati su alberi (migliori)

Infine, parliamo della star dello spettacolo: gli stimatori Parzen basati sugli alberi (TPE). TPE è un altro algoritmo SMBO che in genere supera l'ottimizzazione bayesiana di base, ma il principale punto di forza è che gestisce complesse relazioni di iperparametri tramite una struttura ad albero.

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 5: esempio di struttura gerarchica per TPE — src. Immagine dell'autore.

Usiamo la figura 5 per capirlo struttura ad albero. Qui stiamo addestrando un classificatore Support Vector Machine (SVM). Testeremo due kernel: linear ed RBF. UN linear kernel non accetta un parametro di larghezza ma RBF lo fa, quindi utilizzando un dizionario nidificato siamo in grado di codificare questa struttura e quindi limitare lo spazio di ricerca.

TPE supporta anche variabili categoriali che la tradizionale ottimizzazione bayesiana non supporta.

Un breve disclaimer prima di andare avanti, ci sono molti altri pacchetti di ottimizzazione degli iperparametri. Ciascuno supporta una varietà di algoritmi, alcuni dei quali includono foreste casuali, processi gaussiani e algoritmi genetici. TPE è un algoritmo molto popolare e di uso generale, ma non è necessariamente il migliore.

In generale, TPE è una soluzione di ottimizzazione degli iperparametri davvero robusta ed efficiente.

Ora che abbiamo una conoscenza generale di alcuni popolari algoritmi di ottimizzazione degli iperparametri, approfondiamo il funzionamento di TPE.

Tornando alla nostra analogia, siamo pirati alla ricerca di tesori sepolti ma non hai una mappa. Il nostro capitano ha bisogno del tesoro il prima possibile, quindi dobbiamo scavare in luoghi strategici che hanno un'alta probabilità di trovare tesori, utilizzando gli scavi precedenti per determinare la posizione degli scavi futuri.

2.1 — Inizializzazione

Per iniziare, noi definire i vincoli del nostro spazio. Come notato sopra, i nostri iperparametri hanno spesso una forma funzionale, valori massimi/minimi e una relazione gerarchica con altri iperparametri. Utilizzando la nostra conoscenza dei nostri algoritmi ML e dei nostri dati, possiamo definire il nostro spazio di ricerca.

Successivamente, dobbiamo definire la nostra funzione obiettivo, che viene utilizzato per valutare quanto sia "buona" la nostra combinazione di iperparametri. Alcuni esempi includono le classiche funzioni di perdita ML, come RMSE o AUC.

Grande! Ora che disponiamo di uno spazio di ricerca limitato e di un modo per misurare il successo, siamo pronti per iniziare la ricerca...

2.2 — Ottimizzazione Bayesiana Iterativa

L'ottimizzazione bayesiana è un algoritmo sequenziale che trova punti nell'iperspazio con un'alta probabilità di avere “successo” secondo una funzione obiettivo. TPE sfrutta l'ottimizzazione bayesiana ma utilizza alcuni trucchi intelligenti per migliorare le prestazioni e gestire la complessità dello spazio di ricerca...

2.2.0 — L'impostazione concettuale

Il primo trucco è modellare P(x|y) invece di P(y|x)…

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 6: probabilità condizionata che TPE cerca di risolvere. Immagine dell'autore.

L'ottimizzazione bayesiana in genere si basa sul modello P(y|x), che è la probabilità di un valore della funzione obiettivo (y), dati gli iperparametri (x). Il TPE fa il contrario: sembra modello P(x|y), che è la probabilità degli iperparametri (x), dato il valore della funzione obiettivo (y).

In breve, TPE cerca di trovare i migliori valori della funzione obiettivo, quindi di determinare gli iperparametri associati.

Con questa impostazione molto importante, entriamo nell'algoritmo vero e proprio.

2.2.1 — Suddividere i nostri dati in gruppi “buoni” e “cattivi”.

Ricorda, il nostro obiettivo è trovare i migliori valori degli iperparametri in base ad alcune funzioni obiettivo. Quindi, come possiamo sfruttare? P(x|y) fare quello?

Innanzitutto, TPE divide i nostri punti dati osservati in due gruppi: buono, indicato g(x), ed male, indicato l(x). Il limite tra buono e cattivo è determinato da un parametro definito dall'utente gamma (γ), che corrisponde al percentile della funzione obiettivo che divide le nostre osservazioni (y*).

Quindi, con γ = 0.5, il valore della nostra funzione obiettivo che divide le nostre osservazioni (y*) sarà la mediana dei nostri punti osservati.

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 7: scomposizione di p(x|y) in due insiemi. Immagine dell'autore.

Come mostrato nella figura 7, possiamo formalizzare p(x|y) utilizzando il quadro di cui sopra. E, per continuare con l'analogia dei pirati...

Prospettiva pirata: guardando i luoghi che abbiamo già esplorato, l(x) elenca i luoghi con pochissimi tesori e g(x) elenca i luoghi con molti tesori.

2.2.32— Calcolare il punteggio “Promettente”.

In secondo luogo, TPE definisce come dovremmo valutare una combinazione di iperparametri non osservata tramite il punteggio “promettente”..

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 8: definizione del punteggio di promettenza. Immagine dell'autore.

La Figura 8 definisce il nostro punteggio di promessa (P), che è semplicemente un rapporto con i seguenti componenti...

  • Numeratore: la probabilità di osservare un insieme di iperparametri (x), dato che il corrispondente valore della funzione obiettivo è “buono. "
  • Denominatore: la probabilità di osservare un insieme di iperparametri (x), dato che il corrispondente valore della funzione obiettivo è “male. "

Maggiore è il valore di “promettenza”, maggiore è la probabilità che i nostri iperparametri x produrrà una “buona” funzione obiettivo.

Prospettiva dei pirati: la promessa mostra quanto è probabile che una determinata posizione nel nostro terreno contenga molti tesori.

Breve parentesi prima di proseguire: se hai familiarità con l'ottimizzazione bayesiana, questa equazione funge da funzione di acquisizione ed è proporzionale al Miglioramento atteso (EI).

2.2.3— Creare una stima della densità di probabilità

In terzo luogo, TPE cerca di valutare il punteggio di “promettenza” tramite modelli misti. L'idea dei modelli misti è quella di prendere più distribuzioni di probabilità e metterle insieme utilizzando una combinazione lineare: src. Queste distribuzioni di probabilità combinate vengono quindi utilizzate per sviluppare stime della densità di probabilità.

In generale, il processo di modellazione della miscela è...

  1. Definire il tipo di distribuzione dei nostri punti. Nel nostro caso, se la nostra variabile è categoriale utilizziamo una distribuzione categoriale riponderata e se è numerica utilizziamo una distribuzione gaussiana (cioè normale) o uniforme.
  2. Itera su ogni punto e inserisci una distribuzione in quel punto.
  3. Somma la massa di tutte le distribuzioni per ottenere una stima della densità di probabilità.

Tieni presente che questo processo viene eseguito individualmente per entrambi i set l(x) ed g(x).

Esaminiamo un esempio nella figura 9...

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 9: esempio di distribuzioni gaussiane troncate adattate a 3 osservazioni di iperparametri. Immagine dell'autore.

Per ogni osservazione (punti blu sull'asse x), creiamo una distribuzione normale ~N(μ, σ), dove...

  • m (mu) è la media della nostra distribuzione normale. Il suo valore è la posizione del nostro punto lungo l'asse x.
  • σ (sigma) è la deviazione standard della nostra distribuzione normale. Il suo valore è la distanza dal punto vicino più vicino.

Se i punti sono vicini, la deviazione standard sarà piccola e quindi la distribuzione sarà molto alta e viceversa, se i punti sono distanziati, la distribuzione sarà piatta (figura 10)…

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 10: esempio dell'impatto della deviazione standard sulla forma di una distribuzione normale. Immagine dell'autore.

Prospettiva dei pirati: NA: i pirati non sono bravi con i modelli misti.

Un'altra breve digressione prima di proseguire: se stai leggendo la letteratura noterai che TPE utilizza gaussiane "troncate", il che significa semplicemente che le gaussiane sono limitate dall'intervallo che specifichiamo nella nostra configurazione dell'iperparametro invece di estendersi a +/- infinito .

2.2.4 — Determinare il prossimo punto da esplorare!

Mettiamo insieme questi pezzi. Finora abbiamo 1) acquisito osservazioni sulla funzione obiettivo, 2) definito la nostra formula di “promettenza” e 3) creato una stima della densità di probabilità tramite modelli di miscela basati su valori precedenti. Abbiamo tutti i pezzi per valutare un dato punto!

Il nostro primo passo è creare una funzione di densità di probabilità media (PDF) per entrambi g(x) ed l(x).

Hyperparametro ottimizzazione del modello di parametri iper ottimizzazione machine learning data science modello sklearn mllib spark hyperopt tree stimatore parzen tpe tree based parzen esimtator mlflow databricks
Figura 11: sovrapposizione della densità di probabilità media dati 3 punti osservati. Immagine dell'autore.

Un processo di esempio è mostrato nella figura 11: la linea rossa è il nostro PDF medio ed è semplicemente la somma di tutti i PDF divisa per il numero di PDF.

Utilizzando il PDF medio, possiamo ottenere la probabilità di qualsiasi valore di iperparametro (x) essendo in g(x) or l(x).

Ad esempio, supponiamo che i valori osservati nella figura 11 appartengano all'insieme "buono", g(x). In base al nostro PDF medio, è improbabile che un valore dell'iperparametro di 3.9 o 0.05 appartenga al set "buono". Al contrario, un valore dell’iperparametro di ~1.2 sembra appartenere molto probabilmente al set “buono”.

Questa è solo la metà del quadro. Applichiamo la stessa metodologia per il set “cattivo”, l(x). Dal momento che stiamo cercando di massimizzare g(x) / l(x), i punti promettenti dovrebbero essere localizzati dove g(x) è alto e l(x) è basso.

Piuttosto interessante, vero?

Con queste distribuzioni di probabilità, possiamo campionare i nostri iperparametri strutturati ad albero e trovare l'insieme di iperparametri che massimizzano la "promettenza" e che vale quindi la pena esplorare.

Prospettiva pirata: il prossimo luogo che scaviamo è il luogo che massimizza la (probabilità di avere molti tesori)/(probabilità di avere pochi tesori).

Ora che sai come funziona, ecco alcuni suggerimenti pratici per implementare TPE tramite il pacchetto open source HyperOpt.

3.1 — Struttura di un'app HyperOpt

In generale, ci sono tre passaggi principali quando si sfrutta HyperOpt...

  1. Definire lo spazio di ricerca, che sono solo gli intervalli e le forme funzionali degli iperparametri che stai cercando di ottimizzare.
  2. Definire la funzione di adattamento, che chiama il tuo model.fit() funzione su una determinata suddivisione treno/prova.
  3. Definire la funzione obiettivo, che è una qualsiasi delle classiche metriche di precisione, come RMSE o AUC.

Sfortunatamente, questi metodi di ottimizzazione automatizzati richiedono ancora input di progettazione da parte del data scientist: non è un pranzo completamente gratuito. Tuttavia, aneddoticamente il TPE è piuttosto robusto rispetto alla specifica errata degli iperparametri (entro limiti ragionevoli).

3.2— Suggerimenti e trucchi

  • HyperOpt è parallelizzabile tramite entrambi Apache Spark ed MongoDB. Se lavori con più core, sia nel cloud che sul tuo computer locale, ciò può ridurre drasticamente il tempo di esecuzione.
  • Se stai parallelizzando il processo di ottimizzazione tramite Apache Spark, utilizza a SparkTrialsoggetto per modelli ML a nodo singolo (sklearn) e a Trails oggetto per modelli ML parallelizzati (MLlib). Il codice è sotto.
  • MLflow è un metodo open source per tenere traccia delle esecuzioni del modello. Si integra facilmente con HyperOpt.
  • Non restringere lo spazio di ricerca troppo presto. Alcune combinazioni di iperparametri possono essere sorprendentemente efficaci.
  • Definire lo spazio di ricerca può essere complicato, soprattutto se non conosci il file forma funzionale dei tuoi iperparametri. Tuttavia, per esperienza personale, il TPE è piuttosto resistente alla specifica errata di tali forme funzionali.
  • La scelta di una buona funzione obiettivo è molto importante. Nella maggior parte dei casi, l’errore non è creato uguale. Se un certo tipo di errore è più problematico, assicurati di integrare quella logica nella tua funzione.

3.3— Un esempio di codice

Ecco del codice per eseguire HyperOpt in modo distribuito. È stato adattato dal codice nel libro, Ingegneria dell'apprendimento automatico in azione - ecco il git repository.

Alcune caratteristiche interessanti di questo frammento includono la parallelizzazione tramite Apache Spark e registrazione del modello tramite MLflow. Tieni inoltre presente che questo frammento ottimizza uno sklearn RandomForestRegressor: dovrai modificare il modello e la funzione di adattamento per soddisfare le tue esigenze.

Ed ecco qua: HyperOpt in tutto il suo splendore!

Per martellare la speranza sui punti chiave, ricapitoliamo rapidamente.

L'ottimizzazione degli iperparametri è una parte necessaria del ciclo di vita del modello ML, ma richiede molto tempo. Gli algoritmi SMBO (Sequential Model-Based Optimization) eccellono nella ricerca di valori ottimali negli iperspazi complessi e possono essere applicati all'ottimizzazione degli iperparametri. Gli stimatori Parzen basati su albero (TPE) sono un SMBO molto efficiente e superano sia l'ottimizzazione bayesiana che la ricerca casuale.

TPE ripete i passaggi seguenti fino a quando non viene raggiunto un criterio di arresto:

  1. Dividi i punti osservati in insiemi “buoni” e “cattivi”, secondo alcuni iperparametri, gamma.
  2. Adattare un modello misto sia all'insieme “buono” che a quello “cattivo” per sviluppare una stima della densità di probabilità media.
  3. Seleziona il punto che ottimizza il punteggio di “promettenza”, che sfrutta il passaggio 2 per stimare la probabilità di trovarsi negli insiemi “buono” e “cattivo”.

Infine, abbiamo uno snippet di codice davvero interessante che mostra come parallelizzare HyperOpt tramite SparkTrials. Registra inoltre tutte le nostre iterazioni su MLflow.

HyperOpt Demystified ripubblicato dalla fonte https://towardsdatascience.com/hyperopt-demystified-3e14006eb6fa?source=rss—-7f60cf5620c9—4 tramite https://towardsdatascience.com/feed

<!–

->

Timestamp:

Di più da Consulenti Blockchain