russoalessio.dev

Python Serialization con Joblib. Cos'è e Come Usarlo in Modo Efficace

La serializzazione (o serialization) è un processo fondamentale in Python che consiste nella trasformazione di oggetti in un formato che può essere facilmente salvato, trasportato o recuperato in un secondo momento. Una delle librerie più potenti e semplici da usare per la serializzazione, soprattutto quando si lavora con oggetti di grandi dimensioni, è Joblib.

In questo post vedremo:


Cos’è Joblib?

Joblib è una libreria Python progettata per facilitare il salvataggio e il caricamento di oggetti Python, specialmente quelli pesanti (come modelli di machine learning, dataset, array NumPy e pipeline complesse). È particolarmente efficace per:

Joblib utilizza internamente il protocollo Pickle ma aggiunge numerose ottimizzazioni, come la compressione automatica e una maggiore efficienza.


Installare Joblib

Joblib può essere installato facilmente tramite pip:

pip install joblib

Serializzare e Deserializzare oggetti con Joblib

Ecco una sintassi semplice per la serializzazione e deserializzazione con Joblib:

Salvataggio di un oggetto (serializzazione):

import joblib

# Oggetto Python da serializzare (esempio un modello addestrato)
modello = {"nome": "modello_esempio", "versione": 1.0}

# Serializzazione e salvataggio
joblib.dump(modello, 'modello.joblib')

Caricamento di un oggetto (deserializzazione):

import joblib

# Caricamento dell'oggetto serializzato
modello_caricato = joblib.load('modello.joblib')

print(modello_caricato)
# Output: {'nome': 'modello_esempio', 'versione': 1.0}

Serializzare modelli Machine Learning con Joblib (esempio pratico)

Joblib è spesso usato con librerie come scikit-learn per salvare modelli addestrati. Ecco un esempio completo:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import joblib

# Caricamento dataset e training modello
iris = load_iris()
X, y = iris.data, iris.target

clf = RandomForestClassifier()
clf.fit(X, y)

# Salvataggio modello
joblib.dump(clf, 'random_forest_iris.joblib')

# Caricamento modello
clf_caricato = joblib.load('random_forest_iris.joblib')

# Test del modello caricato
predizioni = clf_caricato.predict(X[:5])
print(predizioni)

Comprimere oggetti con Joblib

Joblib permette anche di comprimere automaticamente gli oggetti serializzati:

# Compressione gzip
joblib.dump(clf, 'random_forest_iris_compressed.joblib', compress='gzip')

# Compressione rapida con protocollo lz4 (richiede lz4 installato)
# pip install lz4
joblib.dump(clf, 'random_forest_iris_lz4.joblib', compress='lz4')

La compressione è utile per ridurre lo spazio occupato su disco, soprattutto per dataset molto grandi o modelli complessi.


Joblib vs Pickle: Quale scegliere?

Joblib si basa sul protocollo Pickle, ma introduce alcuni miglioramenti significativi:

Caratteristica Pickle standard Joblib
Velocità serializzazione ✅ Rapido per piccoli oggetti ✅ Molto più efficiente per grandi oggetti
Compressione automatica ❌ No ✅ Sì
Supporto multi-core/parallelizzazione ❌ No ✅ Sì
Cache dei risultati intermedi ❌ No ✅ Sì

Joblib è quindi raccomandato quando lavori con dataset o modelli voluminosi.


Gestire Eccezioni e Errori con Joblib

Quando deserializzi oggetti, è buona norma gestire eccezioni:

import joblib

try:
    modello = joblib.load('file_non_esistente.joblib')
except FileNotFoundError:
    print("Il file non è stato trovato!")
except Exception as e:
    print(f"Errore durante il caricamento: {e}")

Best Practices e Suggerimenti

Ecco alcune raccomandazioni utili per l’uso di Joblib:


Conclusione

Joblib rappresenta una soluzione potente, facile e affidabile per serializzare oggetti Python complessi, specialmente nel contesto del machine learning e della gestione dei dati scientifici. Con Joblib puoi aumentare la produttività, ridurre tempi e spazio di archiviazione e rendere più organizzato e performante il tuo codice.

Per approfondire ulteriormente, consulta: