作者:尚卓燃(PsiACE)
澳门科技大学在读硕士,Databend 研发工程师实习生
Apache OpenDAL(Incubating) Committer
https://github.com/PsiACE
HuggingFace 是目前全球最流行的 AI 社区,推动数据科学家和企业在模型、数据集和应用等诸多方面进行创新与合作。HuggingFace 上存在各种各样的数据集,不光可以用作学习和练习的样本,也可以作为企业模型数据来源的基石。
为了更好发挥数据集的作用,往往需要对数据集中的原始数据进行清洗,并且归档在数据湖中提供统一的访问入口。Databend 围绕 ETL/ELT 为中心的工作流进行设计,在载入同时即可直接对数据进行清洗、转化、合并等操作;具备丰富的结构化与半结构化数据类型,能够直接查询和分析多种格式的原始数据;企业版还支持虚拟列、计算列等高级特性,确保数据始终就绪。
在这篇文章中,我们将会展示如何利用 Databend 轻松访问 HuggingFace 上托管的数据集,并且使用 SQL 进行简单高效的分析和处理。此外,示例中还包含一个使用 SQL 实现的白盒模型,展示如何在数据仓库中进行类别预测,并验证模型精度。
访问 HuggingFace 数据集
HuggingFace 提供公开可访问的 REST API ,并且支持在上传时将数据集文件自动转化为 Parquet ,使其能够与数据库和数据分析工具轻松集成。
其数据集的页面如下所示,透过 Dataset card 可以直观了解数据的相关信息并获得预览,而 Files and Versions 页面将会有助于了解目录结构和修订版本等信息。
外部 Stage/Location
现在很多数据库支持使用 HTTPS 协议直接访问远端的数据文件,这种模式不光适用于 HuggingFace ,也可以与其他提供 HTTPS 访问的文件服务集成。但是,直接使用远程 URL 访问存在一些弊端,比如遇到预期外的响应、错误的转义和编解码、为了定位文件需要进行复杂的 JSON 解析。
Databend 除了支持上述方式之外,还可以直接将 HuggingFace 文件系统作为外部 Location 访问或者挂载为外部 Stage,能够有效避免访问问题,轻松处理数据查询。
对于 HuggingFace ,其适用的 externalLocation
参数如下:
externalLocation ::=
"hf://<repo_id>[<path>]"
CONNECTION = (
<connection_parameters>
)
URI格式:hf://{repo_id}/path/to/file
,其中repo_id
类似 fka/awesome-chatgpt-prompts
。
支持的配置包括:
repo_type
: HuggingFace 仓库类型,默认为dataset
,可用选项有dataset
,model
。revision
: HuggingFace 修订版本,默认为main
。可以是仓库中的分支、标签或提交。token
: HuggingFace 的 API 令牌。
以外部 Location 的形式查询原始 CSV 数据文件
下面示例展示了如何使用 Databend 直接查询 fka/awesome-chatgpt-prompts
的原始 CSV 数据文件,并列出其中 CSV 文件第一列的 5 条数据。
SELECT $1 FROM 'hf://fka/awesome-chatgpt-prompts/' (PATTERN => '.*csv' FILE_FORMAT => 'CSV') LIMIT 5;
以外部 Stage 的形式查询转化的 Parquet 数据文件
前面提到 HuggingFace 提供转化后的 Parquet 文件,而 Databend 也支持以外部 Stage 形式挂载 HuggingFace 文件系统,下面的示例展示了其用法:
创建 Stage
对于本示例,转化后的文件位于 refs%2Fconvert%2Fparquet
这个分支的 /default/train/
PATH 下,我们可以直接挂载这个路径。
CREATE STAGE IF NOT EXISTS stage_huggingface_fka_prompts url = 'hf://fka/awesome-chatgpt-prompts/default/train/' connection = (revision = 'refs%2Fconvert%2Fparquet');
列出对应文件:
可以利用 PATTERN 列出 Stage 中符合特定模式的文件名,方便查询和分析。
LIST @stage_huggingface_fka_prompts PATTERN = '.*parquet';
查询数据
由于此前已经从 CSV 文件中获取了文件的信息,在查询 Parquet 文件时候,我们可以直接选取其中的列,考虑到 prompt 在终端中不方便全部展示,这里截断为 80 个字符。
SELECT act, left(prompt, 80) FROM @stage_huggingface_fka_prompts/0000.parquet LIMIT 5;
使用 SQL 的 数据科学
上面介绍了如何对位于 HuggingFace 的远程数据集进行简单查询,这一节中我们来看一个具体的案例,探索使用 SQL 的数据科学。
为了方便理解,我们选取数据科学入门常用的鸢尾花分类数据集(iris)作为示例。Iris 数据集出现在 R.A. Fisher 1936年的经典论文 The Use of Multiple Measurements in Taxonomic Problems ,也可以在 UCI 机器学习知识库中找到,非常适合演示简单的分类模型。
本文中使用的 HuggingFace 数据集位于 https://huggingface.co/datasets/scikit-learn/iris 。
数据挂载
我们将会将数据集挂载为 Databend 的外部 Stage :
CREATE STAGE IF NOT EXISTS stage_iris url = 'hf://scikit-learn/iris/default/train/' connection = (revision = 'refs%2Fconvert%2Fparquet');
LIST @stage_iris PATTERN = '.*parquet';
SELECT * FROM @stage_iris/0000.parquet LIMIT 5;
数据清洗
外部 Stage 中的数据相当于是原始数据,为了满足数据规范和使用需要,可以在导入时进行清洗,对于 Iris 数据集,典型的清洗操作包括:
- 移除
id
列。 - 将
species
列转换成类别标签,即整数形式。 - 将特征列从
float64
转换成float32
。 - 将特征列重命名为蛇形命名法(snake case)。
Databend 中可以利用 COPY INTO 语句在载入时完成数据清洗。
创建对应的表
执行下述语句,可以在 Databend 中创建符合数据规范的表。
CREATE TABLE iris (
sepal_length FLOAT,
sepal_width FLOAT,
petal_length FLOAT,
petal_width FLOAT,
species INT
);
使用 COPY INTO
导入数据
执行下述语句,可以在导入数据的同时,一步到位完成数据清洗工作。
COPY INTO iris
FROM (
SELECT
to_float32(t.sepallengthcm),
to_float32(t.sepalwidthcm),
to_float32(t.petallengthcm),
to_float32(t.petalwidthcm),
CASE
WHEN species = 'Iris-setosa' THEN 1
WHEN species = 'Iris-versicolor' THEN 2
WHEN species = 'Iris-virginica' THEN 3
ELSE NULL
END AS species
FROM @stage_iris t
)
FILE_FORMAT = (TYPE = PARQUET)
PATTERN = '.*parquet';
基本统计
执行下述语句,我们可以得到清洗后数据中,不同类别的数目各有多少。
SELECT species, COUNT(*) AS count
FROM iris
GROUP BY species;
基本分析
执行下述语句,我们可以得到每种鸢尾花的平均萼片长度:
SELECT species, AVG(sepal_length) as avg_sepal_length
FROM iris
GROUP BY species;
使用 SQL 预测鸢尾花类型
利用 SQL 表达简单的白盒模型,能够直观感受到模型的预测标准,并且省去与模型服务进行交互的步骤。
下面的示例仅供演示使用,并不符合严谨的训练、验证、应用的数据科学流程。
在数据科学家利用数据进行分析之后,我们可以得到一些可以量化的分类依据,结合 CASE WHEN 语句,可以使用 SQL 对简单的模型进行表达。
SELECT
sepal_length,
sepal_width,
petal_length,
petal_width,
species,
CASE
WHEN petal_width < 0.75 THEN 1
WHEN petal_width >= 0.75 AND petal_width < 1.35 THEN 2
WHEN petal_width >= 0.75 AND petal_width < 1.75 AND petal_width >= 1.35 AND sepal_width < 2.65 THEN 3
WHEN petal_width >= 0.75 AND petal_width < 1.75 AND petal_width >= 1.35 AND sepal_width >= 2.65 THEN 2
WHEN petal_width >= 0.75 AND petal_width >= 1.75 THEN 3
END AS prediction
FROM
iris;
上述 SQL 将会在选中的数据后附加一个预测列,展示预测的类别。
由于我们的鸢尾花数据集本身是具有类别的,所以可以使用 SQL 根据预测结果进一步计算模型在数据集上的精度:
SELECT
COUNT(*) AS total_count,
SUM(CASE WHEN subquery.species = subquery.prediction THEN 1 ELSE 0 END) AS correct_count,
SUM(CASE WHEN subquery.species <> subquery.prediction THEN 1 ELSE 0 END) AS incorrect_count,
SUM(CASE WHEN subquery.species = subquery.prediction THEN 1 ELSE 0 END) / COUNT(*) AS accuracy
FROM
(
SELECT
sepal_length,
sepal_width,
petal_length,
petal_width,
species,
CASE
WHEN petal_width < 0.75 THEN 1
WHEN petal_width >= 0.75 AND petal_width < 1.35 THEN 2
WHEN petal_width >= 0.75 AND petal_width < 1.75 AND petal_width >= 1.35 AND sepal_width < 2.65 THEN 3
WHEN petal_width >= 0.75 AND petal_width < 1.75 AND petal_width >= 1.35 AND sepal_width >= 2.65 THEN 2
WHEN petal_width >= 0.75 AND petal_width >= 1.75 THEN 3
END AS prediction
FROM
iris
) AS subquery;
总结
在这篇文章中,我们展示了如何使用 Databend 直接访问和查询 HuggingFace 数据集。并且展示了如何使用 SQL 对数据进行预处理,使其符合数据规范。此外,利用 CASE WHEN 语句,我们可以轻松表达简单的模型,在 SQL 中完成对 Iris 数据集的预测任务,并且进行精度统计。
本文涉及的所有操作均可以在 Databend Cloud(海外版)上直接体验。如果你对使用 Databend 进行数据科学分析感兴趣,也欢迎使用 Databend Cloud 上就绪的计算集群进行一步探索。