Padroneggiare la Bayesian Optimization in Data Science
Sblocca la potenza della Bayesian Optimization per il tuning degli iperparametri nel Machine Learning. Padroneggia le basi teoriche e le applicazioni pratiche in Python per migliorare l'accuratezza dei modelli.
Nel vasto campo del Machine Learning, la sfida di orientarsi in dataset ampi e complessi per trovare gli iperparametri ottimali durante l'addestramento dei modelli è un ostacolo comune.
I metodi convenzionali, spesso basati su random e grid search, possono richiedere molto tempo ed essere inefficienti, soprattutto quando si lavora con architetture di modelli complesse o dati su larga scala.
È qui che emerge la necessità di un approccio più intelligente e adattivo come la Bayesian optimization, sempre più cruciale per l'ottimizzazione degli iperparametri.
Il primo obiettivo di questo articolo è spiegare cos'è la Bayesian optimization, fornendo al lettore solide basi teoriche. Tuttavia, prima di entrarci nel merito, è importante comprendere i diversi metodi di ottimizzazione degli iperparametri a nostra disposizione.
La seconda parte dell'articolo copre un'implementazione più pratica dei concetti chiave utilizzando il linguaggio di programmazione Python. Nell'ultima sezione imparerai come sfruttare la Bayesian optimization per il tuning degli iperparametri di un modello di machine learning.
È il metodo più basilare, basato su esperienza, intuizione o tentativi ed errori. Spesso richiede molto tempo e dipende fortemente dalla competenza di chi lo applica.
Ad esempio, un fornaio esperto imposta la temperatura del forno e i tempi di cottura in base all'esperienza passata e all'intuizione.
Un punto di partenza tipico potrebbe essere una temperatura di 350°F e un tempo di cottura di 30 minuti, che riflettono impostazioni spesso vincenti. Le regolazioni vengono poi fatte in base all'esito di ogni prova di cottura.
Ricerca casuale
Questo approccio prevede la selezione casuale di combinazioni di temperatura e tempo all'interno di un intervallo specificato. Ad esempio, le temperature possono variare tra 325°F e 375°F e i tempi tra 25 e 35 minuti.
Il processo di selezione potrebbe iniziare a 330°F per 27 minuti, seguito da 370°F per 31 minuti, continuando in modo casuale finché non si identifica la combinazione più efficace.
Grid search
Questo metodo prevede l'esplorazione sistematica di più combinazioni di valori degli iperparametri.
Proseguendo con lo stesso esempio di cottura: il fornaio crea una griglia strutturata di combinazioni di temperatura e tempo sul muro.
La griglia potrebbe includere incrementi di 5°F tra 325°F e 375°F e incrementi di 2 minuti tra 25 e 35 minuti. La torta verrebbe poi cotta per ogni singola combinazione della griglia (325°F per 25 minuti, 325°F per 27 minuti, ... , 375°F per 35 minuti) per trovare la combinazione migliore.
Ricerca bayesiana
La Bayesian Optimization può essere vista come un approccio più intelligente rispetto alla ricerca casuale per trovare la migliore temperatura e il miglior tempo di cottura per una torta.
La Random Search potrebbe comportare che il fornaio provi a caso un'ampia varietà di combinazioni di temperatura e tempo, molte delle quali portano a torte crude o troppo cotte.
Nella Bayesian optimization, la ricerca del fornaio per le condizioni di cottura ottimali è guidata e informata dai risultati precedenti.
Per esempio, se il fornaio scopre che le torte cotte intorno a 350°F per 30 minuti tendono a riuscire meglio, concentrerà successivamente i tentativi su combinazioni di temperatura e tempo vicine a questi valori.
Questo metodo riduce il numero di prove necessarie perché "impara" quali combinazioni hanno maggiori probabilità di produrre una torta perfettamente cotta, basandosi sugli esiti delle sessioni precedenti.
In generale, la Bayesian optimization si basa sul teorema di Bayes per ottimizzare funzioni obiettivo costose da valutare. È particolarmente efficace negli scenari in cui il campionamento è oneroso e la funzione obiettivo è sconosciuta ma campionabile.
Tipicamente impiega un modello probabilistico, come un Gaussian Process, per stimare la funzione obiettivo e poi usa una acquisition function per decidere dove campionare successivamente.
Sfide della Bayesian Optimization
Questo metodo è stato applicato con successo in molti ambiti. Tuttavia, è importante notare che presenta alcune sfide, e le principali sono illustrate di seguito:
Valutazione in batch / parallela
Una sfida è condurre in modo efficiente valutazioni in batch o in parallelo. Tradizionalmente, la Bayesian optimization opera in modo sequenziale, selezionando un punto alla volta da valutare. Estenderla a impostazioni batch, in cui si valutano simultaneamente più punti, non è banale e richiede un attento bilanciamento per garantire diversità ed efficienza nei punti scelti.
Ottimizzazione non miope
Si riferisce alla sfida di prendere decisioni strategiche di lungo periodo su quali punti valutare. I metodi non miopi considerano l'impatto futuro delle valutazioni correnti, il che può essere computazionalmente intensivo e complesso da modellare.
Dimensionalità dello spazio
All'aumentare della dimensionalità dello spazio di ricerca, la Bayesian optimization può diventare meno efficace. Ciò è dovuto alla "maledizione della dimensionalità", per cui il volume dello spazio cresce esponenzialmente, rendendo più difficile trovare gli ottimi con un numero limitato di valutazioni.
Spazio di ricerca strutturato
In molti problemi reali, lo spazio di ricerca non è un semplice spazio n-dimensionale continuo, ma ha una struttura complessa, come dipendenze tra variabili o vincoli. Gestire efficacemente questi spazi strutturati è una sfida significativa.
Ricerca multi-task/obiettivo, multi-fidelity
Estendere la Bayesian optimization per gestire simultaneamente più obiettivi o integrare informazioni da valutazioni di fedeltà (accuratezza) diversa è complesso. Questi scenari richiedono di bilanciare compromessi tra obiettivi diversi o tra livelli differenti di dettaglio nelle valutazioni.
Warm-start
Consiste nell'utilizzare conoscenze o dati preesistenti per accelerare il processo di ottimizzazione. Integrare efficacemente queste informazioni nel framework bayesiano senza introdurre bias è impegnativo.
Numero elevato di valutazioni
Sebbene la Bayesian optimization sia progettata per scenari in cui le valutazioni sono costose, in alcuni casi può essere comunque necessario un numero elevato di valutazioni. Gestire e navigare in modo efficiente questo numero elevato può essere impegnativo, soprattutto in termini di risorse computazionali e tempo.
Funzioni obiettivo "ostiche"
Gestire funzioni obiettivo con molti ottimi locali, discontinuità o non stazionarietà (in cui la funzione cambia nel tempo) è difficile. Queste funzioni possono fuorviare il processo di ottimizzazione e rendere ardua la ricerca di un ottimo globale.
Osservazione indiretta
In alcuni scenari, la funzione obiettivo non può essere osservata direttamente, ma solo tramite misurazioni indirette. Ciò aggiunge complessità, perché l'algoritmo deve inferire la reale funzione obiettivo da osservazioni indirette.
Acquisition function e processo decisionale
Nella Bayesian optimization, le acquisition function guidano la ricerca dei valori ottimali.
Acquisition function e modelli surrogati sono interdipendenti nella Bayesian optimization.
Il modello surrogato fornisce una previsione probabilistica della funzione obiettivo, che l'acquisition function usa per determinare i punti più promettenti da valutare successivamente. Inoltre, modelli surrogati come la Gaussian Process Regression sono particolarmente utili quando la funzione obiettivo è complessa o costosa da valutare direttamente.
Inoltre, aggiornando continuamente il modello surrogato con nuovi punti dati, l'acquisition function può essere indirizzata con maggiore precisione verso le aree dello spazio di ricerca più promettenti.
Diverse acquisition function possono essere utilizzate nella Bayesian optimization, tra cui:
Thompson Sampling: seleziona i punti sulla base di una stima probabilistica della funzione obiettivo.
Upper Confidence Bound (UCB): viene usata per selezionare il punto con la massima probabilità di migliorare il miglior valore osservato. Usa la differenza tra l'esito della potenziale nuova soluzione e l'attuale migliore, calcolando la probabilità di miglioramento.
Probability of Improvement (PI): usata per selezionare il punto che ha la probabilità più alta di superare il miglior valore osservato finora.
Expected Improvement (EI): usata per selezionare il punto con il massimo miglioramento atteso rispetto al miglior valore osservato.
Non esiste una funzione migliore o peggiore in assoluto. Ciascuna di queste acquisition function ha i suoi punti di forza e viene scelta in base ai requisiti specifici del problema di ottimizzazione.
Applicazioni della Bayesian Optimization
La Bayesian optimization è stata applicata con successo in molte industrie, e questa sezione ne illustra quattro casi d'uso:
Natural Language Processing
Machine Learning e tuning degli iperparametri
A/B testing, e
Reinforcement learning e robotica
Questi esempi sono particolarmente pertinenti e informativi per i Data Scientist.
Natural Language Processing
Quando si applica il Machine Learning a problemi di Natural Language Processing, ci sono molte scelte da fare sulla rappresentazione dei testi in input, e tali scelte possono influire sul risultato finale del modello.
La Bayesian optimization viene utilizzata per automatizzare il processo di scelta del miglior modo di rappresentare il testo nei modelli NLP, semplificando così lo sviluppo del modello e rendendolo più efficiente, mantenendo o addirittura migliorando le prestazioni complessive.
Per saperne di più sugli embeddings, il nostro corso Introduction to Embeddings with OpenAI API fornisce una guida completa all'uso dell'API di OpenAI per creare embeddings.
Machine Learning e tuning degli iperparametri
Nell'AutoML (automatic machine learning), la Bayesian optimization automatizza la selezione del miglior modello e dei suoi iperparametri per un dato problema su un determinato dataset.
Applicazioni recenti della Bayesian optimization hanno mostrato la sua efficacia nel mettere a punto modelli complessi come deep belief network, convolutional neural network e metodi Markov chain Monte Carlo.
Inoltre, è stata utile per automatizzare il processo di selezione tra i modelli offerti da librerie di machine learning popolari come WEKA e scikit-learn.
A/B Testing
Nell'A/B Testing, la Bayesian Optimization viene utilizzata per aumentare l'efficienza nel testare diverse configurazioni di prodotto, come annunci, app, giochi o siti web.
Presentando due opzioni (A e B) a un piccolo sottoinsieme di utenti, gli sviluppatori raccolgono feedback per ottimizzare varie metriche come l'engagement o i tassi di clic; la sfida chiave è identificare la migliore configurazione del prodotto con un budget limitato di interazioni utente.
La Bayesian Optimization facilita questo processo utilizzando il feedback dei test precedenti per prendere decisioni informate su quali sottoinsiemi di utenti interrogare successivamente, con l'obiettivo di ottimizzare le prestazioni complessive del prodotto riducendo al minimo i costi opportunità.
Reinforcement Learning e robotica
La Bayesian Optimization è stata applicata con efficacia sia nella robotica sia nel Reinforcement Learning.
In robotica è stata usata per ottimizzare l'andatura di un robot per obiettivi specifici come velocità o fluidità, come dimostrato con il robot Sony AIBO ERS-7. È stata inoltre impiegata in compiti di navigazione, aiutando i robot a minimizzare l'incertezza sulla propria posizione e sulle stime della mappa mentre si muovono nell'ambiente.
La Bayesian optimization è stata applicata nel reinforcement learning gerarchico per regolare automaticamente i parametri delle politiche di reti neurali e apprendere funzioni di valore a vari livelli di un sistema gerarchico.
Inoltre, la tecnica è stata utilizzata per sviluppare politiche di attenzione nel tracciamento di immagini con reti profonde, dimostrando la sua versatilità nell'adattarsi a diversi aspetti dell'apprendimento e del decision making in ambienti complessi.
Guida passo passo all'implementazione della Bayesian Optimization
Le sezioni precedenti hanno fornito una comprensione completa della Bayesian optimization. In questa sezione mostriamo come ottimizzare gli iperparametri di un XGBRegressor utilizzando la libreria GPyOpt.
PyMC3 è un'altra potente libreria utilizzata per la Bayesian optimization, e il nostro corso Bayesian Data Analysis in Python offre una guida completa con alcuni esempi reali.
Vengono applicati due metodi: Grid search e Bayesian optimization. L'obiettivo è identificare quale fornisce gli iperparametri ottimali, portando a un modello migliore. Il codice sorgente completo è disponibile in questo workbook DataLab; puoi creare una tua copia per modificare ed eseguire il codice nel browser senza installare nulla sul computer.
Prerequisiti
Le seguenti librerie sono necessarie per eseguire correttamente entrambe le tecniche.
numpy: una libreria per il calcolo numerico in Python.
scipy: una libreria per il calcolo scientifico in Python.
sklearn: una libreria per il machine learning in Python.
GPyOpt: una libreria per la Bayesian optimization in Python.
Xgboost per il modello XGBoost
Queste librerie possono essere installate con il comando pip come segue, da Jupyter notebook:
!pip -q install xgboost scikit-learn GPyOpt numpyOfferto da
Dopo aver eseguito correttamente il codice precedente, si effettuano gli import con l'istruzione import:
import xgboost as xgb
from sklearn.datasets import fetch_california_housing as fch
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import RandomizedSearchCV
from GPyOpt.methods import BayesianOptimization
from sklearn.model_selection import cross_val_score
import numpy as npOfferto da
Preparazione del dataset
L'analisi di benchmarking si basa sul dataset California housing.
Il 70% dei dati è utilizzato per addestrare il modello XGBoost
Il restante 30% è utilizzato per il test
La suddivisione tra training e test è descritta di seguito:
# Load dataset
california_housing = fch()
X = california_housing.data
y = california_housing.target
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.3,
random_state=2024)Offerto da
Dopo il caricamento dei dati di training e test, possiamo verificarne le dimensioni usando la funzione .shape.
print(f"Training Shape: {X_train.shape}")print(f"Testing Shape: {X_test.shape}")Offerto da
Tuning degli iperparametri con Random Search
Questa sezione spiega come configurare ed eseguire il tuning degli iperparametri con l'approccio Gridsearch per una regressione XGBoost utilizzando la classe RandomizedSearchCV del modulo scikit-learn.
Imposta la griglia dei parametri
Viene creato un dizionario chiamato param_dist con diversi iperparametri come chiavi e liste dei rispettivi valori possibili come valori. Questi iperparametri includono:
max_depth: Profondità massima di un albero. Valori: 3, 10, 5, 15.
min_child_weight: Somma minima dei pesi delle istanze (hessian) richiesta in un nodo figlio. Valori: 1, 5, 10.
subsample: Rapporto di sotto-campionamento delle istanze di training. Valori: 0.5, 0.7, 1.0.
colsample_bytree: Rapporto di sotto-campionamento delle colonne nella costruzione di ciascun albero. Valori: 0.5, 0.7, 1.0.
n_estimators: Numero di alberi potenziati a gradiente. Equivalente al numero di round di boosting. Valori: 100, 200, 300, 400.
param_dist ={'max_depth':[3,10,5,15],'min_child_weight':[1,5,10],'subsample':[0.5,0.7,1.0],'colsample_bytree':[0.5,0.7,1.0],'n_estimators':[100,200,300,400],'learning_rate':[0.01,0.05,0.1,0.15,0.2]}Offerto da
Inizializza l'XGBoost Regressor
Viene creata un'istanza della classe XGBRegressor dalla libreria XGBoost:
L'attributo best_params del modello addestrato contiene le informazioni sugli iperparametri che hanno portato al modello con prestazioni migliori.
Tali parametri possono essere recuperati come segue:
print("Random Search Best Parameters:", random_search.best_params_)Offerto da
Migliori parametri dalla Random search
Tra tutti i possibili parametri, i migliori per il modello XGBoost usando la Random search sono i seguenti:
'subsample':0.5,'n_estimators':400,'min_child_weight':5,'max_depth':10,'learning_rate':0.05,'colsample_bytree':1.0}Offerto da
Valuta il modello
Usando questi valori, possiamo valutare il modello e recuperare le sue prestazioni come segue:
Per prima cosa, inizializziamo il modello usando i migliori iperparametri prima dell'addestramento.
# Initialize and train the model
model_random_search = xgb.XGBRegressor(**params_random_search)
model_random_search.fit(X_train, y_train)Offerto da
Quindi, il modello viene valutato sui dati di test
predictions_random_search = model_random_search.predict(X_test)
mse_random_search = mean_squared_error(y_test, predictions_random_search)print("MSE for Random Search: ", mse_random_search)Offerto da
L'esecuzione corretta dei codici precedenti genera il seguente valore di mean squared error:
MSE per XGBosst usando gli iperparametri della Random search
Tuning degli iperparametri con Bayesian Optimization
Analogamente alla random search, applichiamo un processo passo passo per generare i migliori iperparametri utilizzando la Bayesian optimization.
Imposta i limiti dei parametri
I limiti degli iperparametri sono definiti in una lista baysian_opt_bounds. Ogni iperparametro è rappresentato come un dizionario con le chiavi: name, type e domain.
max_depth, min_child_weight, n_estimators sono variabili discrete.
subsample, colsample_bytree, learning_rate sono variabili continue.
Il domain specifica l'intervallo di valori per ciascun iperparametro.
baysian_opt_bounds =[{'name':'max_depth','type':'discrete','domain':(3,10,5,15)},{'name':'min_child_weight','type':'discrete','domain':(1,5,10)},{'name':'subsample','type':'continuous','domain':(0.5,1.0)},{'name':'colsample_bytree','type':'continuous','domain':(0.5,1.0)},{'name':'n_estimators','type':'discrete','domain':(100,200,300,400)},{'name':'learning_rate','type':'continuous','domain':(0.01,0.2)}]Offerto da
Definisci la funzione obiettivo
Viene definita una funzione obiettivo xgb_cv_score per calcolare il mean squared error negativo con cross-validation di un modello XGBoost.
La funzione prende un set di parametri e li converte nel formato richiesto.
cross_val_score è usata per valutare il modello XGBoost con i parametri specificati.
La media negativa dei punteggi della cross-validation viene restituita come obiettivo da minimizzare.
La Bayesian optimization è istanziata con i seguenti parametri:
f=xgb_cv_score: La funzione obiettivo da minimizzare.
domain=baysian_opt_bounds: I limiti degli iperparametri.
model_type='GP': Specifica l'uso dei Gaussian Process.
acquisition_type='EI': Usa Expected Improvement come acquisition function.
max_iter=25: Il numero di iterazioni per il processo di ottimizzazione.
Il processo di ottimizzazione viene avviato con optimizer.run_optimization()
optimizer = BayesianOptimization(
f=xgb_cv_score, domain=baysian_opt_bounds, model_type='GP',
acquisition_type='EI', max_iter=25)
optimizer.run_optimization()Offerto da
Accedi ai migliori parametri
Dopo l'ottimizzazione, i migliori parametri vengono estratti e formattati:
I parametri sono recuperati da optimizer.x_opt.
I parametri discreti (max_depth, min_child_weight, n_estimators) sono convertiti in interi.
I migliori parametri vengono stampati:
print("Bayesian Optimization Best Parameters:", best_params_bayesian)Offerto da
Migliori parametri dalla Bayesian optimization
Valuta il modello
L'inizializzazione e il fitting sono gli stessi di prima. Ma questa volta usiamo i parametri ottenuti dalla Bayesian optimization:
params_bayesian_opt ={'max_depth':10,'min_child_weight':10,'subsample':0.820222997732141,'colsample_bytree':0.6710357796023916,'n_estimators':300,'learning_rate':0.04797554348030097}# Initialize and train the model
model_bayesian_opt = xgb.XGBRegressor(**params_bayesian_opt)
model_bayesian_opt.fit(X_train, y_train)# Make predictions and evaluate
predictions_bayesian_opt = model_bayesian_opt.predict(X_test)
mse_bayesian_opt = mean_squared_error(y_test, predictions_bayesian_opt)print("MSE for Bayesian Optimization: ", mse_bayesian_opt)Offerto da
Le prestazioni del modello sono fornite dopo l'esecuzione corretta del codice sopra, e il risultato è riportato di seguito:
MSE per XGBosst usando gli iperparametri della Bayesian optimization
Interpretazione dei risultati
Dalle due sperimentazioni, notiamo che:
MSE inferiore nella Bayesian Optimization: Il modello addestrato con gli iperparametri della Bayesian Optimization ha un MSE inferiore (0.204) rispetto a quello della Random Search (0.219). Questo valore più basso indica che, in media, il modello è più vicino ai veri punti dati.
Prestazioni del modello: L'MSE inferiore indica che la Bayesian Optimization è stata più efficace nel mettere a punto gli iperparametri per il modello XGBoost. Questo risultato suggerisce che il modello ottimizzato con la Bayesian Optimization generalizza meglio dai dati di training a dati non visti (in questo caso, il test set).
Efficienza della Bayesian optimization: In generale, la Bayesian optimization porta a prestazioni migliori nel tuning degli iperparametri perché utilizza un modello probabilistico per guidare la ricerca dei migliori parametri. Impara dalle valutazioni precedenti e indirizza la ricerca verso gli iperparametri più promettenti, trovando spesso valori migliori rispetto alla Random Search.
In questo caso specifico, la Bayesian Optimization ha fornito risultati migliori, come dimostrato dall'MSE più basso. Ciò suggerisce che, per questo particolare dataset e modello (XGBoost), la Bayesian Optimization è stata più efficace nell'identificare il set di iperparametri che minimizzava l'errore di previsione sul test set.
È importante notare che, sebbene in questo caso la Bayesian Optimization abbia mostrato prestazioni migliori, la scelta tra Random Search e Bayesian Optimization può dipendere da vari fattori come la complessità del modello, la natura dei dati e le risorse computazionali.
Tuttavia, negli scenari in cui la precisione nel tuning degli iperparametri è cruciale e le risorse computazionali lo consentono, la Bayesian Optimization si rivela spesso la scelta migliore.
Conclusione
Questo articolo ha offerto un'esplorazione approfondita della Bayesian Optimization, una tecnica chiave per ottimizzare funzioni complesse.
Abbiamo iniziato definendo cos'è la Bayesian optimization, per poi affrontare le sfide nell'ottimizzazione di funzioni, evidenziando la pertinenza di questo approccio.
Attraverso una guida pratica, siamo entrati negli aspetti implementativi, concentrandoci sulla Gaussian Process Regression e sulle acquisition function. Una parte significativa della discussione si è incentrata sull'applicazione della Bayesian Optimization al tuning degli iperparametri nei modelli di machine learning, mostrando la sua utilità nel mondo reale.
Nel complesso, questo articolo funge sia da panoramica introduttiva sia da guida pratica, mettendo in luce il ruolo fondamentale della Bayesian Optimization nel machine learning e nell'ottimizzazione computazionale.
Offre spunti preziosi per professionisti, ricercatori ed entusiasti del settore, sottolineando l'applicabilità e l'impatto del metodo nelle sfide computazionali moderne.
Per chi vuole approfondire la Bayesian optimization e la sua implementazione in Python, il nostro corso Hyperparameter Tuning in Python offre esperienza pratica nell'uso di metodologie comuni per l'ottimizzazione automatizzata degli iperparametri con la libreria Scikit Learn. Alcune metodologie avanzate includono algoritmi bayesiani e genetici.
Un data scientist poliedrico che ama condividere le proprie conoscenze e restituire valore agli altri, Zoumana è un content creator su YouTube e un top writer tech su Medium. Trova soddisfazione nel parlare in pubblico, programmare e insegnare. Zoumana ha due lauree magistrali: la prima in informatica con specializzazione in Machine Learning conseguita a Parigi, Francia, e la seconda in Data Science alla Texas Tech University negli Stati Uniti. Ha iniziato la sua carriera come Software Developer presso Groupe OPEN in Francia, per poi passare a IBM come Machine Learning Consultant, dove ha sviluppato soluzioni di IA end-to-end per compagnie assicurative. Successivamente, è entrato in Axionable, la prima startup di Sustainable AI con sede a Parigi e Montréal. Lì ha lavorato come Data Scientist e ha implementato prodotti di IA, principalmente casi d’uso di NLP, per clienti in Francia, Montréal, Singapore e Svizzera. Inoltre, ha dedicato il 5% del suo tempo ad attività di Ricerca e Sviluppo. Attualmente lavora come Senior Data Scientist presso IFC - World Bank Group.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Nel vasto campo del Machine Learning, la sfida di orientarsi in dataset ampi e complessi per trovare gli iperparametri ottimali durante l'addestramento dei modelli è un ostacolo comune.
I metodi convenzionali, spesso basati su random e grid search, possono richiedere molto tempo ed essere inefficienti, soprattutto quando si lavora con architetture di modelli complesse o dati su larga scala.
È qui che emerge la necessità di un approccio più intelligente e adattivo come la Bayesian optimization, sempre più cruciale per l'ottimizzazione degli iperparametri.
Il primo obiettivo di questo articolo è spiegare cos'è la Bayesian optimization, fornendo al lettore solide basi teoriche. Tuttavia, prima di entrarci nel merito, è importante comprendere i diversi metodi di ottimizzazione degli iperparametri a nostra disposizione.
La seconda parte dell'articolo copre un'implementazione più pratica dei concetti chiave utilizzando il linguaggio di programmazione Python. Nell'ultima sezione imparerai come sfruttare la Bayesian optimization per il tuning degli iperparametri di un modello di machine learning.
Che cos'è la Bayesian Optimization?
Prima di arrivare alla definizione di Bayesian optimization, diamo una panoramica dei quattro principali metodi di ottimizzazione degli iperparametri con esempi semplici:
Ricerca manuale
È il metodo più basilare, basato su esperienza, intuizione o tentativi ed errori. Spesso richiede molto tempo e dipende fortemente dalla competenza di chi lo applica.
Ad esempio, un fornaio esperto imposta la temperatura del forno e i tempi di cottura in base all'esperienza passata e all'intuizione.
Un punto di partenza tipico potrebbe essere una temperatura di 350°F e un tempo di cottura di 30 minuti, che riflettono impostazioni spesso vincenti. Le regolazioni vengono poi fatte in base all'esito di ogni prova di cottura.
Ricerca casuale
Questo approccio prevede la selezione casuale di combinazioni di temperatura e tempo all'interno di un intervallo specificato. Ad esempio, le temperature possono variare tra 325°F e 375°F e i tempi tra 25 e 35 minuti.
Il processo di selezione potrebbe iniziare a 330°F per 27 minuti, seguito da 370°F per 31 minuti, continuando in modo casuale finché non si identifica la combinazione più efficace.
Grid search
Questo metodo prevede l'esplorazione sistematica di più combinazioni di valori degli iperparametri.
Proseguendo con lo stesso esempio di cottura: il fornaio crea una griglia strutturata di combinazioni di temperatura e tempo sul muro.
La griglia potrebbe includere incrementi di 5°F tra 325°F e 375°F e incrementi di 2 minuti tra 25 e 35 minuti. La torta verrebbe poi cotta per ogni singola combinazione della griglia (325°F per 25 minuti, 325°F per 27 minuti, ... , 375°F per 35 minuti) per trovare la combinazione migliore.
Ricerca bayesiana
La Bayesian Optimization può essere vista come un approccio più intelligente rispetto alla ricerca casuale per trovare la migliore temperatura e il miglior tempo di cottura per una torta.
La Random Search potrebbe comportare che il fornaio provi a caso un'ampia varietà di combinazioni di temperatura e tempo, molte delle quali portano a torte crude o troppo cotte.
Nella Bayesian optimization, la ricerca del fornaio per le condizioni di cottura ottimali è guidata e informata dai risultati precedenti.
Per esempio, se il fornaio scopre che le torte cotte intorno a 350°F per 30 minuti tendono a riuscire meglio, concentrerà successivamente i tentativi su combinazioni di temperatura e tempo vicine a questi valori.
Questo metodo riduce il numero di prove necessarie perché "impara" quali combinazioni hanno maggiori probabilità di produrre una torta perfettamente cotta, basandosi sugli esiti delle sessioni precedenti.
In generale, la Bayesian optimization si basa sul teorema di Bayes per ottimizzare funzioni obiettivo costose da valutare. È particolarmente efficace negli scenari in cui il campionamento è oneroso e la funzione obiettivo è sconosciuta ma campionabile.
Tipicamente impiega un modello probabilistico, come un Gaussian Process, per stimare la funzione obiettivo e poi usa una acquisition function per decidere dove campionare successivamente.
Sfide della Bayesian Optimization
Questo metodo è stato applicato con successo in molti ambiti. Tuttavia, è importante notare che presenta alcune sfide, e le principali sono illustrate di seguito:
Valutazione in batch / parallela
Una sfida è condurre in modo efficiente valutazioni in batch o in parallelo. Tradizionalmente, la Bayesian optimization opera in modo sequenziale, selezionando un punto alla volta da valutare. Estenderla a impostazioni batch, in cui si valutano simultaneamente più punti, non è banale e richiede un attento bilanciamento per garantire diversità ed efficienza nei punti scelti.
Ottimizzazione non miope
Si riferisce alla sfida di prendere decisioni strategiche di lungo periodo su quali punti valutare. I metodi non miopi considerano l'impatto futuro delle valutazioni correnti, il che può essere computazionalmente intensivo e complesso da modellare.
Dimensionalità dello spazio
All'aumentare della dimensionalità dello spazio di ricerca, la Bayesian optimization può diventare meno efficace. Ciò è dovuto alla "maledizione della dimensionalità", per cui il volume dello spazio cresce esponenzialmente, rendendo più difficile trovare gli ottimi con un numero limitato di valutazioni.
Spazio di ricerca strutturato
In molti problemi reali, lo spazio di ricerca non è un semplice spazio n-dimensionale continuo, ma ha una struttura complessa, come dipendenze tra variabili o vincoli. Gestire efficacemente questi spazi strutturati è una sfida significativa.
Ricerca multi-task/obiettivo, multi-fidelity
Estendere la Bayesian optimization per gestire simultaneamente più obiettivi o integrare informazioni da valutazioni di fedeltà (accuratezza) diversa è complesso. Questi scenari richiedono di bilanciare compromessi tra obiettivi diversi o tra livelli differenti di dettaglio nelle valutazioni.
Warm-start
Consiste nell'utilizzare conoscenze o dati preesistenti per accelerare il processo di ottimizzazione. Integrare efficacemente queste informazioni nel framework bayesiano senza introdurre bias è impegnativo.
Numero elevato di valutazioni
Sebbene la Bayesian optimization sia progettata per scenari in cui le valutazioni sono costose, in alcuni casi può essere comunque necessario un numero elevato di valutazioni. Gestire e navigare in modo efficiente questo numero elevato può essere impegnativo, soprattutto in termini di risorse computazionali e tempo.
Funzioni obiettivo "ostiche"
Gestire funzioni obiettivo con molti ottimi locali, discontinuità o non stazionarietà (in cui la funzione cambia nel tempo) è difficile. Queste funzioni possono fuorviare il processo di ottimizzazione e rendere ardua la ricerca di un ottimo globale.
Osservazione indiretta
In alcuni scenari, la funzione obiettivo non può essere osservata direttamente, ma solo tramite misurazioni indirette. Ciò aggiunge complessità, perché l'algoritmo deve inferire la reale funzione obiettivo da osservazioni indirette.
Acquisition function e processo decisionale
Nella Bayesian optimization, le acquisition function guidano la ricerca dei valori ottimali.
Acquisition function e modelli surrogati sono interdipendenti nella Bayesian optimization.
Il modello surrogato fornisce una previsione probabilistica della funzione obiettivo, che l'acquisition function usa per determinare i punti più promettenti da valutare successivamente. Inoltre, modelli surrogati come la Gaussian Process Regression sono particolarmente utili quando la funzione obiettivo è complessa o costosa da valutare direttamente.
Inoltre, aggiornando continuamente il modello surrogato con nuovi punti dati, l'acquisition function può essere indirizzata con maggiore precisione verso le aree dello spazio di ricerca più promettenti.
Diverse acquisition function possono essere utilizzate nella Bayesian optimization, tra cui:
Non esiste una funzione migliore o peggiore in assoluto. Ciascuna di queste acquisition function ha i suoi punti di forza e viene scelta in base ai requisiti specifici del problema di ottimizzazione.
Applicazioni della Bayesian Optimization
La Bayesian optimization è stata applicata con successo in molte industrie, e questa sezione ne illustra quattro casi d'uso:
Questi esempi sono particolarmente pertinenti e informativi per i Data Scientist.
Natural Language Processing
Quando si applica il Machine Learning a problemi di Natural Language Processing, ci sono molte scelte da fare sulla rappresentazione dei testi in input, e tali scelte possono influire sul risultato finale del modello.
La Bayesian optimization viene utilizzata per automatizzare il processo di scelta del miglior modo di rappresentare il testo nei modelli NLP, semplificando così lo sviluppo del modello e rendendolo più efficiente, mantenendo o addirittura migliorando le prestazioni complessive.
Per saperne di più sugli embeddings, il nostro corso Introduction to Embeddings with OpenAI API fornisce una guida completa all'uso dell'API di OpenAI per creare embeddings.
Machine Learning e tuning degli iperparametri
Nell'AutoML (automatic machine learning), la Bayesian optimization automatizza la selezione del miglior modello e dei suoi iperparametri per un dato problema su un determinato dataset.
Applicazioni recenti della Bayesian optimization hanno mostrato la sua efficacia nel mettere a punto modelli complessi come deep belief network, convolutional neural network e metodi Markov chain Monte Carlo.
Inoltre, è stata utile per automatizzare il processo di selezione tra i modelli offerti da librerie di machine learning popolari come WEKA e scikit-learn.
A/B Testing
Nell'A/B Testing, la Bayesian Optimization viene utilizzata per aumentare l'efficienza nel testare diverse configurazioni di prodotto, come annunci, app, giochi o siti web.
Presentando due opzioni (A e B) a un piccolo sottoinsieme di utenti, gli sviluppatori raccolgono feedback per ottimizzare varie metriche come l'engagement o i tassi di clic; la sfida chiave è identificare la migliore configurazione del prodotto con un budget limitato di interazioni utente.
La Bayesian Optimization facilita questo processo utilizzando il feedback dei test precedenti per prendere decisioni informate su quali sottoinsiemi di utenti interrogare successivamente, con l'obiettivo di ottimizzare le prestazioni complessive del prodotto riducendo al minimo i costi opportunità.
Reinforcement Learning e robotica
La Bayesian Optimization è stata applicata con efficacia sia nella robotica sia nel Reinforcement Learning.
In robotica è stata usata per ottimizzare l'andatura di un robot per obiettivi specifici come velocità o fluidità, come dimostrato con il robot Sony AIBO ERS-7. È stata inoltre impiegata in compiti di navigazione, aiutando i robot a minimizzare l'incertezza sulla propria posizione e sulle stime della mappa mentre si muovono nell'ambiente.
La Bayesian optimization è stata applicata nel reinforcement learning gerarchico per regolare automaticamente i parametri delle politiche di reti neurali e apprendere funzioni di valore a vari livelli di un sistema gerarchico.
Inoltre, la tecnica è stata utilizzata per sviluppare politiche di attenzione nel tracciamento di immagini con reti profonde, dimostrando la sua versatilità nell'adattarsi a diversi aspetti dell'apprendimento e del decision making in ambienti complessi.
Guida passo passo all'implementazione della Bayesian Optimization
Le sezioni precedenti hanno fornito una comprensione completa della Bayesian optimization. In questa sezione mostriamo come ottimizzare gli iperparametri di un XGBRegressor utilizzando la libreria GPyOpt.
PyMC3 è un'altra potente libreria utilizzata per la Bayesian optimization, e il nostro corso Bayesian Data Analysis in Python offre una guida completa con alcuni esempi reali.
Per chi è interessato ad applicare la Bayesian optimization con il linguaggio R, il nostro corso Fundamentals of Bayesian Data Analysis in R è la scelta giusta.
Vengono applicati due metodi: Grid search e Bayesian optimization. L'obiettivo è identificare quale fornisce gli iperparametri ottimali, portando a un modello migliore. Il codice sorgente completo è disponibile in questo workbook DataLab; puoi creare una tua copia per modificare ed eseguire il codice nel browser senza installare nulla sul computer.
Prerequisiti
Le seguenti librerie sono necessarie per eseguire correttamente entrambe le tecniche.
Queste librerie possono essere installate con il comando pip come segue, da Jupyter notebook:
Dopo aver eseguito correttamente il codice precedente, si effettuano gli import con l'istruzione import:
Preparazione del dataset
L'analisi di benchmarking si basa sul dataset California housing.
La suddivisione tra training e test è descritta di seguito:
Dopo il caricamento dei dati di training e test, possiamo verificarne le dimensioni usando la funzione .shape.
Tuning degli iperparametri con Random Search
Questa sezione spiega come configurare ed eseguire il tuning degli iperparametri con l'approccio Gridsearch per una regressione XGBoost utilizzando la classe RandomizedSearchCV del modulo scikit-learn.
Imposta la griglia dei parametri
Viene creato un dizionario chiamato
param_distcon diversi iperparametri come chiavi e liste dei rispettivi valori possibili come valori. Questi iperparametri includono:Inizializza l'XGBoost Regressor
Viene creata un'istanza della classe
XGBRegressordalla libreria XGBoost:Configura RandomizedSearchCV
RandomizedSearchCV è configurato con i seguenti parametri:
Addestra il modello e accedi ai parametri
Il metodo fit viene utilizzato per eseguire la ricerca casuale sui dati di training forniti (X_train e y_train):
L'attributo best_params del modello addestrato contiene le informazioni sugli iperparametri che hanno portato al modello con prestazioni migliori.
Tali parametri possono essere recuperati come segue:
Migliori parametri dalla Random search
Tra tutti i possibili parametri, i migliori per il modello XGBoost usando la Random search sono i seguenti:
Valuta il modello
Usando questi valori, possiamo valutare il modello e recuperare le sue prestazioni come segue:
Per prima cosa, inizializziamo il modello usando i migliori iperparametri prima dell'addestramento.
Quindi, il modello viene valutato sui dati di test
L'esecuzione corretta dei codici precedenti genera il seguente valore di mean squared error:
MSE per XGBosst usando gli iperparametri della Random search
Tuning degli iperparametri con Bayesian Optimization
Analogamente alla random search, applichiamo un processo passo passo per generare i migliori iperparametri utilizzando la Bayesian optimization.
Imposta i limiti dei parametri
I limiti degli iperparametri sono definiti in una lista baysian_opt_bounds. Ogni iperparametro è rappresentato come un dizionario con le chiavi: name, type e domain.
Definisci la funzione obiettivo
Viene definita una funzione obiettivo xgb_cv_score per calcolare il mean squared error negativo con cross-validation di un modello XGBoost.
Inizializza ed esegui il modello bayesiano
La Bayesian optimization è istanziata con i seguenti parametri:
Il processo di ottimizzazione viene avviato con optimizer.run_optimization()
Accedi ai migliori parametri
Dopo l'ottimizzazione, i migliori parametri vengono estratti e formattati:
I migliori parametri vengono stampati:
Migliori parametri dalla Bayesian optimization
Valuta il modello
L'inizializzazione e il fitting sono gli stessi di prima. Ma questa volta usiamo i parametri ottenuti dalla Bayesian optimization:
Le prestazioni del modello sono fornite dopo l'esecuzione corretta del codice sopra, e il risultato è riportato di seguito:
MSE per XGBosst usando gli iperparametri della Bayesian optimization
Interpretazione dei risultati
Dalle due sperimentazioni, notiamo che:
In questo caso specifico, la Bayesian Optimization ha fornito risultati migliori, come dimostrato dall'MSE più basso. Ciò suggerisce che, per questo particolare dataset e modello (XGBoost), la Bayesian Optimization è stata più efficace nell'identificare il set di iperparametri che minimizzava l'errore di previsione sul test set.
È importante notare che, sebbene in questo caso la Bayesian Optimization abbia mostrato prestazioni migliori, la scelta tra Random Search e Bayesian Optimization può dipendere da vari fattori come la complessità del modello, la natura dei dati e le risorse computazionali.
Tuttavia, negli scenari in cui la precisione nel tuning degli iperparametri è cruciale e le risorse computazionali lo consentono, la Bayesian Optimization si rivela spesso la scelta migliore.
Conclusione
Questo articolo ha offerto un'esplorazione approfondita della Bayesian Optimization, una tecnica chiave per ottimizzare funzioni complesse.
Abbiamo iniziato definendo cos'è la Bayesian optimization, per poi affrontare le sfide nell'ottimizzazione di funzioni, evidenziando la pertinenza di questo approccio.
Attraverso una guida pratica, siamo entrati negli aspetti implementativi, concentrandoci sulla Gaussian Process Regression e sulle acquisition function. Una parte significativa della discussione si è incentrata sull'applicazione della Bayesian Optimization al tuning degli iperparametri nei modelli di machine learning, mostrando la sua utilità nel mondo reale.
Nel complesso, questo articolo funge sia da panoramica introduttiva sia da guida pratica, mettendo in luce il ruolo fondamentale della Bayesian Optimization nel machine learning e nell'ottimizzazione computazionale.
Offre spunti preziosi per professionisti, ricercatori ed entusiasti del settore, sottolineando l'applicabilità e l'impatto del metodo nelle sfide computazionali moderne.
Per chi vuole approfondire la Bayesian optimization e la sua implementazione in Python, il nostro corso Hyperparameter Tuning in Python offre esperienza pratica nell'uso di metodologie comuni per l'ottimizzazione automatizzata degli iperparametri con la libreria Scikit Learn. Alcune metodologie avanzate includono algoritmi bayesiani e genetici.