Snowpark ML Modeling: Entwicklung von ML-Modellen¶
Snowpark ML Modeling ist eine Sammlung von Python-APIs für die Vorverarbeitung von Daten und das Trainieren von Modellen. Wenn Sie diese Aufgaben in Snowflake mithilfe von Snowpark ML Modeling ausführen, haben Sie folgende Möglichkeiten:
Transformieren Ihrer Daten und trainieren Ihrer Modelle, ohne Daten aus Snowflake an andere Systeme übergeben zu müssen
Verwenden von APIs, die denen ähneln, die Sie bereits kennen, z. B. scikit-learn.
Ausführen Ihrer ML-Pipeline innerhalb des Sicherheits- und Governance-Frameworks von Snowflake
Profitieren von der Leistungsfähigkeit und Skalierbarkeit der Data Warehouses von Snowflake
Das unter diesem Thema beschriebene Snowpark ML Modeling-Paket bietet Schätz- und Transformationsfunktionen, die mit denen der Bibliotheken scikit-learn, xgboost und lightgbm kompatibel sind. Sie können diese APIs verwenden, um Machine Learning-Modelle in Snowflake zu erstellen und zu trainieren.
Eine kurze Einführung in Snowpark ML Modeling finden Sie in unserem Quickstart.
Bemerkung
Bei diesem Thema wird vorausgesetzt, dass Sie das Snowpark ML-Modul bereits installiert haben. Wenn dies nicht der Fall ist, finden Sie weitere Informationen unter Installieren von Snowpark ML.
Snowpark ML Modeling-Klassen¶
Alle Modellierungs- und Vorverarbeitungsklassen von Snowpark ML Modeling befinden sich im Namespace snowflake.ml.modeling
. Die Module von Snowpark ML haben dieselben Namen wie die entsprechenden Module im sklearn
-Namespace. Beispielsweise ist das Snowpark ML-Modul, das sklearn.calibration
entspricht, snowflake.ml.modeling.calibration
.
Die Module xgboost
und lightgbm
entsprechen den Modulen snowflake.ml.modeling.xgboost
bzw. snowflake.ml.modeling.lightgbm
.
Nicht alle Klassen von scikit-learn werden in Snowpark ML unterstützt. Die folgende Tabelle zeigt, welche Klassen unterstützt werden. Klassen, die mit einem Sternchen Klassen (*) gekennzeichnet sind, unterstützen die verteilte Ausführung.
Tipp
Alle Informationen zur Modellierungs-API finden Sie in der API-Referenz für Snowpark ML.
Snowpark ML-Modulname |
Klassen |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Allgemeine Unterschiede der API¶
Tipp
Alle Informationen zur Modellierungs-API finden Sie in der API-Referenz für Snowpark ML.
Snowpark ML Modeling umfasst Algorithmen zur Datenvorverarbeitung, Transformation und Vorhersage, die auf scikit-learn, xgboost und lightgbm basieren. Die Snowpark Python-Klassen sind Ersatz für die entsprechenden Klassen aus den Originalpaketen mit ähnlichen Signaturen. Diese APIs sind jedoch für Snowpark-DataFrames und nicht für NumPy-Arrays konzipiert.
Obwohl die Snowpark ML Modeling-API ähnlich wie scikit-learn ist, gibt es einige wichtige Unterschiede. In diesem Abschnitt wird erklärt, wie Sie die Methoden __init__
(Konstruktor), fit
und predict
für die in Snowpark ML bereitgestellten Schätzer- und Transformer-Klassen aufrufen.
Der Konstruktor aller Snowpark ML Python-Klassen akzeptiert zusätzliche zu den Parametern, die von den entsprechenden Klassen in scikit-learn, xgboost oder lightgbm akzeptiert werden, fünf weitere Parameter:
input_cols
,output_cols
,sample_weight_col
,label_cols
unddrop_input_cols
. Dabei handelt es sich um Zeichenfolgen oder Sequenzen von Zeichenfolgen, die die Namen der Eingabespalten, der Ausgabespalten, der Spalte für die Gewichtung des Samples und der Beschriftungsspalten in einem Snowpark- oder Pandas-DataFrame angeben.Die Methoden
fit
undpredict
in Snowpark ML akzeptieren einen einzigen DataFrame anstelle von separaten Arrays, die die Eingabedaten, Beschriftungen und Gewichtungen repräsentieren. Mit Snowpark ML geben Sie bei der Instanziierung der Klasse die Namen der Spalten an, die für diese Zwecke verwendet werden sollen. Diese Namen werden dann verwendet, um die benötigten Spalten im DataFrame zu finden, die Sie anfit
oderpredict
übergeben. Weitere Informationen dazu finden Sie unter fit und predict.Die Methoden
transform
undpredict
in Snowpark ML geben eine DataFrame zurück, das alle Spalten aus dem an die Methode übergebenen DataFrame enthält, wobei die Ausgabe der Vorhersage in zusätzlichen Spalten gespeichert wird. (Sie können die Umwandlung an Ort und Stelle vornehmen, indem Sie dieselben Namen der Eingabe- und Ausgabespalten angeben, oder Sie lassen die Eingabespalten weg, indem Siedrop_input_cols = True
übergeben.) Die Äquivalenten zu scikit-learn, xgboost und lightgbm geben Arrays zurück, die nur die Ergebnisse enthalten.Snowpark Python-Transformer verfügen nicht über eine
fit_transform
-Methode. Wie bei scikit-learn wird die Parametervalidierung jedoch nur in der Methodefit
ausgeführt, sodass Siefit
irgendwann vortransform
aufrufen müssen, auch wenn der Transformer keine Anpassung vornimmt.fit
gibt den Transformer zurück, sodass die Methodenaufrufe verkettet werden können, z. B.Binarizer(threshold=0.5).fit(df).transform(df)
.Snowpark ML-Transformer verfügen nicht über eine
inverse_transform
-Methode. Diese Methode ist bei Snowpark ML nicht notwendig, da die ursprüngliche Darstellung in den Eingabespalten des Eingabe-DataFrame erhalten bleibt, es sei denn, Sie führen explizit eine In-Place-Transformation aus, indem Sie die gleichen Namen für die Eingabe- und die Ausgabespalten angeben.
Erstellen eines Modells¶
Zusätzlich zu den Parametern, die von den einzelnen scikit-learn-Modellklassen akzeptiert werden, akzeptieren alle Snowpark ML Modeling-Klassen bei der Instanziierung fünf zusätzliche Parameter, die in der folgenden Tabelle aufgeführt sind.
Diese Parameter sind technisch gesehen alle optional, aber Sie werden oft entweder input_cols
oder output_cols
oder beides angeben wollen. label_cols
und sample_weight_col
sind in bestimmten, in der Tabelle aufgeführten Situationen erforderlich, können aber in anderen Fällen weggelassen werden.
Parameter |
Beschreibung |
---|---|
|
Eine Zeichenfolge oder eine Liste von Zeichenfolgen, die Spaltennamen darstellen, die Features enthalten. Wenn Sie diesen Parameter weglassen, werden alle Spalten im Eingabe-DataFrame mit Ausnahme der durch die Parameter |
|
Eine Zeichenfolge oder eine Liste von Zeichenfolgen, die Spaltennamen darstellen, die Beschriftungen enthalten. Für Schätzer müssen Sie Beschriftungsspalten angeben, da ein Ableiten dieser Spalten nicht möglich ist. Wenn Sie diesen Parameter weglassen, gilt das Modell als Transformer und wird ohne Beschriftung angepasst. |
|
Eine Zeichenfolge oder eine Liste von Zeichenfolgen, die Spaltennamen darstellen, in denen die Ausgabe von Wenn Sie diesen Parameter weglassen, werden die Namen der Ausgabespalten durch Hinzufügen eines Um die Umwandlung an Ort und Stelle vorzunehmen, übergeben Sie für |
|
Eine Zeichenfolge mit dem Namen der Spalte, die die Gewichtung der Beispiele enthält. Dieses Argument ist für gewichtete Datensets erforderlich. |
|
Ein boolescher Wert, der angibt, ob die Eingabespalten aus dem Ergebnis-DataFrameentfernt werden. Der Standardwert ist |
Beispiel¶
Der DecisionTreeClassifier
-Konstruktor hat in scikit-learn keine erforderlichen Argumente; alle Argumente haben Standardwerte. In scikit-learn könnten Sie also Folgendes schreiben:
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
In Snowpark ML müssen Sie die Spaltennamen angeben (oder die Standardwerte akzeptieren, indem Sie sie nicht angeben). Im diesem Beispiel werden sie explizit angegeben.
Sie können einen Snowpark ML-Klassifizierer DecisionTreeClassifier
initialisieren, indem Sie die Argumente direkt an den Konstruktor übergeben oder indem Sie sie nach der Instanziierung als Attribute des Modells festlegen. (Die Attribute können jederzeit geändert werden.)
Als Konstruktor-Argumente:
from snowflake.ml.modeling.tree import DecisionTreeClassifier model = DecisionTreeClassifier( input_cols=feature_column_names, label_cols=label_column_names, sample_weight_col=weight_column_name, output_cols=expected_output_column_names )
Durch Einstellen von Modellattributen:
from snowflake.ml.modeling.tree import DecisionTreeClassifier model = DecisionTreeClassifier() model.set_input_cols(feature_column_names) model.set_label_cols(label_column_names) model.set_sample_weight_col(weight_column_name) model.set_output_cols(output_column_names)
fit
¶
Der Methode fit
eines Snowpark ML-Klassifikators wird ein einzelner Snowpark- oder Pandas-DataFrame mit allen Spalten, einschließlich Features, Labels und Gewichtungen übergeben. Dies unterscheidet sich von der Methode fit
von scikit-learn, die separate Eingaben für Features, Labels und Gewichtungen benötigt.
In scikit-learn sieht der Aufruf der Methode DecisionTreeClassifier.fit
wie folgt aus:
model.fit(
X=df[feature_column_names], y=df[label_column_names], sample_weight=df[weight_column_name]
)
In Snowpark ML müssen Sie nur den DataFrame übergeben. Sie haben die Namen der Eingabe-, Beschriftungs- und Gewichtungsspalten bereits bei der Initialisierung oder mithilfe von Konstruktionsmethoden festgelegt, wie unter Erstellen eines Modells gezeigt.
model.fit(df)
predict
¶
Der Methode predict
einer Snowpark ML-Klasse wird ebenfalls ein einzelner Snowpark- oder Pandas-DataFrame mit allen Feature-Spalten übergeben. Das Ergebnis ist ein DataFrame, der alle Spalten des Eingabe-DataFrame unverändert enthält und an den die Ausgabespalten angehängt sind. Sie müssen die Ausgabespalten aus diesem DataFrame extrahieren. Dies unterscheidet sich von der Methode predict
in scikit-learn, die nur die Ergebnisse zurückgibt.
Beispiel¶
In scikit-learn liefert predict
nur die Vorhersageergebnisse:
prediction_results = model.predict(X=df[feature_column_names])
Um in Snowpark ML nur die Vorhersageergebnisse zu erhalten, extrahieren Sie die Ausgabespalten aus dem zurückgegebenen DataFrame. Hier ist output_column_names
eine Liste mit den Namen der Ausgabespalten:
prediction_results = model.predict(df)[output_column_names]
Bereitstellen und Ausführen Ihres Modells¶
Das Ergebnis des Trainings eines Modells ist ein Snowpark ML-Python-Modellobjekt. Sie können das trainierte Modell für Vorhersagen verwenden, indem Sie die Methode predict
des Modells aufrufen. Dadurch wird eine temporäre benutzerdefinierte Funktion zur Ausführung des Modells in Ihrem virtuellen Snowflake-Warehouse erstellt. Diese Funktion wird am Ende Ihrer Snowpark ML-Sitzung automatisch gelöscht (z. B. wenn Ihr Skript endet oder wenn Sie Ihr Jupyter-Notebook schließen).
Um die benutzerdefinierte Funktion nach dem Ende Ihrer Sitzung beizubehalten, können Sie sie auch manuell erstellen. Weitere Informationen dazu finden Sie im Quickstart zu diesem Thema.
Die Snowpark ML-Modellregistrierung, ein kommendes Feature, unterstützt ebenfalls persistente Modelle und erleichtert deren Suche und Bereitstellung. Für einen frühzeitigen Zugriff auf die Dokumentation zu diesem Feature wenden Sie sich an Ihren Snowflake-Vertreter.
Pipeline für mehrere Transformationen¶
Bei scikit-learn ist es üblich, eine Serie von Transformationen mithilfe einer Pipeline auszuführen. scikit-learn-Pipelines funktionieren nicht mit den Snowpark ML-Klassen, daher bietet Snowpark ML eine Snowpark Python-Version von sklearn.pipeline.Pipeline
für die Ausführung einer Serie von Transformationen. Diese Klasse befindet sich im Paket snowflake.ml.modeling.pipeline
und funktioniert genauso wie die Version von scikit-learn.
Bekannte Einschränkungen¶
Die Schätzer und Transformer von Snowpark ML unterstützen derzeit weder spärliche Eingaben noch spärliche Antworten. Wenn Sie spärliche Daten haben, konvertieren Sie diese in ein dichtes Format, bevor Sie sie an die Schätzer oder Transformer von Snowpark ML übergeben.
Das Snowpark ML-Paket unterstützt derzeit noch keine Matrix-Datentypen. Jede Operation auf Schätzern und Transformern, die eine Matrix als Ergebnis liefern würde, schlägt fehl.
Es ist nicht garantiert, dass die Reihenfolge der Zeilen in den Ergebnisdaten mit der Reihenfolge der Zeilen in den Eingabedaten übereinstimmt.
Problembehandlung¶
Hinzufügen weiterer Details für die Protokollierung¶
Snowpark ML verwendet die Protokollierung von Snowpark Python. Standardmäßig protokolliert Snowpark ML Meldungen der INFO-Ebene in der Standardausgabe. Um detailliertere Protokolle zu erhalten, die Ihnen bei der Problembehandlung mit Snowpark ML helfen, können Sie den Protokolliergrad auf eine der unterstützten Stufen ändern.
DEBUG erzeugt Protokolle mit den meisten Details. So setzen Sie den Protokolliergrad auf DEBUG:
import logging, sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
Lösungen für häufige Probleme¶
Die folgende Tabelle enthält einige Vorschläge zur Lösung möglicher Probleme mit Snowflake ML Modeling.
Problem oder Fehlermeldung |
Mögliche Ursache |
Lösung |
---|---|---|
NameError, wie „Name x ist nicht definiert“, ImportError oder ModuleNotFoundError |
Typografischer Fehler im Modul- oder Klassennamen, oder Snowpark ML ist nicht installiert |
Den korrekten Namen des Moduls und der Klasse finden Sie in der Tabelle der Snowpark ML Modeling-Klassen. Stellen Sie sicher, dass das Snowpark ML-Modul installiert ist (siehe Installieren von Snowpark ML). |
KeyError („not in index“ oder „none of [Index[..]] are in the [Spalten]“) |
Inkorrekter Spaltenname |
Überprüfen und korrigieren Sie den Spaltennamen. |
SnowparkSQLException, „does not exist or not authorize“ |
Die Tabelle existiert nicht, oder Sie haben nicht die erforderlichen Berechtigungen für diese Tabelle. |
Stellen Sie sicher, dass die Tabelle existiert und die Rolle des Benutzers die erforderlichen Berechtigungen hat. |
SnowparkSQLException, „invalid identifier PETALLENGTH“ |
Inkorrekte Anzahl von Spalten (normalerweise eine fehlende Spalte). |
Überprüfen Sie die Anzahl der Spalten, die Sie beim Erstellen der Modellklasse angegeben haben, und stellen Sie sicher, dass Sie die korrekte Anzahl übergeben. |
InvalidParameterError |
Es wurde ein ungeeigneter Typ oder Wert als Parameter übergeben. |
Überprüfen Sie in einer interaktiven Python-Sitzung mit der Funktion |
TypeError, „unexpected keyword argument“ |
Typographischer Fehler im benannten Argument |
Überprüfen Sie in einer interaktiven Python-Sitzung mit der Funktion |
ValueError, „array with 0 sample(s)“ |
Das Datenset, das Sie übergeben haben, ist leer. |
Stellen Sie sicher, dass das Datenset nicht leer ist. |
SnowparkSQLException, „authentication token has expired“ |
Die Sitzung ist abgelaufen. |
Wenn Sie ein Jupyter-Notebook verwenden, starten Sie den Kernel neu, um eine neue Sitzung zu erstellen. |
ValueError wie „cannot convert string to float“ |
Datentypen stimmen nicht überein. |
Überprüfen Sie in einer interaktiven Python-Sitzung mit der Funktion |
SnowparkSQLException, „cannot create temporary table“ |
Eine Modellklasse wird innerhalb einer gespeicherten Prozedur verwendet, die nicht mit Aufruferrechten ausgeführt wird. |
Erstellen Sie die gespeicherte Prozedur mit Aufruferrechten statt mit Eigentümerrechten. |
SnowparkSQLException, „function available memory exceeded“ |
Ihr Datenset ist größer als 5 GB in einem Standard-Warehouse. |
Wechseln Sie zu einem Snowpark-optimierten Warehouse. |
OSError, „no space left on device“ |
Ihr Modell ist größer als etwa 500 MB in einem Standard-Warehouse. |
Wechseln Sie zu einem Snowpark-optimierten Warehouse. |
Inkompatible xgboost-Version oder Fehler beim Importieren von xgboost |
Sie haben für die Installation |
Führen Sie ein Upgrade oder Downgrade des Pakets durch, wie in der Fehlermeldung gefordert. |
AttributeError mit |
Sie versuchen, eine dieser Methoden auf ein Modell eines anderen Typs anzuwenden. |
Verwenden Sie |
Weiterführende Informationen¶
In der Dokumentation der Originalbibliotheken finden Sie vollständige Informationen zu deren Funktionalität.
Quellenangabe¶
Einige Teile dieses Dokuments stammen aus der Scikit-learn-Dokumentation, die unter der BSD-3 „New“- oder „Revised“-Lizenz und Copyright © 2007-2023 The scikit-learn developers lizenziert ist. Alle Rechte vorbehalten.
Einige Teile dieses Dokuments stammen aus der XGboost-Dokumentation, die unter die Apache License 2.0, Januar 2004 und Copyright © 2019 fällt. Alle Rechte vorbehalten.
Einige Teile dieses Dokuments stammen aus der LightGBM-Dokumentation, die MIT-lizenziert ist und unter Copyright © Microsoft Corp. fällt. Alle Rechte vorbehalten.