Sklearn: Modell speichern und laden
Beim maschinellen Lernen ist der Trainingsprozess eines Modells normalerweise zeitaufwändig. Um zu vermeiden, das Modell jedes Mal neu trainieren zu müssen, können wir das trainierte Modell speichern, um es später zu laden und Vorhersagen zu treffen.
scikit-learnEs gibt zwei übliche Möglichkeiten, Modelle zu speichern und zu laden:joblibundpickle。
1. VerwendungjoblibModelle speichern und laden
joblibist ein effizientes Python-Serialisierungswerkzeug, besonders geeignet zum Speichern von Objekten, die große Mengen numerischer Arrays enthalten (wie numpy-Arrays, scikit-learn-Modelle usw.). Im Vergleich zupickle,joblibist es bei der Verarbeitung großer Datenmengen effizienter.
joblib ist eine externe Python-Bibliothek, die mit dem folgenden Befehl installiert werden kann:
pip install joblib
Modell speichern
joblib bietet eine einfache API zum Speichern und Laden von Objekten.
Wir können die Methode joblib.dump() verwenden, um das Modell in einer Datei zu speichern.
Beispiel
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# Daten laden
data = load_iris()
X, y = data.data, data.target
# Trainings- und Testsatz aufteilen
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Modell erstellen und trainieren
model = SVC(kernel='linear')
model.fit(X_train, y_train)
# Modell in Datei speichern
joblib.dump(model, 'svm_model.joblib')
Modell laden
Verwenden Sie die Methode joblib.load(), um das gespeicherte Modellobjekt zu laden.
Beispiel
loaded_model = joblib.load('svm_model.joblib')
# Das geladene Modell für die Vorhersage verwenden
y_pred = loaded_model.predict(X_test)
# Die Vorhersageergebnisse ausgeben
print("Vorhersagen:", y_pred)
Mit den obigen Schritten haben wir das trainierte Modell erfolgreich in einer Datei gespeichert und können das Modell zu jedem späteren Zeitpunkt laden und Vorhersagen treffen.
2. Verwenden von pickle zum Speichern und Laden von Modellen
pickle ist ein integriertes Python-Modul, das es ermöglicht, Python-Objekte zu serialisieren und zu deserialisieren.
Obwohl joblib besser für die Verarbeitung großer Datenmengen geeignet ist, ist pickle ebenfalls ein gängiges Werkzeug zum Speichern und Laden von Modellen und eignet sich für allgemeine Fälle.
Modell speichern
Ähnlich wie joblib bietet pickle ebenfalls eine einfache API zum Speichern und Laden von Objekten.
Der Code zum Speichern des Modells lautet wie folgt:
Beispiel
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# Daten laden
data = load_iris()
X, y = data.data, data.target
# Trainings- und Testsatz aufteilen
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Modell erstellen und trainieren
model = SVC(kernel='linear')
model.fit(X_train, y_train)
# Modell mit pickle speichern
with open('svm_model.pkl', 'wb') as f:
pickle.dump(model, f)
Modell laden
Verwenden Sie pickle.load(), um das Modell zu laden:
Beispiel
with open('svm_model.pkl', 'rb') as f:
loaded_model = pickle.load(f)
# Das geladene Modell für die Vorhersage verwenden
y_pred = loaded_model.predict(X_test)
# Die Vorhersageergebnisse ausgeben
print("Vorhersagen:", y_pred)
3. joblib vs pickle
joblib und pickle sind zwei gängige Methoden zum Speichern und Laden von Modellen.
joblib ist besser zum Speichern großer Datenobjekte geeignet, während pickle Pythons Standard-Serialisierungswerkzeug ist und sich für allgemeine Fälle eignet.
joblib: Normalerweise geeignet zum Speichern von Objekten, die große Mengen numerischer Daten enthalten (wie NumPy-Arrays).joblibBei der Verarbeitung umfangreicher Daten ist es effizienter alspickleeffizienter.pickle: Geeignet zum Speichern kleinerer Objekte oder regulärer Python-Objekte. Es ist eine in Python integrierte Bibliothek und erfordert keine zusätzliche Installation.
Wenn das Modell eine große Anzahl numerischer Arrays oder Matrizen enthält (wie Support-Vektor-Maschinen, Random Forests usw.), wird joblib empfohlen, da es effizienter als pickle ist. Für kleinere Modelle oder Modelle, die keine großen Mengen numerischer Daten enthalten, reicht pickle aus.
4. Pipeline speichern und laden
In praktischen Anwendungen ist ein Modell nicht nur ein einzelnes Modell; manchmal kombiniert es mehrere Verarbeitungsschritte (wie Datenvorverarbeitung, Merkmalsauswahl, Modelltraining usw.). Diese Verarbeitungsschritte können mit der Pipeline von scikit-learn durchgeführt werden. Die Pipeline kann auch mit joblib oder pickle gespeichert und geladen werden.
Pipeline speichern:
Beispiel
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
import joblib
# Eine Pipeline erstellen
pipeline = Pipeline([
('scaler', StandardScaler()),
('svc', SVC(kernel='linear'))
])
# Trainiere die Pipeline
pipeline.fit(X_train, y_train)
# Die Pipeline in eine Datei speichern
joblib.dump(pipeline, 'pipeline_model.joblib')
Pipeline laden:
Beispiel
loaded_pipeline = joblib.load('pipeline_model.joblib')
# Die geladene Pipeline zur Vorhersage verwenden
y_pred = loaded_pipeline.predict(X_test)
# Die Vorhersageergebnisse ausgeben
print("Vorhersagen:", y_pred)
Der Prozess des Speicherns und Ladens einer Pipeline ist derselbe wie bei einem einzelnen Modell; Sie müssen lediglich sicherstellen, dass das gesamte Pipeline-Objekt gespeichert und geladen wird.
5. Modellversionsverwaltung
In realen Anwendungen des maschinellen Lernens sind Modellaktualisierungen und Versionsverwaltung entscheidend. Jedes Mal, wenn Sie ein Modell trainieren und speichern, ist es am besten, dem Dateinamen des Modells einen Zeitstempel oder eine Versionsnummer hinzuzufügen, um zwischen verschiedenen Versionen des Modells zu unterscheiden. Zum Beispiel:
Beispiel
# Einen Zeitstempel erstellen
timestamp = time.strftime("%Y%m%d-%H%M%S")
# Das Modell mit einem Zeitstempel speichern
joblib.dump(model, f'svm_model_{timestamp}.joblib')
Auf diese Weise können wir verschiedene Versionen von Modellen anhand von Zeitstempeln verwalten, was das Zurückrollen und Aktualisieren von Modellen erleichtert.
6. Verwenden des Modells zur Persistenz
Sobald das Modell trainiert und gespeichert ist, können wir es in späteren praktischen Anwendungen laden, um Vorhersagen ohne erneutes Training zu treffen.
Zum Beispiel können wir das gespeicherte Modell in Webdienste, Batch-Jobs oder andere Anwendungen integrieren, sodass das Modell ohne erneutes Training wiederverwendet werden kann.
Verwenden geladener Modelle in Webdiensten
Zum Beispiel, nehmen wir an, wir verwenden Flask, um einen einfachen Webdienst zu erstellen, der Modellvorhersagedienste über eine API bereitstellt. In diesem Fall können wir das gespeicherte Modell für Echtzeitvorhersagen laden.
Beispiel
import joblib
import numpy as np
app = Flask(__name__)
# Modell laden
model = joblib.load('svm_model.joblib')
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json() # Eingabedaten abrufen
features = np.array(data['features']).reshape(1, -1) # In ein für die Vorhersage geeignetes Format umwandeln
prediction = model.predict(features) # Das geladene Modell zur Vorhersage verwenden
return jsonify({'prediction': prediction.tolist()}) # Das Vorhersageergebnis zurückgeben
if __name__ == '__main__':
app.run(debug=True)