TODO für Tag 22
- joblib zum Speichern und Laden von Modellen verwenden
joblib zum Speichern und Laden von Modellen verwenden
Joblib ist eine Python-Bibliothek, die eine Reihe von Werkzeugen bereitstellt, um häufige Aufgaben in der wissenschaftlichen Datenverarbeitung und im maschinellen Lernen zu vereinfachen und zu beschleunigen. Eine der bekanntesten Funktionen ist die Serialisierung und Deserialisierung von Python-Objekten, insbesondere solcher, die große NumPy-Arrays enthalten, wie es bei trainierten scikit-learn-Modellen der Fall ist. Dies bedeutet, dass joblib beliebige Python-Objekte in Dateien auf der Festplatte speichern kann, sodass sie später wieder geladen und verwendet werden können, ohne dass ein erneutes Training oder eine Neuberechnung erforderlich ist.
Die Installation von joblib ist unkompliziert und erfolgt üblicherweise über den Python-Paketmanager pip mit dem Befehl pip install joblib. In den meisten fällen ist das aber nicht nötig, da joblib als Abhängigkeit von scikit-learn und anderen Bibliotheken automatisch mit installiert wird.
Der Hauptnutzen von joblib im Kontext von maschinellem Lernen liegt in der Fähigkeit, den Zustand eines Modells nach dem Training festzuhalten. Dies ist enorm wertvoll, da das Training zeit- und rechenintensiv sein kann. Einmal trainiert und gespeichert, kann ein Modell schnell geladen und für Vorhersagen auf neuen Daten eingesetzt oder mit anderen geteilt werden, was die Reproduzierbarkeit und den Einsatz von Modellen in Produktionsumgebungen erleichtert. Im Vergleich zum Standard-Python-Modul pickle ist joblib speziell für die Handhabung von Objekten mit großen Datenmengen, wie sie in NumPy-Arrays vorkommen, optimiert. Dies führt oft zu kleineren Dateigrößen und schnelleren Lade- und Speicherzeiten.
Das folgende Python-Beispiel demonstriert einen einfachen Zyklus des maschinellen Lernens mit Fokus auf: Speichern und Laden eines trainierten Modells.
Nach den Importen lädt das Skript den Iris-Datensatz den ich schon diverse Male während meine „30 Tage scikit-learn“ Challenge geladen habe. Diese Daten werden dann in Trainings- und Testsets aufgeteilt, wobei 30% der Daten für das Testen reserviert werden. Anschließend wird ein LogisticRegression-Modell erstellt.
Danach wird das trainierte Modell evaluiert. Die Genauigkeit der Vorhersagen wird berechnet und ausgegeben. Nun wird das trainierte Modell wird mit der Funktion joblib.dump in einer Datei namens „mein_einfacher_klassifikator.joblib“ auf der Festplatte gespeichert. Danach wird das gespeicherte Modell mit joblib.load wieder geladen.
Um zu verifizieren, dass das geladene Modell identisch mit dem Originalmodell funktioniert, wird es verwendet, um erneut Vorhersagen auf denselben Testdaten zu machen. Die Genauigkeit dieser Vorhersagen wird berechnet und ausgegeben. Schließlich werden die Vorhersagen des ursprünglichen Modells direkt mit den Vorhersagen des geladenen Modells verglichen. Eine Meldung bestätigt, ob die Vorhersagen identisch sind, was der erwartete Fall ist.
import joblib
import os
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# Daten laden
iris = load_iris()
X, y = iris.data, iris.target
# Daten in Trainings- und Testsets aufteilen
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
# LogisticRegression Modell erstellen und trainieren
model = LogisticRegression(solver='liblinear', random_state=42)
print("Modell wird trainiert...")
model.fit(X_train, y_train)
print("Training abgeschlossen.")
# Modell evaluieren (optional)
predictions_original = model.predict(X_test)
accuracy_original = accuracy_score(y_test, predictions_original)
print(f"Genauigkeit des ursprünglichen Modells auf Testdaten: {accuracy_original:.4f}")
# Speichern des Modells mit joblib
model_filename = "mein_einfacher_klassifikator.joblib"
joblib.dump(model, model_filename)
print(f"Modell wurde erfolgreich als '{model_filename}' gespeichert.")
# Laden des Modells mit joblib
# Überprüfen, ob die Datei existiert, bevor sie geladen wird
if os.path.exists(model_filename):
print(f"\nLade Modell von '{model_filename}'...")
loaded_model = joblib.load(model_filename)
print("Modell erfolgreich geladen.")
# Vorhersagen mit dem geladenen Modell machen
predictions_loaded = loaded_model.predict(X_test)
accuracy_loaded = accuracy_score(y_test, predictions_loaded)
print(f"Genauigkeit des geladenen Modells auf Testdaten: {accuracy_loaded:.4f}")
# Überprüfen, ob die Vorhersagen identisch sind
if (predictions_original == predictions_loaded).all():
print("Vorhersagen des ursprünglichen und des geladenen Modells sind identisch.")
else:
print("WARNUNG: Vorhersagen des ursprünglichen und des geladenen Modells unterscheiden sich!")
else:
print(f"Fehler: Modelldatei '{model_filename}' nicht gefunden.")
Code-Sprache: PHP (php)
Ausgabe:
Modell wird trainiert...
Training abgeschlossen.
Genauigkeit des ursprünglichen Modells auf Testdaten: 0.9111
Modell wurde erfolgreich als 'mein_einfacher_klassifikator.joblib' gespeichert.
Lade Modell von 'mein_einfacher_klassifikator.joblib'...
Modell erfolgreich geladen.
Genauigkeit des geladenen Modells auf Testdaten: 0.9111
Vorhersagen des ursprünglichen und des geladenen Modells sind identisch.
Die Ausgabe „Genauigkeit des geladenen Modells auf Testdaten: 0.9111“ zeigt, dass das geladene Modell exakt dieselbe Genauigkeit erzielt wie das ursprüngliche Modell vor dem Speichern. Das zeigt, dass der Speicher- und Ladevorgang die Eigenschaften des Modells nicht verändert hat.
Die abschließende Zeile „Vorhersagen des ursprünglichen und des geladenen Modells sind identisch.“ liefert die endgültige Bestätigung. Sie bedeutet, dass nicht nur die Gesamtgenauigkeit übereinstimmt, sondern auch jede einzelne Vorhersage des geladenen Modells für die Testdaten exakt mit den Vorhersagen des ursprünglichen Modells übereinstimmt. Dies demonstriert, dass das joblib-Modul das Modell fehlerfrei und vollständig konserviert und wiederhergestellt hat, sodass es exakt so weiterverwendet werden kann, als wäre es nie gespeichert worden.