跳至主要内容

使用 Python 与 Snowflake Cortex AI 的机器学习:指南

了解 Snowflake Cortex AI,以及它如何用于大语言模型(LLM)和机器学习。

使用 AI 探索

随着数据科学中 AI 应用场景的增多,AI 模型训练愈发受到关注。更具体地说,您可以使用 Snowflake Cortex AI 来完成机器学习。

在本指南中,我们将介绍 Snowflake Cortex AI 是什么以及它能做什么。此外,我们还将提供一个简单教程,演示如何结合 Python 和一些 SQL 开始进行机器学习与 AI。如果您是 Snowflake 新手,请查看我们的Snowflake 入门课程以快速上手。

什么是 Snowflake Cortex AI?

Snowflake Cortex AI 是集成在 Snowflake AI 数据云中的一项强大功能,旨在让您直接在 Snowflake 环境内开展机器学习(ML)相关操作。

它可将 Python 机器学习模型与 Snowflake 数据无缝集成,使组织能够在利用云基础设施的同时,从大型数据集中获取洞察、进行预测并开展高级分析。

snowflake cortex ai

来源:Snowflake Cortex AI

Snowflake Cortex AI 的关键功能:

Snowflake Cortex 由两大部分组成——LLM 函数和 ML 函数。

LLM 函数包括:

  1. Summarize(摘要)
  2. Translate(翻译)
  3. Complete(补全)
  4. Extract Answer(抽取答案)
  5. Sentiment(情感)
  6. Embed Text(文本嵌入)

我们将在下文进一步详细介绍每个函数。

ML 函数包括:

  1. 异常检测:自动检测并提醒数据中的异常值。
  2. 预测:利用机器学习算法基于历史数据做出预测。
  3. 分类:将数据划分到不同类别或组别。
  4. 关键洞察:识别一段时间内指标值波动的原因。

想了解如何学习 Snowflake 及其函数?我们的初学者Snowflake 教程和Snowflake 认证指南将为您提供帮助。

为什么将 Snowflake Cortex AI 与 Python 结合使用?

现在让我们看看将二者结合使用的优势。

将 Snowflake Cortex AI 与 Python 结合的优势

使用 Snowflake Cortex AI 的一些关键优势:

  • Python 集成:允许您在 Snowflake 计算环境中直接运行 Python 机器学习模型。
  • 模型托管:模型可以托管并用于推理服务。
  • 无需数据迁移:由于模型在 Snowflake 环境内运行,无需将大型数据集移动到外部服务器。

使用场景与应用

首先,Snowflake Cortex AI 非常适合希望在不大幅增加资源投入的情况下提升数据科学能力的企业。它提供零代码环境,即使是非技术用户也能轻松开发并部署机器学习模型。

这对预算不足以雇佣数据科学团队或投资昂贵 LLM 的小型企业或初创公司尤为有用。

其次,通过将 Python 集成进 Snowflake 的计算环境,用户可以利用海量的 Python 机器学习算法与工具库。这意味着他们无需学习新的编程语言,也能构建更先进、更准确的模型。

最后,已采用 Snowflake 环境的公司可以充分享受 Cortex AI 的优势,因为它与现有数据仓库无缝集成,无需额外的基础设施或数据迁移。

借助 Snowflake Cortex AI,企业可以轻松高效地将机器学习融入业务流程。

开始使用 Snowflake Cortex AI

在本教程中,我们将一步步演示如何使用 Python 和 Snowflake Cortex AI 搭建机器学习流水线。

先决条件

在使用 Snowflake Cortex AI 进行机器学习之前,请确保满足以下要求:

设置 Snowflake 账户

首先,您需要一个 Snowflake 实例来存储和处理数据。您可以在Snowflake 官网注册。

在注册表单中填写账户信息,并在第二页按以下选项选择。为便于教程演示与复现,请选择 Standard 版本与 Amazon Web Services。服务器区域选择 US West(俄勒冈),以获得最佳的 LLM 函数可用性。

setting up snowflake account

选择完成后,单击 Get Started 接收激活邮件。前往邮箱激活账户,您的 Snowflake 账号即可使用。

软件要求

接下来,您还需要满足一些软件方面的要求。

以下是简单清单:

  • Python 环境:Python 3.x,并安装必要的包。
  • Snowflake:需要通过终端安装 Snowflake 相关包,以将 Python 环境连接到您的 Snowflake 账号。
  • VS Code:可使用适合 Python 的集成开发环境(IDE)。其他替代方案包括 DataLab、Google Colab 或 Jupyter Notebooks。

开始任何分析之前,请先安装相关包,准备好编码环境。

安装必要包,您可以使用pip:

pip install snowflake
pip install python-dotenv

安装完成后,您需要设置工作文件夹与文件以开始。

我创建了名为 Cortex AI Tutorial 的文件夹,并加入一个新的 .env 文件,包含如下信息:

SNOWFLAKE_ACCOUNT = "<YOUR_ACCOUNT>" # eg. XXXX-XXXX

SNOWFLAKE_USER = "<YOUR_USER>" 

SNOWFLAKE_USER_PASSWORD = "<YOUR_PASSWORD>"

输入账户信息后保存文件,并在同一文件夹中创建一个 Python 文件或 Jupyter Notebook。

连接 Snowflake

准备就绪后,让我们将您的 Python 环境连接到 Snowflake。

首先,打开 Python 文件并导入必要的库。示例代码如下:

import os
from dotenv import load_dotenv
from snowflake.snowpark import Session
from snowflake.cortex import Summarize, Complete, ExtractAnswer, Sentiment, Translate, EmbedText768

接下来,您需要加载先前保存在.env 文件中的变量。这将为 Snowflake 提供您的账户凭据,以登录并使用其功能。

# Loads environment variables from .env
load_dotenv()
connection_params = {
    "account": os.environ["SNOWFLAKE_ACCOUNT"],
    "user": os.environ["SNOWFLAKE_USER"],
    "password": os.environ["SNOWFLAKE_USER_PASSWORD"],
}

使用这些变量完成连接后,您需要设置一个 Snowflake 会话。该对象将处理您的所有请求。

# Creates a Snowflake session

snowflake_session = Session.builder.configs(connection_params).create()

Snowflake Cortex AI 的 LLM 函数

Cortex AI 中的 LLM 函数让用户无需自建 AI 模型即可发挥大语言模型的能力。

这些函数通过一些基础任务,为一般的分析用户提供 AI 驱动的分析能力。

以下是 Snowflake Cortex 提供的函数:

1. SUMMARIZE

summarize 函数根据输入生成数据摘要。

它使用 LLM 识别关键信息并以精炼的形式呈现。

例如,如果您有一篇冗长的文档,希望快速了解其内容,您可以使用 summarize 函数得到涵盖要点的简要摘要。这能节省时间,并加速大量数据的分析。

撰文时,该函数的输入语言目前仅限英语。

参考代码如下:

# Defines the Summarize LLM Function
def summarize(user_text):
    summary = Summarize(text=user_text, session=snowflake_session)
    return summary

2. TRANSLATE

translate 函数用于将文本从一种语言转换为另一种语言。

它使用机器学习算法和统计模型来准确翻译文本。

在处理多语言数据或文档时,它有助于更轻松地沟通与理解。

例如,若您有一份西班牙语报告需要呈现给英语受众,您可以使用 translate 函数快速转换文本,从而免去人工翻译并节省时间。

参考代码如下:

# Defines the Translate LLM Function
def translate(user_text):
    translation = Translate(
        text=user_text, from_language="en", to_language="ko", session=snowflake_session
    )
    return translation

3. COMPLETE

complete 是一个通用函数,可用于执行特定任务。通过构造句子式提示,引导 AI 模型提供执行任务所需的信息。

参考代码如下:

# Defines the Complete LLM Function
def complete(user_text):
    completion = Complete(
        model="snowflake-arctic",
        prompt=f"Provide 3 relevant keywords from the following text: {user_text}",
        session=snowflake_session,
    )
    return completion

4. EXTRACT_ANSWER

extract answer 函数会基于提供给模型的问题返回答案。输入必须为英文字符串或 JSON 格式。

参考代码如下:

# Defines the Extract Answer LLM Function
def extract_answer(user_text):
    answer = ExtractAnswer(
        from_text=user_text,
        question="What are some reasons why young adult South Koreans love coffee?",
        session=snowflake_session,
    )
    return answer

5. SENTIMENT

sentiment 函数根据文本的情感倾向输出一个定量数值,范围为 -1 至 1。-1 表示最消极,1 表示最积极,接近 0 表示中性。

参考代码如下:

# Defines the Sentiment LLM Function
def sentiment(user_text):
    sentiment = Sentiment(text=user_text, session=snowflake_session)
    return sentiment

6. EMBED_TEXT

embed text 函数包括 EMBED_TEXT_768 与 EMBED_TEXT_1024,分别创建 768 与 1024 维的向量嵌入。

以下是 EMBED_TEXT_768 的参考代码:

# Defines the Embed Text LLM Function
def embed_text(user_text):
    embed_text = EmbedText768(text=user_text, model='snowflake-arctic-embed-m', session=snowflake_session)
    return embed_text

现在让我们把它们组合到一个主函数中,并用一段示例文本运行以查看结果。

我使用了一段简短的文本作为模型输入,如下所示:

snowflake llm functions sample text input

为便于复制粘贴,文本如下:

user_text = """
        Young adults in South Korea are embracing coffee as a blend of energy, comfort, and culture. 
        Coffee isn't just about staying awake during demanding studies or work; it’s a cherished part of daily routines. 
        With South Korea's bustling café culture, coffee shops have become popular spaces for socializing, studying, 
        or just taking a break from the fast-paced city life. 
        The diversity of flavors and trendy cafés also offers a unique, 
        stylish experience that fits right into the evolving lifestyle of young adults, 
        who seek both connection and personal moments in the midst of it all.
    """

现在运行代码,应该只需几秒钟。

结果如下:

snowflake cortex llm output

如您所见,AI 基于我们提供的文本给出了所需的全部结果:摘要、将文本翻译为韩语、根据文本生成三个关键词,并基于问题提供了答案。

Snowflake Cortex AI 的机器学习函数

Cortex AI 还提供仅用 SQL 即可运行的 ML 函数。以下为其提供的多种函数。

1. 异常检测

异常检测对于识别不符合数据预期行为的异常模式至关重要。Snowflake 通过内置的基于梯度提升机(GBM)的机器学习函数简化异常检测,使您能够快速定位数据集中的离群点。

异常检测尤其适用于以下任务:

  • 检测交易数据中的欺诈行为。
  • 识别异常的用户行为。
  • 监控时间序列数据中的系统性能异常。

进行异常检测时,可使用 Snowflake 类 ANOMALY_DETECTION(SNOWFLAKE.ML)。该命令会创建一个异常检测模型对象,并将模型拟合到训练数据。

用法如下:

CREATE [ OR REPLACE ] SNOWFLAKE.ML.ANOMALY_DETECTION <model_name>(
  INPUT_DATA => <reference_to_training_data>,
  [ SERIES_COLNAME => '<series_column_name>', ]
  TIMESTAMP_COLNAME => '<timestamp_column_name>',
  TARGET_COLNAME => '<target_column_name>',
  LABEL_COLNAME => '<label_column_name>',
  [ CONFIG_OBJECT => <config_object> ]
)
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ COMMENT = '<string_literal>' ]

创建对象后,您可以使用 <model_name>!DETECT_ANOMALIES 方法执行异常检测,

<model_name>!DETECT_ANOMALIES(
  INPUT_DATA => <reference_to_data_to_analyze>,
  TIMESTAMP_COLNAME => '<timestamp_column_name>',
  TARGET_COLNAME => '<target_column_name>',
  [ CONFIG_OBJECT => <configuration_object>, ]
  [ SERIES_COLNAME => '<series_column_name>' ]
)

这一步是实际的预测步骤,方法会检测出离群点。

以下是使用数据集进行异常检测的示例。

首先,您可以通过左侧的 Data,点击 Add Data,然后选择 Load data into a Table 来创建数据库。

adding snowflake database

在弹出窗口中,点击 + Database 并为数据库命名。点击 Create,然后在主弹窗中点击 Cancel。

creating new snowflake database

这样就创建了一个可供您使用的空数据库。

以下示例改编自Snowflake 文档。

开始异常检测前,打开一个新的 SQL 工作表,选择您新建的数据库作为数据源,并粘贴以下代码以创建数据表:

CREATE OR REPLACE TABLE historical_sales_data (

  store_id NUMBER, item VARCHAR, date TIMESTAMP_NTZ, sales FLOAT, label BOOLEAN,

  temperature NUMBER, humidity FLOAT, holiday VARCHAR);

// Creating the dataset
INSERT INTO historical_sales_data VALUES
  (1, 'jacket', to_timestamp_ntz('2020-01-01'), 2.0, false, 50, 0.3, 'new year'),
  (1, 'jacket', to_timestamp_ntz('2020-01-02'), 3.0, false, 52, 0.3, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-03'), 5.0, false, 54, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-04'), 30.0, true, 54, 0.3, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-05'), 8.0, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-06'), 6.0, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-07'), 4.6, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-08'), 2.7, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-09'), 8.6, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-10'), 9.2, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-11'), 4.6, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-12'), 7.0, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-13'), 3.6, false, 55, 0.2, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-14'), 8.0, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-01'), 3.4, false, 50, 0.3, 'new year'),
  (2, 'umbrella', to_timestamp_ntz('2020-01-02'), 5.0, false, 52, 0.3, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-03'), 4.0, false, 54, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-04'), 5.4, false, 54, 0.3, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-05'), 3.7, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-06'), 3.2, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-07'), 3.2, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-08'), 5.6, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-09'), 7.3, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-10'), 8.2, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-11'), 3.7, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-12'), 5.7, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-13'), 6.3, false, 55, 0.2, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-14'), 2.9, false, 55, 0.2, null);

您的代码应粘贴在类似如下界面的 SQL 工作表中:

anomaly detection SQL worksheet

接着执行以下语句以创建名为 new_sales_data 的表。

// Creating a new table and adding training data
CREATE OR REPLACE TABLE new_sales_data (
  store_id NUMBER, item VARCHAR, date TIMESTAMP_NTZ, sales FLOAT,
  temperature NUMBER, humidity FLOAT, holiday VARCHAR);
INSERT INTO new_sales_data VALUES
  (1, 'jacket', to_timestamp_ntz('2020-01-16'), 6.0, 52, 0.3, null),
  (1, 'jacket', to_timestamp_ntz('2020-01-17'), 20.0, 53, 0.3, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-16'), 3.0, 52, 0.3, null),
  (2, 'umbrella', to_timestamp_ntz('2020-01-17'), 70.0, 53, 0.3, null);

现在,创建异常检测模型:

// Creating anomaly detection model object
CREATE OR REPLACE VIEW view_with_training_data
  AS SELECT date, sales FROM historical_sales_data
    WHERE store_id=1 AND item='jacket';
CREATE OR REPLACE SNOWFLAKE.ML.ANOMALY_DETECTION basic_model(
  INPUT_DATA => TABLE(view_with_training_data),
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales',
  LABEL_COLNAME => '');

创建成功后会显示如下所示的模型已创建结果。

anomaly detection model

接下来,让我们使用该模型对象进行检测。

// Perform anomaly detection
CREATE OR REPLACE VIEW view_with_data_to_analyze
  AS SELECT date, sales FROM new_sales_data
    WHERE store_id=1 and item='jacket';
CALL basic_model!DETECT_ANOMALIES(
  INPUT_DATA => TABLE(view_with_data_to_analyze),
  TIMESTAMP_COLNAME =>'date',
  TARGET_COLNAME => 'sales'
);

检测输出如下:

anomaly detection output result

2. 分类

分类 是将数据归入预定义类别的过程。借助 Snowflake,您可以直接在 Snowflake 内完成分类,无需将数据导出到外部 ML 环境。

snowflake classification model

首先,使用以下代码创建示例数据集:

// Creating binary class dataset
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))
);

作为训练数据,我们创建一个新视图:

// Creating view for training data
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;

该视图应输出如下结果:

classification training data

接下来,根据训练数据训练模型:

// Training a binary classification model
CREATE OR REPLACE SNOWFLAKE.ML.CLASSIFICATION model_binary(
    INPUT_DATA => SYSTEM$REFERENCE('view', 'binary_classification_view'),
    TARGET_COLNAME => 'label'
);

执行分类时,使用 PREDICT 方法:

// Performing prediction using PREDICT method
SELECT model_binary!PREDICT(INPUT_DATA => {*})
    AS prediction FROM prediction_purchase_data;

预测结果示例如下:

classification function result

若要更易读的展示格式,使用以下 SQL:

// Formatting SQL predictions
SELECT *, model_binary!PREDICT(INPUT_DATA => {*})
    AS predictions FROM prediction_purchase_data;

您应能得到如下整洁的预测输出格式:

classification function result formatted

3. 关键洞察

Top Insights 是一款监控工具,通过时间序列分析来观察指标随时间的波动。借助决策树模型,Top Insights 能识别导致某项指标上升或下降的最重要因素。

snowflake top insights model

下面通过一个时间序列分析示例来说明该函数。

首先,创建数据集:

// Creating dataset
CREATE OR REPLACE TABLE input_table(
  ds DATE, metric NUMBER, dim_country VARCHAR, dim_vertical VARCHAR);
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'usa' AS dim_country,
    'tech' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'usa' AS dim_country,
    'auto' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, seq4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'usa' AS dim_country,
    'fashion' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'usa' AS dim_country,
    'finance' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'canada' AS dim_country,
    'fashion' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'canada' AS dim_country,
    'finance' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'canada' AS dim_country,
    'tech' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'canada' AS dim_country,
    'auto' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'france' AS dim_country,
    'fashion' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'france' AS dim_country,
    'finance' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'france' AS dim_country,
    'tech' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 4, 1)) AS ds,
    UNIFORM(1, 10, RANDOM()) AS metric,
    'france' AS dim_country,
    'auto' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
-- Data for the test group
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 8, 1)) AS ds,
    UNIFORM(300, 320, RANDOM()) AS metric,
    'usa' AS dim_country,
    'auto' AS dim_vertica
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
INSERT INTO input_table
  SELECT
    DATEADD(day, SEQ4(), DATE_FROM_PARTS(2020, 8, 1))  AS ds,
    UNIFORM(400, 420, RANDOM()) AS metric,
    'usa' AS dim_country,
    'finance' AS dim_vertical
  FROM TABLE(GENERATOR(ROWCOUNT => 365));
// Creating new view and adding labels to timestamps
CREATE OR REPLACE VIEW input_view AS (
    SELECT
        metric,
        dim_country as country,
        dim_vertical as vertical,
        ds >= '2021-01-01' AS label
    FROM input_table
);

接下来,我们需要创建用于预测的模型对象,以便使用 GET_DRIVERS 方法。

// Creating the model
CREATE OR REPLACE SNOWFLAKE.ML.TOP_INSIGHTS my_insights_model()

最后,调用 GET_DRIVERS 方法进行预测。

// Performing prediction using GET_DRIVERS method
CALL my_insights_model!GET_DRIVERS(
  INPUT_DATA => TABLE(input_view),
  LABEL_COLNAME => 'label',
  METRIC_COLNAME => 'metric'
);

您应得到如下结果:

top insights function result

4. 预测

当您需要基于历史数据预测未来数值时,预测尤为关键。无论是销售预测、能耗预测,还是网站流量预测,Snowflake 的内置函数都能让这些任务更简单。

snowflake forecasting model

在示例中,我们对单一序列进行预测:

// Creating the dataset
CREATE OR REPLACE TABLE sales_data (store_id NUMBER, item VARCHAR, date TIMESTAMP_NTZ,
  sales FLOAT, temperature NUMBER, humidity FLOAT, holiday VARCHAR);
INSERT INTO sales_data VALUES
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-01'), 2.0, 50, 0.3, 'new year'),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-02'), 3.0, 52, 0.3, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-03'), 4.0, 54, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-04'), 5.0, 54, 0.3, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-05'), 6.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-06'), 7.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-07'), 8.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-08'), 9.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-09'), 10.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-10'), 11.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-11'), 12.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-12'), 13.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-01'), 2.0, 50, 0.3, 'new year'),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-02'), 3.0, 52, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-03'), 4.0, 54, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-04'), 5.0, 54, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-05'), 6.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-06'), 7.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-07'), 8.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-08'), 9.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-09'), 10.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-10'), 11.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-11'), 12.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-12'), 13.0, 55, 0.2, NULL);
-- Future values for additional columns (features)
CREATE OR REPLACE TABLE future_features (store_id NUMBER, item VARCHAR,
  date TIMESTAMP_NTZ, temperature NUMBER, humidity FLOAT, holiday VARCHAR);
INSERT INTO future_features VALUES
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-13'), 52, 0.3, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-14'), 53, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-13'), 52, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-14'), 53, 0.3, NULL);

接下来,将训练数据从数据集中分离:

// Creating a view for training data
CREATE OR REPLACE VIEW v1 AS SELECT date, sales
  FROM sales_data WHERE store_id=1 AND item='jacket';
SELECT * FROM v1;

开始预测之前,您需要基于所选训练数据训练模型。

操作如下:

// Training a forecasting model
CREATE SNOWFLAKE.ML.FORECAST model1(
  INPUT_DATA => TABLE(v1),
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);

最后,调用 FORECAST 方法执行预测步骤。

// Performing the forecast by calling the FORECAST method
call model1!FORECAST(FORECASTING_PERIODS => 5);

以下是本次预测的输出结果。

forecasting function result

在 Snowflake 中监控机器学习模型

可以通过与第三方工具(如 Tableau)集成在 Snowflake 中创建仪表板,或查询 Snowflake 日志来监控模型表现。可用于跟踪模型的一些有用指标包括准确率、精确率与召回率。

结论

Snowflake Cortex AI 通过在 Snowflake 平台上无缝整合模型,简化了机器学习。本教程带您了解了如何使用 Snowflake Cortex AI 以及 Snowflake Cortex 的 ML 函数。

该方案兼具 Snowflake 的可扩展性与 Python 的灵活性,非常适合希望在不将数据移出云环境的前提下实施机器学习的组织。

想了解更多 Snowflake 资源?您可能会喜欢我们的Snowflake 初学者教程和Snowpark 指南。若您需要更系统的内容,Snowflake 入门课程可能正合适您。

使用 Python 与 Snowflake Cortex 的机器学习常见问答

Python 是否适合用于机器学习与 AI?

Python 适合机器学习与 AI,因其拥有强大的库,如 PyTorch、TensorFlow 与 Keras。也可以通过 Python 访问 Snowflake 的 AI 与 ML 函数。

如何使用 Python 进行 AI 与机器学习?

可以通过内置库,或通过 Snowflake 的 LLM 与 ML 函数,在 Python 中开展 AI 与机器学习。

如何使用 Snowflake Cortex 的基于 ML 的函数?

Snowflake Cortex 基于 ML 的函数可通过在 SQL 中调用各函数的相应方法来使用。

什么是 Snowflake AI 模型?

Snowflake AI 模型是为 Snowflake Cortex 及其相关功能提供支持的大语言模型。

有哪些 Snowflake 机器学习示例?

Snowflake 机器学习函数可应用于多种场景,例如异常检测、预测、获取关键洞察和分类等。

Austin Chia

作者

Austin Chia

我是 Austin,一名博主和科技作者,曾在医疗领域担任数据科学家与数据分析师,拥有多年的从业经验。我以生物学背景开启技术之路,如今通过我的科技博客帮助他人完成同样的转型。我对技术的热情促使我为数十家 SaaS 公司撰写内容,分享经验、启发他人。

主题