Ottimizzazione di iperparametri con Hyperopt

Completato

Un altro strumento open source che consente di automatizzare il processo di ottimizzazione degli iperparametri e selezione del modello è Hyperopt. Hyperopt è semplice da usare, ma per utilizzarlo in modo efficiente occorre prestare attenzione. Il vantaggio principale dell'uso di Hyperopt è che è flessibile e che consente di ottimizzare qualsiasi modello Python con iperparametri.

Usare Hyperopt

Hyperopt è già installato se si crea un calcolo con Databricks Runtime ML. Per usarlo nell'ambito del training di un modello Python, seguire questa procedura di base:

  1. Definire una funzione obiettivo da ridurre.
  2. Definire lo spazio di ricerca degli iperparametri.
  3. Specificare l'algoritmo di ricerca.
  4. Eseguire la funzione di Hyperopt fmin().

Definire una funzione obiettivo da ridurre al minimo

La funzione obiettivo rappresenta lo scopo principale del training di più modelli mediante l'ottimizzazione degli iperparametri. Spesso, l'obiettivo è ridurre al minimo la perdita di training o convalida.

Quando si definisce una funzione, è possibile usare qualsiasi metrica di valutazione che possa essere calcolata con l'algoritmo selezionato. Ad esempio, se si usa un classificatore di macchine a vettori di supporto dalla libreria Scikit-learn, è possibile modificare il valore per il parametro di regolarizzazione c. L'obiettivo è quello di avere il modello con la massima accuratezza. Poiché Hyperopt richiede una funzione da minimizzare, è possibile definire la funzione obiettivo come accuratezza negativa, in modo che a un punteggio inferiore corrisponda effettivamente un'accuratezza più elevata.

Nell'esempio seguente il parametro di regolarizzazione c viene definito come input, viene eseguito il training di un modello di classificatore di macchine a vettori di supporto, viene calcolata l'accuratezza e la funzione obiettivo viene definita come accuratezza negativa, il valore che Hyperopt tenterà di minimizzare.

from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC

def objective(C):
    clf = SVC(C)
    
    accuracy = cross_val_score(clf, X, y).mean()
    
    return {'loss': -accuracy, 'status': STATUS_OK}

Definire lo spazio di ricerca degli iperparametri

Quando si ottimizzano gli iperparametri, è necessario definire uno spazio di ricerca. Se si vuole usare l'approccio bayesiano di Hyperopt al campionamento, è disponibile un set di espressioni utilizzabile per definire lo spazio di ricerca compatibile con l'approccio di campionamento di Hyperopt.

Di seguito sono riportati alcuni esempi delle espressioni usate per definire lo spazio di ricerca:

  • hp.choice(label, options): restituisce uno dei valori options elencati.
  • hp.randint(label, upper): restituisce un intero casuale nell'intervallo [0, superiore].
  • hp.uniform(label, low, high): restituisce un valore in modo uniforme tra low e high.
  • hp.normal(label, mu, sigma): restituisce un valore reale distribuito in modo normale con la media mu e la deviazione standard sigma.

Per l'elenco completo delle espressioni, vedere la documentazione di Hyperopt.

Selezionare l'algoritmo di ricerca

Esistono due opzioni principali rispetto alla modalità di campionamento di Hyperopt nello spazio di ricerca:

  • hyperopt.tpe.suggest: Tree of Parzen Estimators (TPE), un approccio bayesiano che seleziona in modo iterativo e adattivo nuove impostazioni degli iperparametri da esplorare in base ai risultati precedenti.
  • hyperopt.rand.suggest: ricerca casuale, un approccio non adattivo che campiona lo spazio di ricerca.

Eseguire la funzione di Hyperopt fmin()

Infine, per eseguire un'esecuzione di Hyperopt si può usare la funzione fmin(). La funzione fmin() accetta gli argomenti seguenti:

  • fn: funzione obiettivo.
  • space: spazio di ricerca.
  • algo: algoritmo di ricerca che Hyperopt deve utilizzare.
  • max_evals: numero massimo di modelli di cui eseguire il training.
  • max_queue_len: numero di impostazioni degli iperparametri generate in anticipo. Questo può consentire di risparmiare tempo quando si usa l'algoritmo TPE.
  • trials: oggetto SparkTrials o Trials. SparkTrials viene usato per gli algoritmi a computer singolo, ad esempio Scikit-learn. Trials viene usato per gli algoritmi di training distribuito, ad esempio metodi MLlib o Horovod. Quando si usa SparkTrials o Horovod, il monitoraggio automatizzato di MLflow è abilitato e gli iperparametri e le metriche di valutazione vengono registrati automaticamente in MLflow.

Per altre informazioni su come configurare fmin() e SparkTrials, vedere i concetti di Hyperopt qui.