MLflow automatizzato per l'ottimizzazione dei modelli

Completato

Per scegliere il migliore dei modelli sottoposti a training durante l'ottimizzazione degli iperparametri, è necessario confrontare tutti i modelli valutandone le metriche. Un approccio semplice e diffuso per tenere traccia del training dei modelli in Azure Databricks consiste nell'usare la piattaforma open source MLflow.

Usare MLflow automatizzato

Quando si esegue il training di più modelli con l'ottimizzazione degli iperparametri, è utile evitare di dover effettuare chiamate API esplicite per registrare tutte le informazioni necessarie sui diversi modelli in MLflow. Per semplificare l'ottimizzazione degli iperparametri, Databricks Runtime per Machine Learning supporta anche il monitoraggio di MLflow automatizzato. Quando si usa MLflow automatizzato per l'ottimizzazione dei modelli, i valori degli iperparametri e le metriche di valutazione vengono registrati automaticamente in MLflow e viene creata una gerarchia per le diverse esecuzioni che rappresentano i distinti modelli sottoposti a training.

Per usare il monitoraggio di MLflow automatizzato, è necessario procedere come segue:

  • Usare un notebook Python per ospitare il codice.
  • Collegare il notebook a un cluster con Databricks Runtime o Databricks Runtime per Machine Learning.
  • Configurare l'ottimizzazione degli iperparametri con CrossValidator o TrainValidationSplit.

MLflow creerà automaticamente un'esecuzione principale o padre contenente le informazioni per il metodo scelto: CrossValidator o TrainValidationSplit. Creerà inoltre esecuzioni figlio annidate sotto l'esecuzione principale o padre. Ogni esecuzione figlio rappresenta un modello sottoposto a training ed è possibile esaminare i valori degli iperparametri utilizzati e le metriche di valutazione risultanti.

Eseguire il codice di ottimizzazione

Quando si vuole eseguire il codice che eseguirà il training di più modelli con impostazioni degli iperparametri diverse, è possibile seguire questa procedura:

  • Elencare gli iperparametri disponibili per un algoritmo specifico.
  • Configurare lo spazio di ricerca e il metodo di campionamento.
  • Eseguire il codice con MLflow automatizzato, usando CrossValidator o TrainValidationSplit.

Elencare gli iperparametri disponibili

Per esplorare gli iperparametri di uno specifico algoritmo di Machine Learning è possibile usare il metodo .explainParams() in un modello. Ad esempio, se si vuole eseguire il training di un modello di regressione lineare lr, usare il comando seguente per visualizzare gli iperparametri disponibili:

print(lr.explainParams())

Il metodo .explainParams() restituirà un elenco di iperparametri tra cui scegliere, con il nome dell'iperparametro, una descrizione e il valore predefinito. Tre degli iperparametri disponibili per il modello di regressione lineare sono:

  • maxIter: numero massimo di iterazioni (>= 0). (valore predefinito: 100)
  • fitIntercept: indica se adattare un termine di intercettazione. Predefinito: True
  • standardization: indica se standardizzare le funzionalità di training prima di adattare il modello. Predefinito: True

Configurare lo spazio di ricerca e il metodo di campionamento

Dopo aver selezionato gli iperparametri, è possibile usare ParamGridBuilder() per specificare lo spazio di ricerca. Lo spazio di ricerca è l'intervallo di valori degli iperparametri da provare. Si può quindi specificare il modo in cui scegliere i valori da tale spazio di ricerca per eseguire il training dei singoli modelli, vale a dire il metodo di campionamento. Il metodo di campionamento più semplice è noto come campionamento a griglia. Il metodo di campionamento a griglia prova tutte le possibili combinazioni di valori per gli iperparametri elencati.

Per impostazione predefinita, i singoli modelli verranno sottoposti a training in serie. È possibile eseguire il training di modelli con valori diversi degli iperparametri in parallelo. Per altre informazioni sulla configurazione della griglia dei parametri, vedere la documentazione qui.

Nota

Poiché la ricerca a griglia funziona attraverso la creazione completa di un modello per ogni combinazione di iperparametri, produce rapidamente una grande quantità di combinazioni univoche diverse. Visto che il training di ogni modello può utilizzare una quantità notevole di potenza di calcolo, configurare la potenza di calcolo con particolare attenzione.

Continuando l'esempio con il modello di regressione lineare lr, il codice seguente illustra come configurare una ricerca a griglia per provare tutte le possibili combinazioni di parametri:

from pyspark.ml.tuning import ParamGridBuilder

paramGrid = (ParamGridBuilder()
  .addGrid(lr.maxIter, [1, 10, 100])
  .addGrid(lr.fitIntercept, [True, False])
  .addGrid(lr.standardization, [True, False])
  .build()
)

Eseguire codice e richiamare MLflow automatizzato

Per testare le prestazioni del modello e generare metriche di valutazione, è possibile usare un set di dati di test. Se si vuole eseguire il training di più modelli nello stesso set di dati di training e nello stesso set di dati di test, è possibile usare il metodo TrainValidationSplit per eseguire il codice, compilare i modelli e registrarli automaticamente con MLflow.

Se si vogliono adottare misure aggiuntive per evitare l'overfitting, si può usare il metodo CrossValidator per eseguire il training dei modelli con set di dati di training diversi per ognuno e set di dati di test diversi per calcolare le metriche di valutazione.

Per creare i modelli per il modello di regressione lineare lr usato negli esempi precedenti, è possibile creare un RegressionEvaluator() per valutare gli esperimenti di ricerca a griglia. Questo sarà utile per stabilire qual è il modello migliore. Le impostazioni per l'esperimento di ottimizzazione degli iperparametri possono essere configurate usando il metodo CrossValidator(), come illustrato nell'esempio seguente.

from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.tuning import CrossValidator

evaluator = RegressionEvaluator(
  labelCol = "medv", 
  predictionCol = "prediction"
)

cv = CrossValidator(
  estimator = pipeline,             # Estimator (individual model or pipeline)
  estimatorParamMaps = paramGrid,   # Grid of parameters to try (grid search)
  evaluator=evaluator,              # Evaluator
  numFolds = 3,                     # Set k to 3
  seed = 42                         # Seed to sure our results are the same if ran again
)

cvModel = cv.fit(trainDF)

Dopo aver eseguito il training di tutti i modelli, è possibile ottenere il modello migliore con il codice seguente:

bestModel = cvModel.bestModel

In alternativa, è possibile esaminare tutti i modelli di cui è stato eseguito il training tramite l'interfaccia utente di MLflow. Ricordare che saranno presenti un'esecuzione padre per l'esperimento completo ed esecuzioni figlio per ogni singolo modello sottoposto a training.