简介
标签(或注释)是识别值得建模的输入和输出的过程(不仅仅是可以建模的)。
- 使用客观作为指导来确定必要的信号。
- 探索创建新信号(通过组合特征、收集新数据等)。
- 迭代地添加更多功能以证明复杂性和努力是合理的。
过程
无论我们是否拥有自定义标签平台或选择通用平台,标签过程及其所有相关工作流程(QA、数据导入/导出等)都遵循类似的方法。
初步步骤
[WHAT]
确定需要标记的内容:
- 识别您可能已经拥有的自然标签(例如时间序列)
- 咨询领域专家以确保您标记了适当的信号
- 为您的任务确定适当的标签(和层次结构)
[WHERE]
设计标注界面:
- 直观,数据模式依赖和快速(键绑定是必须的!)
- 通过允许标注者更深入地挖掘或建议可能的标签来避免选项瘫痪
- 衡量和解决标签之间的差异
[HOW]
撰写标签说明:
- 每个标签场景的示例
- 差异的行动方针
使用Prodigy对我们的任务进行多标签文本分类(标签 + QA)
工作流程设置
- 建立数据管道:
-
[IMPORT]
用于注释的新数据 -
[EXPORT]
用于 QA、测试、建模等的注释数据。
- 创建质量保证 (QA) 工作流程:
- 与标签工作流程分开(无偏见)
- 与标签工作流程通信以升级错误
迭代设置
- 实施减少标签工作的策略
标记数据
就本课程而言,我们的数据已经被标记,因此我们将执行基本版本的 ELT(提取、加载、转换)来构建标记数据集。
- projects.csv:带有 id、创建时间、标题和描述的项目。
- tags.csv:项目的标签(标签类别),按 id。
回想一下,我们的目标是对传入的内容进行分类,以便社区可以轻松发现它们。这些数据资产将作为我们第一个模型的训练数据。
提炼
我们将从从我们的源(外部 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)
图书馆
我们可以使用用户提供的标签作为我们的标签,但是如果用户添加了错误的标签或忘记添加相关标签怎么办。为了消除对用户提供黄金标准标签的依赖,我们可以利用标签工具和平台。这些工具允许对数据集进行快速和有组织的标记,以确保其质量。而不是从头开始并要求我们的贴标者提供给定项目的所有相关标签,我们可以提供作者的原始标签并要求贴标者根据需要添加/删除。特定的标签工具可能需要定制或利用生态系统中的某些东西。
随着我们平台的增长,我们的数据集和标签需求也将增长,因此必须使用支持我们将依赖的工作流程的适当工具。
一般的
- Labelbox:用于人工智能应用程序的高质量训练和验证数据的数据平台。
- Scale AI:提供高质量训练数据的人工智能数据平台。
- Label Studio:具有标准化输出格式的多类型数据标注和注释工具。
- 通用数据工具:在简单的 Web 界面或桌面应用程序中协作和标记任何类型的数据、图像、文本或文档。
- Prodigy:Prodigy 的食谱,我们完全可编写脚本的注释工具。
- Superintendent:一个基于 ipywidget 的交互式标签工具,用于为您的数据启用主动学习。
自然语言处理
计算机视觉
- LabelImg:一个图形图像注释工具和图像中的标签对象边界框。
- CVAT:一种免费的在线交互式视频和图像注释工具,用于计算机视觉。
- VoTT:一个用于从图像和视频构建端到端对象检测模型的电子应用程序。
- makeense.ai:一个免费使用的用于标记照片的在线工具。
- remo:计算机视觉中用于注释和图像管理的应用程序。
- Labelai:一种用于标记图像的在线工具,可用于训练 AI 模型。
声音的
- Audino:用于语音活动检测(VAD)、分类、说话人识别、自动语音识别、情感识别任务等的开源音频注释工具。
- audio-annotator:用于注释和标记音频文件的 JavaScript 接口。
- EchoML:一个网络应用程序,用于播放、可视化和注释您的音频文件以进行机器学习。
各种各样的
- MedCAT:一种医学概念注释工具,可以从电子健康记录 (EHR) 中提取信息,并将其链接到 SNOMED-CT 和 UMLS 等生物医学本体。
主动学习
即使拥有强大的标签工具和成熟的工作流程,也很容易看出标签的复杂程度和成本。因此,许多团队采用主动学习来迭代地标记数据集并评估模型。
- 标记一个小的初始数据集以训练模型。
- 要求经过训练的模型对一些未标记的数据进行预测。
- 根据以下内容确定要从未标记数据中标记哪些新数据点:
- 预测类概率的熵
- 具有最低预测、校准和置信度的样本(不确定性抽样)
- 来自一组训练有素的模型的预测差异
- 重复直到达到所需的性能。
这比标记整个数据集更具成本效益和速度。
图书馆
监管薄弱
如果我们有需要标记的样本,或者我们只是想验证现有标签,我们可以使用弱监督来生成标签,而不是手动标记所有标签。我们可以通过标记函数利用弱监督来标记我们现有的和新的数据,在那里我们可以创建基于关键字、模式表达式、知识库等的结构。我们可以随着时间的推移添加到标记函数中,甚至可以减轻不同数据之间的冲突标注功能。在评估课程中,我们将使用这些标记函数来创建和评估我们的数据切片。
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
验证标签(在建模之前)的一种简单方法是使用辅助数据集中的别名来为不同的类创建标签函数。然后我们可以寻找假阳性和假阴性来识别可能被错误标记的样本。实际上,我们将在仪表板课程中实现类似的检查方法,但使用经过训练的模型作为启发式方法。
迭代
标签不仅仅是一次性事件或我们重复相同的事情。随着新数据的可用,我们将希望战略性地标记适当的样本并改进我们缺乏质量的数据切片。标记新数据后,我们可以触发工作流以启动(重新)培训过程以部署我们系统的新版本。