La modellazione dei dati è un aspetto importante di qualsiasi progetto basato sui dati e la scelta degli strumenti e delle tecniche giuste può fare una grande differenza nella qualità e nell'affidabilità dei modelli.

Uno strumento da prendere in considerazione è Pydantic, una libreria Python che fornisce un modo semplice ed efficace per definire e convalidare i modelli di dati.

Che cosa è Pydantic?

Pydantic è una libreria creata per fornire un modo semplice ed efficiente per definire e convalidare i modelli di dati in Python.

Si basa sulla popolare libreria dataclass e offre una serie di funzionalità e vantaggi aggiuntivi, come:

Annotazioni di tipo (type annotations)

Pydantic utilizza le annotazioni di tipo per definire i campi e i tipi del modello di dati.

Questo non solo ci aiuta a documentare e comprendere il nostro modello, ma consente anche a Pydantic di convalidare automaticamente i dati e generare errori utili in caso di problemi.

Vincoli e valori predefiniti

Pydantic ci consente di definire vincoli e valori predefiniti per ogni campo del modello. Questo può aiutarci a garantire che i dati siano sempre validi e completi e può farci risparmiare molto tempo e fatica nella convalida e nella gestione degli errori.

Serializzazione e deserializzazione

Pydantic fornisce supporto integrato per la serializzazione e la deserializzazione dei modelli di dati in e da diversi formati, come JSON, YAML e XML. Questo può rendere molto più facile lavorare con i tuoi dati in contesti e ambienti diversi.

Come utilizzare Pydantic

Prima di tutto, installiamo Pydantic nel nostro ambiente virtuale con

pip install pydantic

Da qui è tutto abbastanza semplice e diretto. Ecco un esempio di come è possibile definire un modello di dati con Pydantic:

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    age: int
    email: str
    password: str

Questo semplice modello definisce una classe User con quattro campi: id, nome, età ed e-mail. I tipi di campo vengono specificati utilizzando le annotazioni di tipo e Pydantic convaliderà automaticamente i dati per garantire che siano sempre del tipo corretto.

È quindi possibile creare istanze di questo modello passando i dati come argomenti:

user = User(id=1, name='Alice', age=30, email='alice@example.com', password='secret')

Pydantic convaliderà i dati e genererà un errore in caso di problemi, come campi mancanti o non validi.

Possiamo anche definire vincoli e valori predefiniti per i tuoi campi utilizzando i vincoli e gli argomenti predefiniti:

In questo caso, i campi età e password sono facoltativi e non hanno un valore predefinito, mentre il campo created_at è facoltativo e ha un valore predefinito None.

Infine, possiamo serializzare e deserializzare i  modelli di dati utilizzando il metodo .dict():

data = user.dict()  # Serializza usando un dizionario
print(data)
# {'id': 1, 'name': 'Alice', 'age': 30, 'email': 'alice@example.com

Puoi anche serializzare e deserializzare da e verso altri formati, come JSON, YAML e XML, utilizzando rispettivamente i metodi .json(), .yaml() e .xml().

Pydantic nel machine learning e data science

Pydantic ha anche alcuni casi d'uso interessanti nell'apprendimento automatico e può aiutarci a costruire sistemi più robusti e affidabili.

Ecco alcuni casi d'uso.

Caso 1: convalida dei dati di input

Un caso d'uso comune di Pydantic nel machine learning è la convalida dei dati di input prima che vengano inseriti nel modello.

Ciò è particolarmente importante quando i dati provengono da una fonte esterna, come un utente o un'API di terze parti. Convalidando i dati, possiamo garantire che soddisfi le aspettative del nostro modello e che sia privo di errori o incoerenze.

Per illustrare ciò, consideriamo un semplice esempio di un modello di machine learning che prende come input un elenco di numeri interi e ne restituisce la somma. Possiamo usare Pydantic per definire uno schema di convalida (parlo di schemi in ML in questo articolo) per i dati di input come segue:

class InputData(BaseModel):
    numbers: List[int]

Questo schema specifica che i dati di input devono essere un elenco di numeri interi.

Ora, ogni volta che riceviamo un nuovo set di dati di input, possiamo convalidarlo rispetto a questo schema utilizzando il modello InputData:

Se i dati di input sono validi, validated_data conterrà gli stessi dati di input_data. Se non è valido, ad esempio se contiene una stringa anziché un numero intero, Pydantic solleverà un errore.

Questo ci consente di rilevare eventuali problemi con i dati di input prima che possano causare problemi nel nostro modello.

Caso 2: definizione delle configurazioni del modello

Un altro caso d'uso di Pydantic nell'apprendimento automatico è la definizione delle configurazioni del modello.

Spesso i modelli di machine learning hanno una serie di iperparametri che possono essere regolati per migliorarne le prestazioni. Questi iperparametri possono essere specificati come un oggetto di configurazione, che può essere convalidato utilizzando Pydantic.

Ad esempio, consideriamo un modello di machine learning come RandomForestClassifier che ha un iperparametro chiamato n_estimators. Possiamo definire un modello Pydantic per la configurazione in questo modo:

class RFConfig(BaseModel):
    n_estimators: int = 10 # default 10 estimators

Questo schema specifica che l'iperparametro n_estimators deve essere un numero intero con un valore predefinito di 10.

Ora, ogni volta che vogliamo creare una nuova istanza del modello con una configurazione diversa, possiamo farlo creando un oggetto RFConfig e passandogli i valori desiderati:

config = RFConfig(n_estimators=20)
model = ensemble.RandomForestClassifier(**config.dict())
model.get_params()

>> {'bootstrap': True,
 'ccp_alpha': 0.0,
 'class_weight': None,
 'criterion': 'gini',
 'max_depth': None,
 'max_features': 'sqrt',
 'max_leaf_nodes': None,
 'max_samples': None,
 'min_impurity_decrease': 0.0,
 'min_samples_leaf': 1,
 'min_samples_split': 2,
 'min_weight_fraction_leaf': 0.0,
 'n_estimators': 20, # il nostro iperparametro
 'n_jobs': None,
 'oob_score': False,
 'random_state': None,
 'verbose': 0,
 'warm_start': False}

L'utilizzo di Pydantic per definire e convalidare la configurazione del modello presenta quindi diversi vantaggi.

Assicura che gli iperparametri siano sempre impostati su valori validi, il che può aiutare a prevenire problemi che potrebbero derivare da configurazioni non valide.

Inoltre, semplifica la specifica dei valori predefiniti per gli iperparametri, che possono essere utili se si desidera utilizzare la stessa configurazione per più modelli.

Nel complesso, l'utilizzo di Pydantic per gestire le configurazioni dei modelli è un modo conveniente e affidabile per garantire che i nostri modelli di machine learning siano configurati correttamente e possano funzionare al massimo delle loro potenzialità.

Conclusione

In conclusione, Pydantic è uno strumento potente e versatile per la modellazione dei dati in Python.

La sua semplicità, efficienza, flessibilità e compatibilità lo rendono una scelta eccellente per qualsiasi progetto basato sui dati, in particolare i progetti di machine learning, e la sua comunità attiva e il supporto rendono facile trovare aiuto e risorse ogni volta che ne hai bisogno.

Se stai cercando di migliorare la qualità e l'affidabilità dei tuoi modelli di dati, vale sicuramente la pena considerare Pydantic.