标签(或注释)是识别值得建模的输入和输出的过程(不仅仅是可以建模的)。
无论我们是否拥有自定义标签平台或选择通用平台,标签过程及其所有相关工作流程(QA、数据导入/导出等)都遵循类似的方法。
[WHAT]
确定需要标记的内容:
[WHERE]
设计标注界面:
[HOW]
撰写标签说明:
使用Prodigy对我们的任务进行多标签文本分类(标签 + QA)
[IMPORT]
用于注释的新数据[EXPORT]
用于 QA、测试、建模等的注释数据。
就本课程而言,我们的数据已经被标记,因此我们将执行基本版本的 ELT(提取、加载、转换)来构建标记数据集。
在我们的数据堆栈和编排课程中,我们将构建一个现代数据堆栈并通过 DataOps 工作流以编程方式交付高质量数据。
回想一下,我们的目标是对传入的内容进行分类,以便社区可以轻松发现它们。这些数据资产将作为我们第一个模型的训练数据。
我们将从从我们的源(外部 CSV 文件)中提取数据开始。传统上,我们的数据资产将在数据库、仓库等中存储、版本化和更新。稍后我们将详细了解这些不同的数据系统,但现在,我们将把数据加载为独立的 CSV 文件。
import pandas as pd
id | created_on | title | description | |
---|---|---|---|---|
0 | 6 | 2020-02-20 06:43:18 | Comparison between YOLO and RCNN on real world... | Bringing theory to experiment is cool. We can ... |
1 | 7 | 2020-02-20 06:47:21 | Show, Infer & Tell: Contextual Inference for C... | The beauty of the work lies in the way it arch... |
2 | 9 | 2020-02-24 16:24:45 | Awesome Graph Classification | A collection of important graph embedding, cla... |
3 | 15 | 2020-02-28 23:55:26 | Awesome Monte Carlo Tree Search | A curated list of Monte Carlo tree search papers... |
4 | 19 | 2020-03-03 13:54:31 | Diffusion to Vector | Reference implementation of Diffusion2Vec (Com... |
我们还将为我们的项目加载标签(标签类别)。
# Extract tags
TAGS_URL = "https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/tags.csv"
tags = pd.read_csv(TAGS_URL)
tags.head(5)
id | tag | |
---|---|---|
0 | 6 | computer-vision |
1 | 7 | computer-vision |
2 | 9 | graph-learning |
3 | 15 | reinforcement-learning |
4 | 19 | graph-learning |
应用基本转换来创建我们的标记数据集。
# Join projects and tags
df = pd.merge(projects, tags, on="id")
df.head()
id | created_on | title | description | tag | |
---|---|---|---|---|---|
0 | 6 | 2020-02-20 06:43:18 | Comparison between YOLO and RCNN on real world... | Bringing theory to experiment is cool. We can ... | computer-vision |
1 | 7 | 2020-02-20 06:47:21 | Show, Infer & Tell: Contextual Inference for C... | The beauty of the work lies in the way it arch... | computer-vision |
2 | 9 | 2020-02-24 16:24:45 | Awesome Graph Classification | A collection of important graph embedding, cla... | graph-learning |
3 | 15 | 2020-02-28 23:55:26 | Awesome Monte Carlo Tree Search | A curated list of Monte Carlo tree search papers... | reinforcement-learning |
4 | 19 | 2020-03-03 13:54:31 | Diffusion to Vector | Reference implementation of Diffusion2Vec (Com... | graph-learning |
df = df[df.tag.notnull()] # remove projects with no tag
最后,我们将在本地加载转换后的数据,以便我们可以将其用于我们的机器学习应用程序。
# Save locally
df.to_csv("labeled_projects.csv", index=False)
我们可以使用用户提供的标签作为我们的标签,但是如果用户添加了错误的标签或忘记添加相关标签怎么办。为了消除对用户提供黄金标准标签的依赖,我们可以利用标签工具和平台。这些工具允许对数据集进行快速和有组织的标记,以确保其质量。而不是从头开始并要求我们的贴标者提供给定项目的所有相关标签,我们可以提供作者的原始标签并要求贴标者根据需要添加/删除。特定的标签工具可能需要定制或利用生态系统中的某些东西。
随着我们平台的增长,我们的数据集和标签需求也将增长,因此必须使用支持我们将依赖的工作流程的适当工具。
即使拥有强大的标签工具和成熟的工作流程,也很容易看出标签的复杂程度和成本。因此,许多团队采用主动学习来迭代地标记数据集并评估模型。
这比标记整个数据集更具成本效益和速度。
如果我们有需要标记的样本,或者我们只是想验证现有标签,我们可以使用弱监督来生成标签,而不是手动标记所有标签。我们可以通过标记函数利用弱监督来标记我们现有的和新的数据,在那里我们可以创建基于关键字、模式表达式、知识库等的结构。我们可以随着时间的推移添加到标记函数中,甚至可以减轻不同数据之间的冲突标注功能。在评估课程中,我们将使用这些标记函数来创建和评估我们的数据切片。
from snorkel.labeling import labeling_function
@labeling_function()
def contains_tensorflow(text):
condition = any(tag in text.lower() for tag in ("tensorflow", "tf"))
return "tensorflow" if condition else None
验证标签(在建模之前)的一种简单方法是使用辅助数据集中的别名来为不同的类创建标签函数。然后我们可以寻找假阳性和假阴性来识别可能被错误标记的样本。实际上,我们将在仪表板课程中实现类似的检查方法,但使用经过训练的模型作为启发式方法。
标签不仅仅是一次性事件或我们重复相同的事情。随着新数据的可用,我们将希望战略性地标记适当的样本并改进我们缺乏质量的数据切片。标记新数据后,我们可以触发工作流以启动(重新)培训过程以部署我们系统的新版本。