分类(Snowflake Cortex ML 函数)¶
分类使用机器学习算法,运用在训练数据中检测到的模式将数据划分为不同类别。支持二元分类(两个类)和多类别分类(两个以上的类)。常见分类用例包括客户流失预测、信用卡欺诈检测和垃圾邮件检测。
分类涉及到创建分类模型对象,传入对训练数据的引用。该模型会拟合到提供的训练数据中。然后,您可以使用生成的架构级分类模型对象对新数据点进行分类,并通过其评估 APIs 了解模型的准确性。
重要
法律声明。 此 Snowflake Cortex ML 函数由机器学习技术提供支持。机器学习技术和提供的结果可能不准确、不合适或较为片面。基于机器学习输出(包括内置在自动管道中的输出)的决策应有人工监督和审查流程,以确保模型生成的内容准确无误。Snowflake Cortex ML 函数查询将被视为任何其他 SQL 查询,并可能被视为 元数据。
元数据。 当您使用 Snowflake Cortex ML 函数时,除了 元数据字段 中提及的内容外,Snowflake 还会记录 ML 函数返回的通用错误消息。这些错误日志可帮助我们排查出现的问题,并改进这些函数以更好地满足您的需求。
有关更多信息,请参阅 Snowflake AI 信任与安全 FAQ。
关于分类模型¶
Snowflake Cortex 分类函数由 梯度增强机 (link removed) 提供支持。对于二元分类,使用 曲线下面积 (link removed) 损失函数训练模型。对于多类别分类,使用 逻辑损失 (link removed) 函数训练模型。
适合用于分类的训练数据集包括代表各数据点标注类别的目标列,以及至少一个特征列。
分类模型支持特征和标签的数字、布尔和字符串数据类型。数值特征被视为连续特征,而字符串和布尔特征被视为分类特征。要将数值特征视为分类特征,请将其转换为字符串。该模型可以处理特征中的 NULL 值。标签列的基数必须大于 1,且小于数据集中的行数。
推理数据与训练数据必须具有相同的特征名称和类型。分类特征值在训练数据集中不存在并非错误。如果推理数据在训练数据集中不存在,相应列将被忽略。
可以评估分类模型,以确定预测质量。在评估过程中会根据原始数据训练其他模型,但会保留某些数据点。然后,将使用保留的数据点进行推断,并将预测的类别与实际类别进行比较。
当前限制¶
训练和推理数据必须是数字值、布尔值或字符串。其他类型必须转换为这些类型之一。
您不能选择或修改分类算法。
无法手动指定或调整模型参数。
训练最多支持 1,000 列和 1000 万行,但有可能在未达到此限值的情况下就耗尽内存。在这种情况下,请尝试使用更大的仓库。
SNOWFLAKE.ML.CLASSIFICATION 实例不能克隆。克隆或复制包含分类模型的数据库时,该模型当前会被跳过。
准备分类¶
在使用分类之前,您必须:
您可能还需要 修改搜索路径,以包括 SNOWFLAKE.ML 架构。
选择虚拟仓库¶
Snowflake 虚拟仓库 为训练和使用分类机器学习模型提供计算资源。本节提供有关为分类选择最佳类型和大小的仓库的一般指导,重点介绍训练步骤,说明该过程中最耗时、最耗费内存的部分。
您应该根据训练数据的大小选择仓库类型。标准仓库的 Snowpark 内存限制较低,更适合行数或特征数量较少的训练作业。随着行数和特征数量的增加,可以考虑使用经过 Snowpark 优化的仓库来确保作业可以成功运行。为了尽可能提高性能,使用没有其他并发工作负载的专用仓库训练模型。
下表提供了各种数据大小和仓库类型的训练时间,请参考此表来了解所需的仓库类型和大小。训练时间可能与给定值有所不同。
仓库类型和大小 |
行数 |
列数 |
训练时间(秒) |
---|---|---|---|
Standard XS |
1000 |
10 |
8 |
Standard XS |
10,000 |
100 |
27 |
Standard XS |
100,000 |
1000 |
323 |
Standard XL |
1000 |
10 |
8 |
Standard XL |
10,000 |
100 |
15 |
Standard XL |
100,000 |
1000 |
300 |
Snowpark-Optimized XL |
1000 |
10 |
11 |
Snowpark-Optimized XL |
10,000 |
100 |
15 |
Snowpark-Optimized 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 DATABASE admin_db TO ROLE analyst;
GRANT USAGE ON SCHEMA admin_schema TO ROLE analyst;
GRANT CREATE SNOWFLAKE.ML.CLASSIFICATION ON SCHEMA admin_db.admin_schema TO ROLE analyst;
要使用此架构,用户将承担 analyst
角色:
USE ROLE analyst;
USE SCHEMA admin_db.admin_schema;
如果角色 analyst
在数据库 analyst_db
中具有 CREATE SCHEMA 权限,则该角色可以创建新架构 analyst_db.analyst_schema
并在该架构中创建分类模型:
USE ROLE analyst;
CREATE SCHEMA analyst_db.analyst_schema;
USE SCHEMA analyst_db.analyst_schema;
要撤消角色对架构的模型创建权限,请使用 REVOKE <privileges>:
REVOKE CREATE SNOWFLAKE.ML.CLASSIFICATION ON SCHEMA admin_db.admin_schema FROM ROLE analyst;
训练、使用、查看、删除和更新模型¶
备注
SNOWFLAKE.ML.CLASSIFICATION 使用有限的权限运行,因此默认情况下它无权访问数据。因此,您必须将表和视图作为 引用 传递,以便传递调用方的权限。还可以提供 查询引用,而不是对表或视图的引用。
有关训练、推理和评估 APIs 的信息,请参阅 CLASSIFICATION 参考。
使用 CREATE SNOWFLAKE.ML.CLASSIFICATION 创建和训练模型。
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION <model_name>(...);
要对数据集进行推断(预测),请使用模型的 PREDICT 方法。
SELECT <model_name>!PREDICT(...);
要评估模型,请调用所提供的评估方法。
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();
要显示模型的特征重要性排名,请调用其 SHOW_FEATURE_IMPORTANCE 方法。
CALL <model_name>!SHOW_FEATURE_IMPORTANCE();
要调查训练期间生成的日志,请使用 SHOW_TRAINING_LOGS 方法。如果没有可用训练日志,此调用将返回 NULL。
CALL <model_name>!SHOW_TRAINING_LOGS();
小技巧
有关使用这些方法的示例,请参阅 示例。
要查看所有分类模型,请使用 SHOW 命令。
SHOW SNOWFLAKE.ML.CLASSIFICATION;
要删除分类模型,请使用 DROP 命令。
DROP SNOWFLAKE.ML.CLASSIFICATION <model_name>;
模型是不可变的,不能就地更新。要更新模型,请删除现有模型并训练新模型。针对此目的,CREATE 命令的 CREATE OR REPLACE 变体非常有用。
示例¶
为示例设置数据¶
本主题中的示例使用两个表。第一个表 training_purchase_data
有两个特征列:二元标签列和多类别标签列。第二个表称为 prediction_purchase_data
,其中包含两个特征列。使用下面的 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))
);
训练和使用二元分类器¶
首先,创建一个包含用于训练的二元数据的视图。
CREATE OR REPLACE view binary_classification_view AS
SELECT user_interest_score, user_rating, label
FROM training_purchase_data;
SELECT * FROM binary_classification_view ORDER BY RANDOM(42) LIMIT 5;
SELECT 语句通过以下形式返回结果。
+---------------------+-------------+-------+
| USER_INTEREST_SCORE | USER_RATING | LABEL |
|---------------------+-------------+-------|
| 5 | 4 | False |
| 8 | 8 | True |
| 6 | 5 | False |
| 7 | 7 | True |
| 7 | 4 | False |
+---------------------+-------------+-------+
使用此视图创建和训练二元分类模型。
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model_binary(
INPUT_DATA => SYSTEM$REFERENCE('view', 'binary_classification_view'),
TARGET_COLNAME => 'label'
);
创建模型后,使用其 PREDICT 方法推断未添加标签的购买数据的标签。您可以使用 OBJECT_CONSTRUCT 函数,为 INPUT_DATA 实参创建特征的键值对。
SELECT model_binary!PREDICT(INPUT_DATA => object_construct(*))
as prediction from prediction_purchase_data;
该模型使用以下格式返回输出。预测对象包括每个类别的预测概率,以及基于最大预测概率的预测类别。预测的返回顺序与原始特征的提供顺序相同。
+-------------------------------------+
| PREDICTION |
|-------------------------------------|
| { |
| "class": "True", |
| "logs": null, |
| "probability": { |
| "False": 1.828038600000000e-03, |
| "True": 9.981719614000000e-01 |
| } |
| } |
| { |
| "class": "False", |
| "logs": null, |
| "probability": { |
| "False": 9.992944771000000e-01, |
| "True": 7.055229000000000e-04 |
| } |
| } |
| { |
| "class": "True", |
| "logs": null, |
| "probability": { |
| "False": 3.429796010000000e-02, |
| "True": 9.657020399000000e-01 |
| } |
| } |
| { |
| "class": "False", |
| "logs": null, |
| "probability": { |
| "False": 9.992687686000000e-01, |
| "True": 7.312314000000000e-04 |
| } |
| } |
| { |
| "class": "False", |
| "logs": null, |
| "probability": { |
| "False": 9.992951615000000e-01, |
| "True": 7.048385000000000e-04 |
| } |
| } |
+-------------------------------------+
要将特征与预测相联接,请使用如下查询。
SELECT *, model_binary!PREDICT(
INPUT_DATA => object_construct(*))
as predictions from prediction_purchase_data;
+---------------------+-------------+-------------------------------------+
| USER_INTEREST_SCORE | USER_RATING | PREDICTIONS |
|---------------------+-------------+-------------------------------------|
| 9 | 8 | { |
| | | "class": "True", |
| | | "logs": null, |
| | | "probability": { |
| | | "False": 1.828038600000000e-03, |
| | | "True": 9.981719614000000e-01 |
| | | } |
| | | } |
| 3 | 0 | { |
| | | "class": "False", |
| | | "logs": null, |
| | | "probability": { |
| | | "False": 9.992944771000000e-01, |
| | | "True": 7.055229000000000e-04 |
| | | } |
| | | } |
| 10 | 7 | { |
| | | "class": "True", |
| | | "logs": null, |
| | | "probability": { |
| | | "False": 3.429796010000000e-02, |
| | | "True": 9.657020399000000e-01 |
| | | } |
| | | } |
| 6 | 6 | { |
| | | "class": "False", |
| | | "logs": null, |
| | | "probability": { |
| | | "False": 9.992687686000000e-01, |
| | | "True": 7.312314000000000e-04 |
| | | } |
| | | } |
| 1 | 3 | { |
| | | "class": "False", |
| | | "logs": null, |
| | | "probability": { |
| | | "False": 9.992951615000000e-01, |
| | | "True": 7.048385000000000e-04 |
| | | } |
| | | } |
+---------------------+-------------+-------------------------------------+
训练和使用多类别分类器¶
创建包含用于训练的二元数据的视图。
CREATE OR REPLACE VIEW multiclass_classification_view AS
SELECT user_interest_score, user_rating, class
FROM training_purchase_data;
SELECT * FROM multiclass_classification_view ORDER BY RANDOM(42) LIMIT 10;
此 SELECT 语句使用以下形式返回结果。
+---------------------+-------------+-----------------+
| USER_INTEREST_SCORE | USER_RATING | CLASS |
|---------------------+-------------+-----------------|
| 5 | 4 | add_to_wishlist |
| 8 | 8 | purchase |
| 6 | 5 | add_to_wishlist |
| 7 | 7 | purchase |
| 7 | 4 | add_to_wishlist |
| 1 | 1 | not_interested |
| 2 | 1 | not_interested |
| 7 | 3 | add_to_wishlist |
| 2 | 0 | not_interested |
| 0 | 1 | not_interested |
+---------------------+-------------+-----------------+
现在,从此视图创建多类别分类模型。
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model_multiclass(
INPUT_DATA => SYSTEM$REFERENCE('view', 'multiclass_classification_view'),
TARGET_COLNAME => 'class'
);
创建模型后,使用其 PREDICT 方法推断未添加标签的购买数据的标签。使用 OBJECT_CONSTRUCT 函数,自动为 INPUT_DATA 实参创建键值对。
SELECT *, model_multiclass!PREDICT(
INPUT_DATA => object_construct(*))
as predictions from prediction_purchase_data;
该模型使用以下格式返回输出。预测对象包括每个类别的预测概率,以及基于最大预测概率的预测类别。预测的返回顺序与原始特征的提供顺序相同,并且可以在同一个查询中联接。
+---------------------+-------------+-----------------------------------------------+
| USER_INTEREST_SCORE | USER_RATING | PREDICTIONS |
|---------------------+-------------+-----------------------------------------------|
| 9 | 8 | { |
| | | "class": "purchase", |
| | | "logs": null, |
| | | "probability": { |
| | | "add_to_wishlist": 3.529288000000000e-04, |
| | | "not_interested": 2.259768000000000e-04, |
| | | "purchase": 9.994210944000000e-01 |
| | | } |
| | | } |
| 3 | 0 | { |
| | | "class": "not_interested", |
| | | "logs": null, |
| | | "probability": { |
| | | "add_to_wishlist": 3.201690000000000e-04, |
| | | "not_interested": 9.994749885000000e-01, |
| | | "purchase": 2.048425000000000e-04 |
| | | } |
| | | } |
| 10 | 7 | { |
| | | "class": "purchase", |
| | | "logs": null, |
| | | "probability": { |
| | | "add_to_wishlist": 1.271809310000000e-02, |
| | | "not_interested": 3.992673600000000e-03, |
| | | "purchase": 9.832892333000000e-01 |
| | | } |
| | | } |
| 6 | 6 | { |
| | | "class": "add_to_wishlist", |
| | | "logs": null, |
| | | "probability": { |
| | | "add_to_wishlist": 9.999112027000000e-01, |
| | | "not_interested": 4.612520000000000e-05, |
| | | "purchase": 4.267210000000000e-05 |
| | | } |
| | | } |
| 1 | 3 | { |
| | | "class": "not_interested", |
| | | "logs": null, |
| | | "probability": { |
| | | "add_to_wishlist": 2.049559150000000e-02, |
| | | "not_interested": 9.759854413000000e-01, |
| | | "purchase": 3.518967300000000e-03 |
| | | } |
| | | } |
+---------------------+-------------+-----------------------------------------------+
将结果保存到表中并浏览预测¶
模型的 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;
然后可在后续查询中浏览关键列和预测列。以下查询用于浏览预测。
SELECT
predictions:class AS predicted_class,
ROUND(predictions:probability:not_interested,4) AS not_interested_class_probability,
ROUND(predictions['probability']['purchase'],4) AS purchase_class_probability,
ROUND(predictions['probability']['add_to_wishlist'],4) AS add_to_wishlist_class_probability
FROM my_predictions
LIMIT 5;
上面的查询使用以下形式返回结果。
+-------------------+----------------------------------+----------------------------+-----------------------------------+
| PREDICTED_CLASS | NOT_INTERESTED_CLASS_PROBABILITY | PURCHASE_CLASS_PROBABILITY | ADD_TO_WISHLIST_CLASS_PROBABILITY |
|-------------------+----------------------------------+----------------------------+-----------------------------------|
| "purchase" | 0.0002 | 0.9994 | 0.0004 |
| "not_interested" | 0.9995 | 0.0002 | 0.0003 |
| "purchase" | 0.0002 | 0.9994 | 0.0004 |
| "purchase" | 0.0002 | 0.9994 | 0.0004 |
| "not_interested" | 0.9994 | 0.0002 | 0.0004 |
| "purchase" | 0.0002 | 0.9994 | 0.0004 |
| "add_to_wishlist" | 0 | 0 | 0.9999 |
| "add_to_wishlist" | 0.4561 | 0.0029 | 0.5409 |
| "purchase" | 0.0002 | 0.9994 | 0.0004 |
| "not_interested" | 0.9994 | 0.0002 | 0.0003 |
+-------------------+----------------------------------+----------------------------+-----------------------------------+
使用评估函数¶
默认情况下,所有实例都会启用评估。但可以使用配置对象实参来手动启用或禁用评估。如果使用 FALSE 值指定了“evaluate”关键字,则评估不可用。
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model(
INPUT_DATA => SYSTEM$REFERENCE('view', 'binary_classification_view'),
TARGET_COLNAME => 'label',
CONFIG_OBJECT => {'evaluate': TRUE}
);
启用评估后,可以使用此处所示的评估 APIs 来获取评估指标。
CALL model!SHOW_EVALUATION_METRICS();
CALL model!SHOW_GLOBAL_EVALUATION_METRICS();
CALL model!SHOW_THRESHOLD_METRICS();
CALL model!SHOW_CONFUSION_MATRIX();
有关返回的指标的描述,请参阅 了解评估指标。
我们的多类别模型的评估指标如下。
CALL model_multiclass!SHOW_EVALUATION_METRICS();
+--------------+-----------------+--------------+---------------+------+
| DATASET_TYPE | CLASS | ERROR_METRIC | METRIC_VALUE | LOGS |
|--------------+-----------------+--------------+---------------+------|
| EVAL | add_to_wishlist | precision | 0.8888888889 | NULL |
| EVAL | add_to_wishlist | recall | 1 | NULL |
| EVAL | add_to_wishlist | f1 | 0.9411764706 | NULL |
| EVAL | add_to_wishlist | support | 16 | NULL |
| EVAL | not_interested | precision | 1 | NULL |
| EVAL | not_interested | recall | 0.9090909091 | NULL |
| EVAL | not_interested | f1 | 0.9523809524 | NULL |
| EVAL | not_interested | support | 22 | NULL |
| EVAL | purchase | precision | 1 | NULL |
| EVAL | purchase | recall | 1 | NULL |
| EVAL | purchase | f1 | 1 | NULL |
| EVAL | purchase | support | 22 | NULL |
+--------------+-----------------+--------------+---------------+------+
CALL model_multiclass!SHOW_GLOBAL_EVALUATION_METRICS();
+--------------+--------------+--------------+---------------+------+
| DATASET_TYPE | AVERAGE_TYPE | ERROR_METRIC | METRIC_VALUE | LOGS |
|--------------+--------------+--------------+---------------+------|
| EVAL | macro | precision | 0.962962963 | NULL |
| EVAL | macro | recall | 0.9696969697 | NULL |
| EVAL | macro | f1 | 0.964519141 | NULL |
| EVAL | macro | auc | 0.9991277911 | NULL |
| EVAL | weighted | precision | 0.9703703704 | NULL |
| EVAL | weighted | recall | 0.9666666667 | NULL |
| EVAL | weighted | f1 | 0.966853408 | NULL |
| EVAL | weighted | auc | 0.9991826156 | NULL |
| EVAL | NULL | log_loss | 0.06365200147 | NULL |
+--------------+--------------+--------------+---------------+------+
CALL model_multiclass!SHOW_CONFUSION_MATRIX();
+--------------+-----------------+-----------------+-------+------+
| DATASET_TYPE | ACTUAL_CLASS | PREDICTED_CLASS | COUNT | LOGS |
|--------------+-----------------+-----------------+-------+------|
| EVAL | add_to_wishlist | add_to_wishlist | 16 | NULL |
| EVAL | add_to_wishlist | not_interested | 0 | NULL |
| EVAL | add_to_wishlist | purchase | 0 | NULL |
| EVAL | not_interested | add_to_wishlist | 2 | NULL |
| EVAL | not_interested | not_interested | 20 | NULL |
| EVAL | not_interested | purchase | 0 | NULL |
| EVAL | purchase | add_to_wishlist | 0 | NULL |
| EVAL | purchase | not_interested | 0 | NULL |
| EVAL | purchase | purchase | 22 | NULL |
+--------------+-----------------+-----------------+-------+------+
备注
有关阈值指标的信息,请参阅 SHOW_THRESHOLD_METRICS。
我们还可以查看特征重要性。
CALL model_multiclass!SHOW_FEATURE_IMPORTANCE();
+------+---------------------+---------------+---------------+
| RANK | FEATURE | SCORE | FEATURE_TYPE |
|------+---------------------+---------------+---------------|
| 1 | USER_RATING | 0.9186571982 | user_provided |
| 2 | USER_INTEREST_SCORE | 0.08134280181 | user_provided |
+------+---------------------+---------------+---------------+
模型角色和使用权限¶
每个分类模型实例都包括两个模型角色:mladmin
和 mlconsumer
。这些角色的作用域仅限于模型本身:model!mladmin
和 model!mlconsumer
。模型对象的所有者(最初是模型对象创建者)会自动获授 model!mladmin
和 model!mlconsumer
角色,并且可将这些角色授予账户角色和数据库角色。
mladmin
角色允许使用模型对象中的所有 APIs 可调用对象,包括但不限于预测方法和评估方法。mlconsumer
角色仅允许在预测 APIs 中使用,不允许在其他探索性 APIs 中使用。
以下 SQL 示例展示了向其他角色授予分类模型角色的情况。r1
角色可以创建分类模型,并向 r2
角色授予 mlconsumer
权限,以便 r2
可调用该模型的 PREDICT 方法。然后 r1
会将 mladmin
角色授予另一个角色 r3
,使得 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'
);
通过执行以下语句,您可以看到 r2
角色无法调用模型的 PREDICT 方法。
USE ROLE r2;
SELECT model!PREDICT(1); -- privilege error
接下来,r1
会向 r2
授予 mlconsumer
实例角色,之后 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')
);
同样,如果没有 mladmin
实例角色,r3
角色无法看到模型的评估指标。
USE ROLE r3;
CALL model!SHOW_EVALUATION_METRICS(); -- privilege error
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();
您可按如下方式撤消权限。
USE ROLE r1;
REVOKE SNOWFLAKE.ML.CLASSIFICATION ROLE model!mlconsumer FROM ROLE r2;
REVOKE SNOWFLAKE.ML.CLASSIFICATION ROLE model!mladmin FROM ROLE r3;
使用以下命令查看各实例角色已被授予哪些账户角色和数据库角色。
SHOW GRANTS TO SNOWFLAKE.ML.CLASSIFICATION ROLE <model_name>!mladmin;
SHOW GRANTS TO SNOWFLAKE.ML.CLASSIFICATION ROLE <model_name>!mlconsumer;
了解评估指标¶
指标用于衡量模型预测新数据的准确性。Snowflake 分类目前会通过从整个数据集中随机选择样本来评估模型。它会在没有这些行的情况下训练新模型,然后将这些行用作推理输入。随机样本部分可使用 EVALUATION_CONFIG 对象中的 test_fraction
键进行配置。
show_evaluation_metrics
中的指标¶
show_evaluation_metrics
计算各分类的以下值。请参阅 SHOW_EVALUATION_METRICS。
正实例:属于感兴趣类别或预测类别的数据实例(行)。
负实例:不属于感兴趣类别或与预测值相反的数据实例(行)。
真阳性 (TP):对阳性实例的正确预测。
真阴性 (TN):对阴性实例的正确预测,
假阳性 (FP):对阳性实例的不正确预测
假阴性 (FN):对阴性实例的不正确预测。
使用上述值,报告各类别的以下指标。对于每个指标,值越大,就表示模型的预测性越强。
精度:真阳性值与预测阳性总数的比率。它衡量所预测的阳性实例中有多少确实是阳性的。
查全率(灵敏度):真阳性与实际阳性总数的比率。它衡量正确预测了多少实际阳性实例。
F1 分数:精度和查全率的调和平均值。它提供了精度与查全率之间的平衡,尤其是在类别分布不均衡的情况下。
show_global_evaluation_metrics
中的指标¶
针对 show_evaluation_metrics
计算得出的每个类别的指标,show_global_evaluation_metrics
会求其平均值,从而计算模型预测出的所有类别的整体(全局)指标。请参阅 SHOW_GLOBAL_EVALUATION_METRICS。
目前,macro
和 weighted
平均值计算用于精度、查全率、F1、AUC 等指标。
Logistical Loss (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();
结果如下所示。
+--------------+--------------+-----------------+-------+------+
| 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 |
+--------------+--------------+-----------------+-------+------+
要可视化混淆矩阵,请单击 Chart,然后依次单击 Chart Type 和 Heatgrid。在 Data 下,为 Cell values 选择 NONE,为 Rows 选择 PREDICTED_CLASS,为 Columns 选择 ACTUAL_CLASS。结果如下图所示。
了解特征的重要性¶
分类模型可解释模型中所用全部特征的相对重要性。此信息有助于了解哪些因素真正影响到了您的数据。
SHOW_FEATURE_IMPORTANCE 方法会计算模型树使用每个特征做出决策的次数。然后将这些特征重要性得分归一化为 0 到 1 之间的值,它们的总和是 1。生成的分数表示训练模型中特征的近似排名。
得分接近的特征具有相似的重要性。使用彼此非常相似的多个特征可能会降低这些特征的重要性得分。
限制¶
不能选择用于计算特征重要性的技术。
特征重要性分数有助于直观地了解哪些特征对模型的准确性较为重要,但应将实际值视为估计值。
示例¶
CALL model_binary!SHOW_FEATURE_IMPORTANCE();
+------+---------------------+---------------+---------------+
| 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()