Snowpark ML Modeling: ML モデル開発¶
Snowpark ML Modelingは、データの前処理とモデルをトレーニングするためのPython APIs のコレクションです。Snowpark ML Modelingを使用してSnowflake内でこれらのタスクを実行すると、以下を実行できます。
データをSnowflakeから移動することなく、データを変換し、モデルをトレーニングする。
scikit-learnなど、すでに使い慣れたものと同様の APIs と連動する。
Snowflakeのセキュリティとガバナンスのフレームワーク内で ML パイプラインの実行を継続する。
Snowflakeのデータウェアハウスのパフォーマンスとスケーラビリティからメリットを受ける。
このトピックで説明するSnowpark ML Modelingパッケージは、scikit-learn、xgboost、lightgbmライブラリと互換性のある推定器と変換器を提供します。これらの APIs を使用して、Snowflake内で機械学習モデルを構築し、トレーニングすることができます。
Snowpark ML Modelingの簡単な紹介は、 クイックスタート をご参照ください。
注釈
このトピックでは、Snowpark ML モジュールがすでにインストールされていることを前提としています。インストールされていない場合は、 Snowpark ML のインストール をご参照ください。
Snowpark ML Modelingクラス¶
すべてのSnowpark ML のモデリングクラスと前処理クラスは、 snowflake.ml.modeling
名前空間にあります。Snowpark MLのモジュールは、 sklearn
名前空間の対応するモジュールと同じ名前です。たとえば、 sklearn.calibration
に対応するSnowpark ML モジュールは、 snowflake.ml.modeling.calibration
です。
xgboost
と lightgbm
モジュールは、それぞれ snowflake.ml.modeling.xgboost
と snowflake.ml.modeling.lightgbm
に対応しています。
scikit-learnのすべてのクラスがSnowpark ML でサポートされているわけではありません。以下のテーブルは、どのクラスがサポートされているかを示しています。アスタリスク(*)の付いたクラスは分散実行をサポートします。
ちなみに
モデリング API の完全な詳細については、Snowpark ML API リファレンス をご参照ください。
Snowpark ML モジュール名 |
クラス |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一般的な API の違い¶
ちなみに
モデリング API の完全な詳細については、Snowpark ML API リファレンス をご参照ください。
Snowpark ML Modelingには、scikit-learn、xgboost、lightgbmに基づくデータ前処理、変換、予測アルゴリズムが含まれています。Snowpark Pythonクラスは、オリジナルパッケージからの対応するクラスを置き換えたもので、署名も類似しています。ただし、これらの APIs は、 NumPy 配列の代わりに、Snowpark DataFrames で動作するように設計されています。
Snowpark ML Modeling API はscikit-learnに似ていますが、いくつかの重要な違いがあります。このセクションでは、Snowpark ML で提供される推定器クラスと変換器クラスの __init__
(コンストラクター)、 fit
、および predict
メソッドを呼び出す方法について説明します。
すべてのSnowpark ML Pythonクラスの コンストラクター は、scikit-learn、xgboost、lightgbmの同等クラスが受け入れるパラメーターに加えて、
input_cols
、output_cols
、sample_weight_col
、label_cols
、およびdrop_input_cols
の5つの追加パラメーターを受け入れます。これらは文字列または文字列のシーケンスで、SnowparkまたはPandas DataFrameの入力列、出力列、サンプル重み列、ラベル列の名前を指定します。Snowpark ML の
fit
とpredict
メソッドは、入力データ、ラベル、重みを表す個別の配列の代わり、単一の DataFrame を受け入れます。Snowpark ML では、クラスをインスタンス化するときに、これらの目的で使用する列の名前を指定します。これらの名前は、fit
またはpredict
に渡す DataFrame で必要な列を見つけるために使用されます。 fit、および predict をご参照ください。Snowpark ML の
transform
とpredict
メソッドは、メソッドに渡された DataFrame のすべての列を含む DataFrame を返し、予測からの出力は追加の列に格納されます。(同じ入力列名と出力列名を指定して、インプレースで変換することも、drop_input_cols = True
を渡して、入力列をドロップすることもできます。)scikit-learn、xgboost、lightgbmと同等のものは、結果のみを含む配列を返します。Snowpark Pythonの変換器には
fit_transform
メソッドがありません。しかし、scikit-learnと同様に、パラメーターの検証はfit
メソッドでのみ実行されます。したがって、変換器がフィッティングを実行しない場合でも、transform
の前のある時点でfit
を呼び出す必要があります。fit
は変換器を返すため、メソッド呼び出しは、たとえばBinarizer(threshold=0.5).fit(df).transform(df)
のように連鎖させることができます。Snowpark ML 変換器には
inverse_transform
メソッドがありません。このメソッドは、Snowpark ML には不要です。これは、入力列と出力列の両方に同じ名前を指定してインプレース変換を明示的に実行する場合を除き、入力 DataFrame の入力列には元の表現が保持されるためです。
モデルの構築¶
個別のscikit-learnモデルクラスが受け入れるパラメーターに加えて、すべてのSnowpark ML Modelingクラスは、インスタンス化時に次のテーブルにリストされた5つの追加パラメーターを受け入れます。
これらのパラメーターは技術的にはすべてオプションですが、 input_cols
、または output_cols
、あるいはその両方を指定する場合が多くあります。 label_cols
と sample_weight_col
は、テーブルに示す特定の状況では必須ですが、それ以外の場合では省略できます。
パラメーター |
説明 |
---|---|
|
特徴量を含む列名を表す文字列または文字列のリスト。 このパラメーターを省略した場合は、 |
|
ラベルを含む列名を表す文字列または文字列のリスト。 推定器のラベル列は推論できないため、必ず指定する必要があります。このパラメーターを省略すると、モデルは変換器とみなされ、ラベルなしでフィッティングされます。 |
|
このパラメーターを省略した場合、出力列名はラベル列名に インプレースで変換するには、 |
|
例の重みを含む列名を表す文字列。 この引数は,重み付きデータセットに必要です. |
|
入力列を結果 DataFrame から削除するかどうかを示すブール値。デフォルトは |
例¶
scikit-learnには、 DecisionTreeClassifier
コンストラクターに必須の引数がありません。すべての引数はデフォルト値です。そのため、scikit-learnでは次のように記述する場合があります。
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
Snowpark ML では、列名を指定する必要があります(または、指定せずにデフォルトを受け入れます)。この例では、明示的に指定されています。
引数をコンストラクターに直接渡すか、インスタンス化後にモデルの属性として設定して、Snowpark ML DecisionTreeClassifier
を初期化することができます。(属性はいつでも変更可能です。)
コンストラクターの引数として、
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 )
モデルの属性を設定することで、
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
¶
Snowpark ML 分類器の fit
メソッドは、特徴量、ラベル、重みを含むすべての列を含む単一の SnowparkまたはPandas DataFrame を受け取ります。これはscikit-learnが特徴量、ラベル、および重みを個別の入力として受け取る fit
メソッドとは異なります。
scikit-learnでは、 DecisionTreeClassifier.fit
メソッド呼び出しは次のようになります。
model.fit(
X=df[feature_column_names], y=df[label_column_names], sample_weight=df[weight_column_name]
)
Snowpark ML では、 DataFrame を渡すだけです。 モデルの構築 に示すように、入力、ラベル、重みの列名は、初期化時、またはセッターメソッドを使用してすでに設定されています。
model.fit(df)
predict
¶
Snowpark ML クラスの predict
メソッドも、すべての特徴量列を含む単一のSnowparkまたはPandas DataFrame を受け取ります。結果は、入力 DataFrame のすべての列が変更されず、出力列が追加された DataFrame になります。この DataFrame から出力列を抽出する必要があります。これは、結果のみを返すscikit-learnの predict
メソッドとは異なります。
例¶
scikit-learnでは、 predict
は予測結果のみを返します。
prediction_results = model.predict(X=df[feature_column_names])
Snowpark ML の予測結果のみを取得するには、返された DataFrame から出力列を抽出します。ここで、 output_column_names
は、出力列の名前を含むリストです。
prediction_results = model.predict(df)[output_column_names]
モデルの展開と実行¶
モデルをトレーニングした結果は、Python Snowpark ML モデルオブジェクトになります。モデルの predict
メソッドを呼び出すと、トレーニング済みモデルを使用して予測できます。これにより、Snowflake仮想ウェアハウスでモデルを実行するための仮のユーザー定義関数が作成されます。この関数は、Snowpark ML セッションの終了時(例: スクリプトの終了時やJupyterノートブックを閉じるとき)に自動的に削除されます。
セッション終了後もユーザー定義関数を保持するには、手動で作成します。詳細については、このトピックの クイックスタート をご参照ください。
Snowpark ML モデルレジストリは、今後リリースされる機能で、永続的なモデルもサポートし、モデルの検索と展開を容易にします。この機能に関するドキュメントをいち早く入手するには、Snowflakeの担当者にお問い合わせください。
複数変換のためのパイプライン¶
scikit-learnでは、パイプラインを使用して一連の変換を実行するのが一般的です。scikit-learnパイプラインはSnowpark ML クラスでは動作しないため、Snowpark ML は、一連の変換を実行するために sklearn.pipeline.Pipeline
のSnowpark Pythonバージョンを提供しています。このクラスは snowflake.ml.modeling.pipeline
パッケージにあり、scikit-learnバージョンと同じように動作します。
既知の制限¶
Snowpark ML 推定器および変換器は現在、スパース入力およびスパース応答をサポートしていません。スパースデータがある場合は、Snowpark ML の推定器や変換器に渡す前に密な形式に変換します。
Snowpark ML パッケージは現在、マトリックスデータ型をサポートしていません。結果としてマトリックスを生成するような推定器や変換器に対する操作はすべて失敗します。
結果データの行の順番が入力データの行の順番と一致することは保証されません。
トラブルシューティング¶
ログへの詳細の追加¶
Snowpark ML は、Snowpark Pythonのログを使用します。デフォルトでは、Snowpark ML は INFO レベルのメッセージを標準出力にログします。より詳細なログを取得し、Snowpark ML で発生した問題のトラブルシューティングに役立てるには、 サポートされているレベル のいずれかに変更します。
DEBUG は最も詳細なログを生成します。ログレベルを DEBUG に設定するには、
import logging, sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
一般的な問題の解決策¶
次のテーブルで、Snowflake ML Modelingで起こりうる問題を解決するためのいくつかの提案を示します。
問題またはエラーメッセージ |
考えられる原因 |
解決策 |
---|---|---|
「name x is not defined」などの NameError、 ImportError、または ModuleNotFoundError |
モジュール名またはクラス名に誤字があるか、Snowpark ML がインストールされていない。 |
正しいモジュールとクラス名については、Snowpark ML Modelingクラスのテーブルをご参照ください。Snowpark ML モジュールがインストールされていることを確認してください(Snowpark ML のインストール を参照)。 |
KeyError (「not in index」または「none of [Index[..]] are in [列]」) |
誤った列名。 |
列名をチェックして修正します。 |
SnowparkSQLException、「does not exist or not authorize」 |
テーブルが存在しないか、テーブルに対する十分な権限がない。 |
テーブルが存在し、ユーザーロールに権限があることを確認してください。 |
SnowparkSQLException、「invalid identifier PETALLENGTH」 |
誤った列の数(通常は列が欠落)。 |
モデルクラスの作成時に指定した列の数をチェックし、正しい数を渡していることを確認してください。 |
InvalidParameterError |
不適切な型または値がパラメーターとして渡された。 |
インタラクティブPythonセッションで |
TypeError、「unexpected keyword argument」 |
名前付き引数に誤字がある。 |
インタラクティブPythonセッションで |
ValueError、「array with 0 sample(s)」 |
渡されたデータセットが空。 |
データセットが空ではないことを確認してください。 |
SnowparkSQLException、「authentication token has expired」 |
セッションの有効期限が切れた。 |
Jupyterノートブックを使用している場合は、カーネルを再起動して新しいセッションを作成します。 |
「cannot convert string to float」などの ValueError |
データ型の不一致。 |
インタラクティブPythonセッションで |
SnowparkSQLException、「cannot create temporary table」 |
モデルクラスが、呼び出し元の権限で実行されないストアドプロシージャの内部で使用されている。 |
所有者権限ではなく、呼び出し元の権限でストアドプロシージャを作成します。 |
SnowparkSQLException、「function available memory exceeded」 |
データセットが標準ウェアハウスで5 GB を超えている。 |
Snowparkに最適化されたウェアハウス に切り替えます。 |
OSError、「no space left on device」 |
モデルは標準的なウェアハウスの約500 MB よりも大きい。 |
Snowparkに最適化されたウェアハウス に切り替えます。 |
互換性のないxgboostのバージョン、またはxgboostのインポート時のエラー |
依存関係を適切に処理できない |
エラーメッセージに従って、パッケージをアップグレードまたはダウングレードします。 |
|
異なる型のモデルでこれらのメソッドのいずれかを使おうとした。 |
scikit-learn ベースのモデルなどで |
謝辞¶
このドキュメントの一部は、 BSD-3 「新規」または「改訂」ライセンスおよびCopyright © 2007-2023 The scikit-learn developersの下でライセンスされているScikit-learnのドキュメントに由来しています。All Rights Reserved.
このドキュメントの一部は、Apache License 2.0, January 2004およびCopyright © 2019で網羅されている XGboost に由来します。All Rights Reserved.
このドキュメントの一部は、 MIT によるライセンスおよびCopyright © Microsoft Corp.の LightGBM ドキュメントに由来します。All Rights Reserved.