分類(Snowflake Cortex ML 搭載機能)

分類は、機械学習アルゴリズムを使用して、トレーニングデータから検出されたパターンを使用してデータを異なるクラスに分類します。バイナリ分類(2つのクラス)とマルチクラス分類(2つ以上のクラス)がサポートされています。分類の一般的なユースケースとしては、顧客のチャーン予測、クレジットカード詐欺の検出、スパムの検出などがあります。

分類には、トレーニングデータへの参照を渡して分類モデルオブジェクトを作成することが含まれます。モデルは提供されたトレーニングデータに適合されます。次に、スキーマレベルの分類モデルオブジェクトを使用して、新しいデータポイントを分類し、評価 APIs を通してモデルの精度を理解します。

重要

法律上の注意点。 このSnowflake Cortex ML ベースの機能は、機械学習技術によって実現されています。機械学習技術と提供される結果は、不正確、不適切であったり、偏っていたりする可能性があります。自動パイプラインに組み込まれたものも含め、機械学習の出力に基づく決定には、モデルが生成したコンテンツが正確であることを保証するために、人間によるモニタリングとレビュープロセスが必要です。Snowflake Cortexの ML ベースの関数クエリは、他の SQL クエリと同様に扱われ、 メタデータ と見なされる可能性があります。

メタデータ。 Snowflake Cortex ML ベース関数を使用する場合、Snowflakeのログは メタデータフィールド に述べられている内容に加えて、 ML 関数によって返される一般的なエラーメッセージを記録します。これらのエラーログは、発生した問題のトラブルシューティングや、お客様により良いサービスを提供するための機能改善に役立ちます。

詳細については、 Snowflake AI の信頼と安全 FAQ をご参照ください。

分類モデルについて

Snowflake Cortexの分類機能は、 勾配ブースティングマシン を使用します。二項分類の場合、モデルは 曲線下面積 損失関数を用いてトレーニングされます。マルチクラス分類の場合、モデルは ロジスティック損失 関数を用いてトレーニングされます。

分類に使用するのに適したトレーニングデータセットには、各データポイントのラベル付けされたクラスを表すターゲット列と、少なくとも1つの特徴列が含まれます。

分類モデルは、特徴量とラベルについて、数値、ブール、文字列のデータ型をサポートしています。数値の特徴量は連続的なものとして扱われ、文字列とブール値の特徴量はカテゴリ的なものとして扱われます。数値特徴量をカテゴリとして扱うには、文字列にキャストします。このモデルは特徴量に NULL の値を扱うことができます。ラベル列のカーディナリティは1より大きく、データセットの行数より小さくなければなりません。

推論データはトレーニングデータと同じ特徴名とタイプでなければなりません。カテゴリ特徴量にトレーニングデータセットに存在しない値があってもエラーではありません。トレーニングデータセットに存在しない推論データの列は無視されます。

分類モデルは予測の質を評価できます。評価プロセスでは、元のデータに対して追加のモデルを学習しますが、その際いくつかのデータポイントは除外されます。保留されたデータポイントは推論に使用され、予測されたクラスが実際のクラスと比較されます。

現在の制限

  • トレーニングデータと推論データは、数値、ブール値、または文字列でなければなりません。その他の型は、これらの型のいずれかにキャストする必要があります。

  • 分類アルゴリズムの選択や変更はできません。

  • モデルのパラメーターを手動で指定または調整することはできません。

  • トレーニングは最大1,000列、1,000万行をサポートしますが、この制限を下回るとメモリ不足になる可能性があります。この場合は、より大きなウェアハウスを試してみてください。

  • SNOWFLAKE.ML.CLASSIFICATION インスタンスはクローンできません。分類モデルを含むデータベースをクローンまたは複製すると、そのモデルは現在スキップされます。

分類の準備

分類を使用する前に、次を行う必要があります。

また、 SNOWFLAKE.ML スキーマを含めるために、 検索パスを変更 する場合もあります。

仮想ウェアハウスの選択

Snowflake 仮想ウェアハウス は、分類機械学習モデルをトレーニングして使用するコンピュートリソースを提供します。このセクションでは、プロセスの中で最も時間とメモリを消費する部分であるトレーニングステップに焦点を当て、この分類に最適なウェアハウスのタイプとサイズを選択するための一般的なガイダンスを提供します。

トレーニングデータのサイズに基づいてウェアハウスタイプを選択する必要があります。標準ウェアハウスは、Snowparkのメモリ制限が低く、行数または特徴量が少ないトレーニングジョブに適しています。行数と特徴量の数が増えるにつれて、ジョブを正常に実行できるように、Snowparkに最適化されたウェアハウスの使用を検討してください。最高のパフォーマンスを得るために、モデルのトレーニングには他のワークロードが同時に発生しない専用ウェアハウスを使用することをSnowflakeは推奨します。

以下の表は、様々なデータサイズとウェアハウスのタイプに対応したトレーニング時間を示しており、必要なウェアハウスのタイプとサイズを理解するのに役立ちます。トレーニング時間は与えられた値と異なる場合があります。

ウェアハウスのタイプとサイズ

行数

列数

トレーニング時間(秒)

標準 XS

1000

10

8

標準 XS

10,000

100

27

標準 XS

100,000

1000

323

標準 XL

1000

10

8

標準 XL

10,000

100

15

標準 XL

100,000

1000

300

Snowpark用に最適化された XL

1000

10

11

Snowpark用に最適化された XL

10,000

100

15

Snowpark用に最適化された XL

100,000

1000

375

分類モデル作成権限の付与

予測モデルをトレーニングすると、スキーマレベルのオブジェクトが得られます。したがって、モデルの作成に使用するロールには、モデルが作成されるスキーマ上で CREATE SNOWFLAKE.ML.CLASSIFICATION 権限があり、そこにモデルを格納できるようにする必要があります。この権限は CREATE TABLE や CREATE VIEW のような他のスキーマ権限と類似しています。

Snowflakeは、 analyst という名前のロールを作成し、分類モデルを作成する必要のある人が使用できるようにすることをお勧めします。

以下の例では、 admin ロールがスキーマ admin_db.admin_schema の所有者です。 analyst ロールにより、このスキーマでモデルを作成する必要があります。

USE ROLE admin;
GRANT USAGE ON admin_db TO ROLE analyst;
GRANT USAGE ON admin_schema TO ROLE analyst;
GRANT CREATE SNOWFLAKE.ML.CLASSIFICATION ON SCHEMA admin_db.admin_schema TO ROLE analyst;
Copy

このスキーマを使用するには、ユーザーは analyst ロールを引き受けます。

USE ROLE analyst;
USE SCHEMA admin_db.admin_schema;
Copy

analyst ロールがデータベース analyst_db の CREATE SCHEMA 権限を持っている場合、そのロールは新しいスキーマ analyst_db.analyst_schema を作成し、そのスキーマに分類モデルを作成することができます。

USE ROLE analyst;
CREATE SCHEMA analyst_db.analyst_schema;
USE SCHEMA analyst_db.analyst_schema;
Copy

スキーマに対するロールのモデル作成権限を取り消すには、 REVOKE <権限> を使用します。

REVOKE CREATE SNOWFLAKE.ML.CLASSIFICATION ON SCHEMA admin_db.admin_schema FROM ROLE analyst;
Copy

モデルのトレーニング、使用、表示、削除、更新

注釈

SNOWFLAKE.ML.CLASSIFICATION は制限された権限で実行されるため、デフォルトではご使用のデータにアクセスできません。そのため、テーブルとビューを 参照 として渡す必要があります。参照は、呼び出し元の権限も一緒に渡します。テーブルやビューへの参照ではなく、 クエリ参照 を提供することもできます。

トレーニング、推論、評価 APIs については、 CLASSIFICATION リファレンス をご参照ください。

CREATE SNOWFLAKE.ML.CLASSIFICATION を使用してモデルを作成し、トレーニングします。

CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION <model_name>(...);
Copy

データセットに対して推論(予測)を実行するには、モデルの PREDICT メソッドを使用します。

SELECT <model_name>!PREDICT(...);
Copy

モデルを評価するには、提供されている評価メソッドを呼び出します。

CALL <model_name>!SHOW_EVALUATION_METRICS();
CALL <model_name>!SHOW_GLOBAL_EVALUATION_METRICS();
CALL <model_name>!SHOW_THRESHOLD_METRICS();
CALL <model_name>!SHOW_CONFUSION_MATRIX();
Copy

モデルの特徴重要度ランキングを表示するには、その SHOW_FEATURE_IMPORTANCE メソッドを呼び出します。

CALL <model_name>!SHOW_FEATURE_IMPORTANCE();
Copy

トレーニング中に生成されたログを調査するには、 SHOW_TRAINING_LOGS メソッドを使用します。

CALL <model_name>!SHOW_TRAINING_LOGS();
Copy

Tip

これらのメソッドの使用例については、 をご参照ください。

すべての分類モデルを表示するには、 SHOW コマンドを使用します。

SHOW SNOWFLAKE.ML.CLASSIFICATION;
Copy

分類モデルを削除するには、 DROP コマンドを使用します。

DROP SNOWFLAKE.ML.CLASSIFICATION <model_name>;
Copy

モデルは不変であり、導入状態で更新することはできません。モデルを更新するには、既存のモデルをドロップし、新しいモデルをトレーニングします。CREATE コマンドの CREATE OR REPLACE バリアントはこの目的に便利です。

例に対するデータの設定

このトピックの例では、2つのテーブルを使用します。最初のテーブル training_purchase_data には、バイナリラベル列とマルチクラスラベル列の2つの特徴列があります。2番目のテーブルは prediction_purchase_data と呼ばれ、2つの特徴列があります。以下の SQL を使用して、これらのテーブルを作成します。

CREATE OR REPLACE TABLE training_purchase_data AS (
    SELECT
        CAST(UNIFORM(0, 4, RANDOm()) as VARCHAR) as user_interest_score,
        UNIFORM(0, 3, RANDOM()) as user_rating, FALSE AS label,
        'not_interested' AS class
    FROM TABLE(GENERATOR(rowCount => 100))
    UNION ALL
    SELECT
        CAST(UNIFORM(4, 7, RANDOM()) AS VARCHAR) AS user_interest_score,
        UNIFORM(3, 7, RANDOM()) AS user_rating, FALSE AS label,
        'add_to_wishlist' AS class
    FROM TABLE(GENERATOR(rowCount => 100))
    UNION ALL
    SELECT
        CAST(UNIFORM(7, 10, RANDOM()) AS VARCHAR) AS user_interest_score,
        UNIFORM(7, 10, RANDOM()) AS user_rating,
        TRUE as label, 'purchase' AS class
    FROM TABLE(GENERATOR(rowCount => 100))
);

CREATE OR REPLACE table prediction_purchase_data AS (
    SELECT
        CAST(UNIFORM(0, 4, RANDOM()) AS VARCHAR) AS user_interest_score,
        UNIFORM(0, 3, RANDOM()) AS user_rating
    FROM TABLE(GENERATOR(rowCount => 100))
    UNION ALL
    SELECT
        CAST(UNIFORM(4, 7, RANDOM()) AS VARCHAR) AS user_interest_score,
        UNIFORM(3, 7, RANDOM()) AS user_rating
    FROM TABLE(GENERATOR(rowCount => 100))
    UNION ALL
    SELECT
        CAST(UNIFORM(7, 10, RANDOM()) AS VARCHAR) AS user_interest_score,
        UNIFORM(7, 10, RANDOM()) AS user_rating
    FROM TABLE(GENERATOR(rowCount => 100))
);
Copy

二値分類子のトレーニングと使用

まず、トレーニング用のバイナリデータを含むビューを作成します。

CREATE OR REPLACE view binary_classification_view AS
    SELECT uuid, user_interest_score, user_rating, label
FROM training_purchase_data;
SELECT * FROM binary_classification_view;
Copy

SELECT ステートメントは、次のような形式で結果を返します。

+---------------------+-------------+-------+
| USER_INTEREST_SCORE | USER_RATING | LABEL |
|---------------------+-------------+-------|
| 4                   |           0 | False |
| 3                   |           3 | False |
| 0                   |           0 | False |
| 3                   |           0 | False |
| 0                   |           2 | False |
+---------------------+-------------+-------+

このビューを使用して、二項分類モデルを作成し、トレーニングします。

CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model_binary(
    INPUT_DATA => SYSTEM$REFERENCE('view', 'binary_classification_view'),
    TARGET_COLNAME => 'label'
);
Copy

モデルを作成したら、その PREDICT メソッドを使用して、ラベルのない購買データのラベルを推測します。 OBJECT_CONSTRUCT 関数を使用すると、 INPUT_DATA 引数用の特徴量のキーと値のペアを作成できます。

SELECT model_binary!PREDICT(INPUT_DATA => object_construct(*))
    as prediction from prediction_purchase_data;
Copy

このモデルは次のような形式で出力を返します。予測オブジェクトには、各クラスの予測確率と、最大予測確率に基づく予測クラスが含まれます。予測値は、元の特徴量が提供されたのと同じ順序で返されます。

+--------------------------------------------------+
| PREDICTION                                       |
|--------------------------------------------------|
| {                                                |
|   "class": "False",                              |
|   "logs": null,                                  |
|   "probability": {                               |
|     "False": 0.997954711,                        |
|     "True": 0.002045289                          |
|   }                                              |
| }                                                |
| {                                                |
|   "class": "False",                              |
|   "logs": null,                                  |
|   "probability": {                               |
|     "False": 0.9972659439,                       |
|     "True": 0.0027340561                         |
|   }                                              |
| }                                                |
| {                                                |
|   "class": "False",                              |
|   "logs": null,                                  |
|   "probability": {                               |
|     "False": 0.9971540571,                       |
|     "True": 0.0028459429                         |
|   }                                              |
| }                                                |
| {                                                |
|   "class": "False",                              |
|   "logs": null,                                  |
|   "probability": {                               |
|     "False": 0.9971536503,                       |
|     "True": 0.0028463497                         |
|   }                                              |
| }                                                |
| {                                                |
|   "class": "False",                              |
|   "logs": null,                                  |
|   "probability": {                               |
|     "False": 0.9972659439,                       |
|     "True": 0.0027340561                         |
|   }                                              |
| }                                                |
+--------------------------------------------------+

特徴量と予測値を結合するには、以下のようなクエリを使用します。

SELECT *, model_binary!PREDICT(
    INPUT_DATA => object_construct(*))
    as predictions from prediction_purchase_data;
Copy
+---------------------+-------------+----------------------------+
| USER_INTEREST_SCORE | USER_RATING | PREDICTIONS                |
|---------------------+-------------+----------------------------|
| 4                   |           0 | {                          |
|                     |             |   "class": "False",        |
|                     |             |   "logs": null,            |
|                     |             |   "probability": {         |
|                     |             |     "False": 0.997954711,  |
|                     |             |     "True": 0.002045289    |
|                     |             |   }                        |
|                     |             | }                          |
| 2                   |           3 | {                          |
|                     |             |   "class": "False",        |
|                     |             |   "logs": null,            |
|                     |             |   "probability": {         |
|                     |             |     "False": 0.9972659439, |
|                     |             |     "True": 0.0027340561   |
|                     |             |   }                        |
|                     |             | }                          |
| 3                   |           2 | {                          |
|                     |             |   "class": "False",        |
|                     |             |   "logs": null,            |
|                     |             |   "probability": {         |
|                     |             |     "False": 0.9971540571, |
|                     |             |     "True": 0.0028459429   |
|                     |             |   }                        |
|                     |             | }                          |
| 1                   |           1 | {                          |
|                     |             |   "class": "False",        |
|                     |             |   "logs": null,            |
|                     |             |   "probability": {         |
|                     |             |     "False": 0.9971536503, |
|                     |             |     "True": 0.0028463497   |
|                     |             |   }                        |
|                     |             | }                          |
| 0                   |           3 | {                          |
|                     |             |   "class": "False",        |
|                     |             |   "logs": null,            |
|                     |             |   "probability": {         |
|                     |             |     "False": 0.9972659439, |
|                     |             |     "True": 0.0027340561   |
|                     |             |   }                        |
|                     |             | }                          |
+---------------------+-------------+----------------------------+

マルチクラス分類器のトレーニングと使用

トレーニング用のバイナリデータを含むビューを作成します。

CREATE OR REPLACE multiclass_classification_view AS
    SELECT uuid, user_interest_score, user_rating, class
FROM training_purchase_data;
SELECT * FROM multiclass_classification_view;
Copy

この SELECT ステートメントは、次のような形式で結果を返します。

+---------------------+-------------+-----------------+
| USER_INTEREST_SCORE | USER_RATING | CLASS           |
|---------------------+-------------+---------------- |
| 4                   |           0 | not_interested  |
| 3                   |           3 | not_interested  |
| 0                   |           0 | add_to_wishlist |
| 3                   |           0 | purchase        |
| 0                   |           2 | not_interested  |
| 2                   |           1 | purchase        |
| 1                   |           0 | not_interested  |
+---------------------+-------------+-----------------+

このビューからマルチクラス分類モデルを作成します。

CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model_multiclass(
    INPUT_DATA => SYSTEM$REFERENCE('view', 'multiclass_classification_view'),
    TARGET_COLNAME => 'class'
);
Copy

モデルを作成したら、その PREDICT メソッドを使用して、ラベルのない購買データのラベルを推測します。 OBJECT_CONSTRUCT 関数を使用して、 INPUT_DATA 引数のキーと値のペアを自動的に作成します。

SELECT *, model_multiclass!PREDICT(
    INPUT_DATA => object_construct(*))
    as predictions from prediction_purchase_data;
Copy

このモデルは次のような形式で出力を返します。予測オブジェクトには、各クラスの予測確率と、最大予測確率に基づく予測クラスが含まれます。予測は、提供された元の特徴量と同じ順序で返され、同じクエリで結合することができます。

+---------------------+-------------+--------------------------------------+
| USER_INTEREST_SCORE | USER_RATING | PREDICTIONS                          |
|---------------------+-------------+--------------------------------------|
| 4                   |           0 | {                                    |
|                     |             |   "class": "not_interested",         |
|                     |             |   "logs": null,                      |
|                     |             |   "probability": {                   |
|                     |             |     "add_to_wishlist": 0.0114593962, |
|                     |             |     "not_interested": 0.988124481,   |
|                     |             |     "purchase": 0.0004161228         |
|                     |             |   }                                  |
|                     |             | }                                    |
| 2                   |           3 | {                                    |
|                     |             |   "class": "not_interested",         |
|                     |             |   "logs": null,                      |
|                     |             |   "probability": {                   |
|                     |             |     "add_to_wishlist": 0.060358652,  |
|                     |             |     "not_interested": 0.9283297874,  |
|                     |             |     "purchase": 0.0113115606         |
|                     |             |   }                                  |
|                     |             | }                                    |
| 3                   |           2 | {                                    |
|                     |             |   "class": "not_interested",         |
|                     |             |   "logs": null,                      |
|                     |             |   "probability": {                   |
|                     |             |     "add_to_wishlist": 0.0004839615, |
|                     |             |     "not_interested": 0.9990937618,  |
|                     |             |     "purchase": 0.0004222767         |
|                     |             |   }                                  |
|                     |             | }                                    |
| 1                   |           1 | {                                    |
|                     |             |   "class": "not_interested",         |
|                     |             |   "logs": null,                      |
|                     |             |   "probability": {                   |
|                     |             |     "add_to_wishlist": 0.0004852349, |
|                     |             |     "not_interested": 0.9991116684,  |
|                     |             |     "purchase": 0.0004030968         |
|                     |             |   }                                  |
|                     |             | }                                    |
| 0                   |           3 | {                                    |
|                     |             |   "class": "not_interested",         |
|                     |             |   "logs": null,                      |
|                     |             |   "probability": {                   |
|                     |             |     "add_to_wishlist": 0.0515227848, |
|                     |             |     "not_interested": 0.937059287,   |
|                     |             |     "purchase": 0.0114179283         |
|                     |             |   }                                  |
|                     |             | }                                    |
+---------------------+-------------+--------------------------------------+

結果をテーブルに保存して、予測を詳しく調べる

モデルの PREDICT メソッドの呼び出しの結果は、クエリに直接読み込むことができますが、結果をテーブルに保存することで予測を都合に合わせて調べることができます。

CREATE OR REPLACE TABLE my_predictions AS
SELECT *, model_multiclass!PREDICT(INPUT_DATA => object_construct(*)) as predictions from prediction_purchase_data;

SELECT * FROM my_predictions;
Copy

キー列と予測列は、さらにクエリして探索することができます。以下のクエリは、予測を詳しく調べます。

SELECT
    predictions:class AS predicted_class,
    predictions:probability AS predicted_probabilities,
    predictions:probability:not_interested AS not_interested_class_probability,
    predictions['probability']['purchase'] AS purchase_class_probability
FROM my_predictions;
Copy

上記のクエリは、次のような形式で結果を返します。

+-------------------+------------------------------------+----------------------------------+----------------------------+
| PREDICTED_CLASS   | PREDICTED_PROBABILITIES            | NOT_INTERESTED_CLASS_PROBABILITY | PURCHASE_CLASS_PROBABILITY |
|-------------------+------------------------------------+----------------------------------+----------------------------|
| "not_interested"  | {                                  | 0.988124481                      | 0.0004161228               |
|                   |   "add_to_wishlist": 0.0114593962, |                                  |                            |
|                   |   "not_interested": 0.988124481,   |                                  |                            |
|                   |   "purchase": 0.0004161228         |                                  |                            |
|                   | }                                  |                                  |                            |
| "not_interested"  | {                                  | 0.988124481                      | 0.0004161228               |
|                   |   "add_to_wishlist": 0.0114593962, |                                  |                            |
|                   |   "not_interested": 0.988124481,   |                                  |                            |
|                   |   "purchase": 0.0004161228         |                                  |                            |
|                   | }                                  |                                  |                            |
| "not_interested"  | {                                  | 0.9990628483                     | 0.0004207292               |
|                   |   "add_to_wishlist": 0.0005164225, |                                  |                            |
|                   |   "not_interested": 0.9990628483,  |                                  |                            |
|                   |   "purchase": 0.0004207292         |                                  |                            |
|                   | }                                  |                                  |                            |
| "add_to_wishlist" | {                                  | 0.0011554733                     | 0.0032013896               |
|                   |   "add_to_wishlist": 0.9956431372, |                                  |                            |
|                   |   "not_interested": 0.0011554733,  |                                  |                            |
|                   |   "purchase": 0.0032013896         |                                  |                            |
|                   | }                                  |                                  |                            |
| "add_to_wishlist" | {                                  | 0.0011554733                     | 0.0032013896               |
|                   |   "add_to_wishlist": 0.9956431372, |                                  |                            |
|                   |   "not_interested": 0.0011554733,  |                                  |                            |
|                   |   "purchase": 0.0032013896         |                                  |                            |
|                   | }                                  |                                  |                            |
+-------------------+------------------------------------+----------------------------------+----------------------------+

評価関数の使用

デフォルトでは、評価はすべてのインスタンスで有効になっています。ただし、構成オブジェクトの引数を使えば、評価を手動で有効または無効にできます。キー「evaluate」に値 FALSE が指定されている場合、評価は使用できません。

CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model(
    INPUT_DATA => SYSTEM$REFERENCE('view', 'binary_classification_view'),
    TARGET_COLNAME => 'label',
    CONFIG_OBJECT => {'evaluate': TRUE}
);
Copy

評価を有効にすると、ここに表示される評価 APIs を使用して評価指標を取得できます。

CALL model!SHOW_EVALUATION_METRICS();
CALL model!SHOW_GLOBAL_EVALUATION_METRICS();
CALL model!SHOW_THRESHOLD_METRICS();
CALL model!SHOW_CONFUSION_MATRIX();
Copy

返される指標の説明については 評価指標の理解 をご参照ください。

モデルロールと使用権限

各分類モデルインスタンスには、 mladminmlconsumer の2つのモデルロールが含まれます。これらのロールはモデル自体に適用されます: model!mladminmodel!mlconsumer です。モデルオブジェクトの所有者(最初は作成者)には自動的に model!mladminmodel!mlconsumer のロールが付与され、これらのロールをアカウントロールとデータベースロールに付与することができます。

mladmin ロールは、モデルオブジェクトから起動可能なすべての APIs の使用を許可します。これには予測メソッドや評価メソッドが含まれますが、それらに限定されるわけではありません。 mlconsumer ロールは、予測 APIs 上でのみ使用を許可し、他の探索 APIs では許可しません。

以下の SQL 例は、分類モデルのロールを他のロールに付与する例を示しています。 r1 ロールは分類モデルを作成することができ、 r2 がそのモデルの PREDICT メソッドを呼び出すことができるように、 mlconsumer 権限を r2 ロールに付与します。そして、 r3 がモデルのすべてのメソッドを呼び出せるように、 r1mladmin ロールを別のロール r3 に付与します。

まず、ロール r1 がモデルオブジェクトを作成し、 r1 をモデル model の所有者にします。

USE ROLE r1;
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model(
    INPUT_DATA => SYSTEM$REFERENCE('TABLE', 'test_classification_dataset'),
    TARGET_COLNAME => 'LABEL'
);
Copy

以下のステートメントを実行すると、ロール r2 がモデルの PREDICT メソッドを呼び出せないことがわかります。

USE ROLE r2;
SELECT model!PREDICT(1);    -- privilege error
Copy

次に、 r1r2mlocnosumer インスタンスロールを付与します。そうすると、 r2 はモデルの PREDICT メソッドを呼び出すことができます。

USE ROLE r1;
GRANT SNOWFLAKE.ML.CLASSIFICATION ROLE model!mlconsumer TO ROLE r2;

USE ROLE r2;
CALL model!PREDICT(
    INPUT_DATA => system$query_reference(
    'SELECT object_construct(*) FROM test_classification_dataset')
);
Copy

同様に、 r3 ロールは mladmin インスタンスロールなしではモデルの評価指標を見ることができません。

USE ROLE r3;
CALL model!SHOW_EVALUATION_METRICS();   -- privilege error
Copy

ロール r1 が必要なロールを r3 に付与すると、 r3 はモデルの SHOW_EVALUATION_METRICS メソッドを呼び出すことができます。

USE ROLE r1;
GRANT SNOWFLAKE.ML.CLASSIFICATION ROLE model!mladmin TO ROLE r3;

USE ROLE r3;
CALL model!SHOW_EVALUATION_METRICS();
Copy

以下のように権限を取り消すことができます。

USE ROLE r1;
REVOKE SNOWFLAKE.ML.CLASSIFICATION ROLE model!mlconsumer FROM ROLE r2;
REVOKE SNOWFLAKE.ML.CLASSIFICATION ROLE model!mladmin FROM ROLE r3;
Copy

以下のコマンドを使用して、どのアカウントロールとデータベースロールにこれらのインスタンスロールが付与されているかを確認します。

SHOW GRANTS TO SNOWFLAKE.ML.CLASSIFICATION ROLE <model_name>!mladmin;
SHOW GRANTS TO SNOWFLAKE.ML.CLASSIFICATION ROLE <model_name>!mlconsumer;
Copy

評価指標の理解

指標は、モデルがどれだけ正確に新しいデータを予測するかを測定します。現在、Snowflake分類はデータセット全体からランダムにサンプルを選択してモデルを評価しています。これらの行を除いた新しいモデルがトレーニングされ、その行が推論入力として使用されます。ランダムのサンプル部分は EVALUATION_CONFIG オブジェクトの test_fraction キーを使って設定できます。

show_evaluation_metrics の指標

show_evaluation_metrics は各クラスについて以下の値を計算します。 SHOW_EVALUATION_METRICS をご参照ください。

  • 陽性インスタンス: 興味のあるクラスまたは予測されるクラスに属するデータのインスタンス(行)。

  • 陰性インスタンス: データ(行)のインスタンスで、興味のあるクラスに属さないか、予測されるものと正反対のもの。

  • 真陽性(TP): 陽性インスタンスの正しい予測。

  • 真陰性(TN): 陰性インスタンスの正しい予測、

  • 偽陽性(FP): 陽性インスタンスの誤った予測

  • 偽陰性(FN): 陰性インスタンスの誤った予測。

上記の値を使用して、各クラスについて以下の指標が報告されます。各指標では、値が大きいほど予測性の高いモデルであることを示しています。

  • 精度: 全予測陽性に対する真陽性の比率。これは、予測された陽性インスタンスのうち、実際に陽性であったインスタンスの数を測定します。

  • リコール(感度): 実際の陽性の合計に対する真の陽性の割合。これは、実際の陽性インスタンスのいくつが正しく予測されたかを測定します。

  • F1スコア: 精度とリコールの調和平均値。これは、特にクラス分布が不均等な場合に、精度とリコールのバランスを提供します。

show_global_evaluation_metrics の指標

show_global_evaluation_metrics は、 show_evaluation_metrics によって計算されたクラスごとの指標を平均することにより、モデルによって予測されたすべてのクラスについて、全体的な(グローバルな)指標を計算します。 SHOW_GLOBAL_EVALUATION_METRICS をご参照ください。

現在、精度、リコール、F1、AUC の指標には macroweighted の平均が使用されています。

ロジスティック損失(LogLoss)は、モデル全体で計算されます。予測の目的は、損失関数を最小化することです。

show_threshold_metrics の指標

show_threshold_metrics は、各クラスの特定のしきい値に対する未加工のカウントと指標を提供します。これは ROC と PR のカーブをプロットしたり、必要であればしきい値のチューニングを行ったりするのに使うことができます。しきい値は、各特定クラスについて0から1まで変化し、予測確率が割り当てられます。 SHOW_THRESHOLD_METRICS をご参照ください。

そのクラスに属する予測確率が指定されたしきい値を超えた場合、サンプルはそのクラスに属するものとして分類されます。真陽性と偽陽性と陰性は、考慮されているクラスに属さないすべてのインスタンスを陰性クラスとみなして計算されます。そして、以下の指標が計算されます。

  • 真陽性率(TPR): モデルが正しく識別する実際の陽性インスタンスの割合(リコールに相当)。

  • 偽陽性率(FPR): 陽性と誤って予測された実際の陰性インスタンスの割合。

  • 精度: 予測の総数に対する正しい予測(真陽性と真陰性の両方)の比率で、モデルがどの程度機能しているかの全体的な尺度。この指標は、アンバランスなケースでは誤解を招く可能性があります。

  • サポート: 指定したデータセットに実際に出現したクラスの数。サポート値が高いほど、データセットでクラスがより多く使用されていることを示しています。サポートはモデルの指標ではなく、データセットの特徴です。

show_confusion_matrix の混同行列

混同行列は、予測値と実際値を比較し、陽性インスタンスと陰性インスタンスを正しく識別する能力を評価することによって、モデルの性能を評価するために使用される表です。行列の対角線上のインスタンス数を最大化しながら、対角線外のインスタンス数を最小化することを目的としています。 SHOW_CONFUSION_MATRICX をご参照ください。

Snowsightの混同行列は次のように視覚化できます。

CALL model_binary!SHOW_CONFUSION_MATRIX();
Copy

結果は次のようになります。

+--------------+--------------+-----------------+-------+------+
| DATASET_TYPE | ACTUAL_CLASS | PREDICTED_CLASS | COUNT | LOGS |
|--------------+--------------+-----------------+-------+------|
| EVAL         | false        | false           |    37 | NULL |
| EVAL         | false        | true            |     1 | NULL |
| EVAL         | true         | false           |     0 | NULL |
| EVAL         | true         | true            |    22 | NULL |
+--------------+--------------+-----------------+-------+------+

混同行列を可視化するには、 ChartChart TypeHeatgrid の順にクリックします。データで、 Cell values には NONE を、 Rows には PREDICTED_CLASS を、 Columns には ACTUAL_CLASS を選択します。結果は以下の図のようになります。

比較モデルの混同行列

特徴量の重要性について

分類モデルは、モデルで使用されるすべての特徴の相対的な重要性を説明することができます。この情報は、データに実際に影響を与えている要因を理解するのに役立ちます。

SHOW_FEATURE_IMPORTANCE メソッドは、モデルのツリーが各特徴量を使用して決定した回数をカウントします。それから、これらの特徴量の重要度スコアは、合計が1になるように0から1の間の値に正規化されます。結果として得られるスコアは、トレーニング済みモデルの特徴量の近似ランキングを表します。

スコアが近い特徴量は同じような重要性を持ちます。互いによく似た複数の特徴量を使用すると、それらの特徴量の重要度スコアが低下する可能性があります。

制限事項

  • 特徴量の重要度を計算する手法は選択できません。

  • 特徴量の重要度スコアは、どの特徴量がモデルの精度にとって重要かを直感的に理解するのに役立ちますが、実際の値は推測として考慮される必要があります。

CALL model_binary!SHOW_FEATURE_IMPORTANCE();
Copy
+------+---------------------+---------------+---------------+
| RANK | FEATURE             |         SCORE | FEATURE_TYPE  |
|------+---------------------+---------------+---------------|
|    1 | USER_RATING         | 0.9295302013  | user_provided |
|    2 | USER_INTEREST_SCORE | 0.07046979866 | user_provided |
+------+---------------------+---------------+---------------+

コストの考慮事項

分類モデルのトレーニングと使用には、コンピューティングコストとストレージコストがかかります。

分類機能から任意の APIs を使用する(モデルをトレーニングする、モデルで予測する、指標を検索する)には、アクティブなウェアハウスが必要です。分類関数を使用するためのコンピューティングコストはウェアハウスに請求されます。Snowflakeのコンピューティングコストに関する一般的な情報については、 コンピューティングコストについて をご参照ください。

発生するストレージコストは、トレーニングステップで作成されたモデルインスタンスのストレージを反映しています。モデルインスタンスに関連付けられたオブジェクトを表示するには、Account Usageビュー(例: ACCOUNT_USAGE.TABLES および ACCOUNT_USAGE.STAGES)に移動します。分類モデルオブジェクトの DATABASE と SCHEMA 列には NULL が含まれますが、INSTANCE_ID 列にはモデルインスタンスに含まれるオブジェクトが入力されます。これらのオブジェクトはモデルインスタンスによって包括的に管理され、個別にアクセスしたり削除したりすることはできません。モデルに関連するストレージコストを削減するために、未使用のモデルや古いモデルは削除します。

Snowparkでの分類の使用

session.call はまだ分類モデルに対応していません。Snowparkで分類モデルを扱うには、次のように session.sql を代わりに使用します。

session.sql("CREATE SNOWFLAKE.ML.CLASSIFICATION model(...)").collect()
session.sql("SELECT model!PREDICT(...)").collect()
Copy