机器学习工程师的经验分享---第二部分-数据集

机器学习工程师的经验分享 — 第二部分:数据集

原文:towardsdatascience.com/learnings-from-a-machine-learning-engineer-part-2-the-data-sets/

第一部分中,我们讨论了收集良好的图像数据并为你的图像分类项目正确分配标签的重要性。我们还讨论了数据类别和子类别。这些概念可能看起来相当直接,但重要的是要有一个坚实的基础理解。所以,如果你还没有,请查看它。

现在我们将讨论如何构建各种数据集以及对我应用效果良好的技术。然后在下一部分中,我们将深入探讨模型评估,而不仅仅是简单的准确率。

我将再次使用动物园动物图像分类应用示例。

数据集

作为机器学习工程师,我们都熟悉训练-验证-测试集,但当我们包括在第一部分中讨论的子类别概念,以及以下讨论的概念,为每个类别的图像设置最小和最大数量,以及分阶段和合成数据,这个过程就会变得复杂一些。我不得不创建一个自定义脚本来处理这些选项。

在我们分割数据用于训练之前,我将向您介绍这些概念:

  • 图像截止值 — 图像太少会导致你的模型性能下降。太多的话,你会花费比其价值更高的时间来训练。

  • 置信度阈值 — 你的模型表明它在预测中的信心程度。让我们利用这一点来决定何时向用户展示结果。

  • 基准集 — 现实世界的数据是杂乱的,基准集应该反映这一点。这些需要将模型推到极限,并帮助我们决定何时可以投入生产。

  • 分阶段和合成数据 — 现实世界的数据是王,但有时你需要自己生成数据,甚至生成数据以开始。小心不要损害性能。

  • 重复图像 — 重复数据会扭曲你的结果,并给你一个虚假的性能感。确保你的数据多样化。

  • 构建数据集 — 合并子类别,应用截止值,并创建你的训练-验证-测试集。现在我们准备开始表演了。

图像截止值

在我的经验中,每个类别至少使用 40 张图像可以提供良好的性能。由于我喜欢将 10%用于测试集和验证集,这意味着至少需要 4 张图像来检查训练集,这感觉刚刚好。如果每个类别使用少于 40 张图像,我发现我的模型评估往往会受到影响。

在另一端,我为每个类别设置了大约 125 张图像的最大值。我发现性能提升在这个值之后往往会趋于平稳,所以拥有更多的数据将减缓训练运行,而几乎没有可展示的成果。超过最大值是可以的,这些“溢出”可以添加到测试集中,这样就不会浪费。

有时候我会将最小截止点降低到 35,没有打算将训练好的模型投入生产。相反,目的是利用这个可丢弃的模型从我的未标记集中找到更多图像。这是一个我将在第三部分中详细介绍的技术。

置信度阈值

你可能熟悉 softmax 分数。作为提醒,softmax 是分配给每个标签的概率。我喜欢将其视为置信度分数,我们感兴趣的是获得最高置信度的类别。softmax 的值在零到一之间,但我发现将置信度分数解释为零到 100 之间更容易,就像一个百分比。

为了决定模型对其预测的置信度是否足够,我选择了一个 95%的阈值。我在决定是否向用户展示结果时使用这个阈值。

超过阈值的分数更有可能是正确的,因此我可以自信地提供结果。低于阈值的分数可能不正确——实际上可能是“超出范围”,意味着这是模型不知道如何识别的东西。因此,为了避免展示错误的结果,我反而提示用户再次尝试,并提供如何拍摄“好”照片的建议。

诚然,这个截止点有些随意,你应该根据你的用例决定什么才是合适的。实际上,这个分数可能需要为每个训练好的模型进行调整,但这会使跨模型性能比较变得更加困难。

我将在第三部分的评估部分经常提到这个置信度分数。

基准集

让我介绍一下我所说的基准集,你可以将其视为扩展的测试集。这些是精心挑选的图像,旨在扩展你模型的极限,并为你的数据特定类别提供一个衡量标准。使用这些基准来证明将你的模型投入生产是合理的,并且可以提供一个客观的衡量标准向你的经理展示。

  • 困难基准—— 这些是“额外加分”的图像,就像教授在测验中添加的附加问题,以查看哪些学生是认真听课的。你需要敏锐的观察力才能区分真实情况与类似外观的类别。例如,一只在阴影中睡觉的猎豹,如果不仔细看可能会被误认为是豹子。

  • 范围外基准 — 这些是“狡猾问题”的图片。我们的模型是在动物园动物上训练的,但人们众所周知不遵守规则。例如,一位动物园游客给孩子拍了张戴着猎豹面具的照片。

  • 最常见基准 — 这些是“家常便饭”的类别,需要接近完美的分数和零错误。这将是一个决定是否投入生产的决定性基准。

  • 最少见基准 — 这些是“罕见但卓越”的类别,同样需要正确,但达到一个最低分数,比如置信度阈值。

当寻找添加到基准中的图片时,你很可能在部署的模型的真实世界图片中找到它们。参见第三部分中的评估。

对于每个基准,计算最小值、最大值、中位数和平均值分数,以及有多少图片的分数高于和低于置信度阈值。现在你可以将这些指标与当前在生产中的指标以及你的最低要求进行比较,以帮助决定新模型是否适合生产。

分阶段或合成数据

或许,任何监督式机器学习应用的最大障碍是拥有训练模型的数据。显然,“真实世界”的数据,即来自应用程序实际用户的数据是理想的。然而,你实际上无法收集这些数据,直到模型部署。这是一个鸡生蛋的问题。

一种开始的方式是让志愿者收集“分阶段”的图片供你使用,尽量模仿真实用户的行为。所以,让我们让我们的动物园工作人员四处拍照,拍动物的照片。这是一个好的开始,但会在这些图片中引入一定程度的偏差。例如,工作人员可能几天内拍照,所以你可能得不到全年的天气条件。

另一种获取图片的方式是使用计算机生成的“合成”图片。老实说,我会不惜一切代价避免这些。根据我的经验,模型在这些图片上表现不佳,因为它们看起来……不同。光线不自然,主题可能叠加在背景上,因此边缘看起来过于锐利等。当然,一些 AI 生成的图片看起来非常逼真,但如果你仔细观察,可能会发现一些不寻常之处。你模型中的神经网络会注意到这些,所以请小心。

图片

使用 Dall-E 生成的图片

我处理这些分阶段或合成图片的方式是作为一个子类,将其合并到训练集中,但仅在之后给予真实世界图片优先权。我限制分阶段图片的数量为 60,所以如果我已有 10 张真实世界图片,我现在只需要 50 张分阶段图片。最终,这些分阶段和合成图片将完全淘汰,我完全依赖真实世界的数据。

重复图片

可能会进入你的图像集的一个问题是重复图像。这些可能是图片的精确副本,或者它们可以非常相似。你可能认为这无害,但想象一下有 100 张完全相同的象图片——你的模型将不知道如何处理大象的不同角度。

现在,假设你只有两张几乎相同的图片。不是那么糟糕,对吧?好吧,这是它们可能发生的情况:

  • 两个图片都进入训练集——模型不会从重复的图像中学习任何东西,这会浪费处理它们的时间。

  • 一个进入训练集,另一个进入测试集——你的测试分数会更高,但这不是准确的评估。

  • 两者都在测试集中——你的测试分数可能会比应有的更高或更低。

这些都不会帮助你的模型。

有几种方法可以找到重复项。我采取的方法是在所有图片上计算汉明距离,并识别出非常接近的图片。我有一个显示重复项的界面,我决定哪一个是我最喜欢的,然后删除其他。

另一种方法(我还没有尝试过)是创建你图像的向量表示。将这些向量存储在向量数据库中,你可以进行相似度搜索以找到几乎相同的图像。

无论你使用什么方法,清理重复项都很重要。

构建数据集

现在,我们已经准备好构建传统的训练、验证和测试集。这不再是一个简单直接的任务,因为我想要:

  1. 将子类合并到主类中。

  2. 优先考虑真实世界的图像,而不是摆拍或合成图像。

  3. 为每个类别应用最小图像数量。

  4. 为每个类别应用最大图像数量,将“溢出”发送到测试集。

这个过程有些复杂,取决于你如何管理你的图像库。首先,我建议将你的图像保存在具有子类文件夹的文件夹结构中。你可以通过使用脚本来简单地读取文件夹来获取图像数量。其次,要保留子类合并的配置。为了真正为成功做好准备,将这些图像数量和合并规则放入数据库中以便更快地查找。

我的训练-验证-测试集分割通常是 90-10-0。我最初开始使用 80-10-10,但随着对整个数据集保持清洁的勤奋,我发现验证和测试分数变得相当均衡。这使我能够增加训练集的大小,并使用“溢出”作为测试集,以及使用基准集。

接下来…

在这部分,我们通过合并子类和使用图像数量截止值来构建我们的数据集。此外,我们还处理了摆拍和合成数据,以及清理重复图像。我们还创建了基准集并定义了置信度阈值,这有助于我们决定何时将模型移至生产环境。

第三部分中,我们将讨论我们将如何评估不同的模型性能。然后最终我们将进入实际的模型训练以及提高准确性的技术。

posted @ 2026-03-27 10:30  布客飞龙III  阅读(15)  评论(0)    收藏  举报