Python-主动机器学习-二-

44 阅读46分钟

Python 主动机器学习(二)

原文:annas-archive.org/md5/4d0971dfe04e35421f1568b6eb1214fa

译者:飞龙

协议:CC BY-NC-SA 4.0

第三部分:将主动机器学习应用于现实世界项目

第三部分 通过为读者提供理解高级主动机器学习(ML)方法的知识,并有效地将这些方法应用于现实场景,从而结束了对主动机器学习的探索。通过这些章节中讨论的先进工具,实践者将准备好应对复杂挑战,推动创新,并在他们的机器学习项目中取得显著改进。无论是通过改进评估实践还是利用强大的软件,本节旨在激发并指导读者掌握主动机器学习的艺术和科学。

本部分包括以下章节:

  • 第六章评估和提升效率

  • 第七章利用主动机器学习的工具和包

第六章:评估和提升效率

在本章中,我们将探讨严格评估主动机器学习系统性能的重要方面。我们将涵盖自动化、测试、监控和确定停止标准等各个主题。在本章中,我们将使用付费云服务,如 AWS,来演示如何在现实世界中实现自动、高效的主动学习管道。

通过彻底理解这些概念和技术,我们可以确保一个全面的主动机器学习过程,从而产生准确和可靠的结果。通过这次探索,我们将深入了解主动机器学习系统的有效性和效率,使我们能够做出明智的决定和改进。

到本章结束时,我们将涵盖以下内容:

  • 创建高效的主动机器学习管道

  • 监控主动机器学习管道

  • 确定何时停止主动机器学习运行

  • 通过主动机器学习增强生产模型监控

技术要求

对于本章,您需要以下内容:

  • MongoDB 账户:(www.mongodb.com/)

  • ClearML 账户:(app.clear.ml/)

  • GPU:您可以从您将使用的工具的网页上检查具体的硬件要求

  • 一个考虑成本因素的 EC2 实例

在本章中,您需要安装以下包:

pip install clearml
pip install pymongo

您需要以下导入:

import os
from clearml import Task, TaskTypes
import pymongo
import datetime

创建高效的主动机器学习管道

正如我们在上一章中看到的,高效的主动机器学习管道由端到端管道组成。这意味着主动机器学习算法需要能够访问未标记的数据,选择最有信息量的帧,然后将它们无缝发送到标记平台。所有这些步骤都需要依次自动进行,以减少人工干预。

此外,测试此管道以确保每个步骤正常工作至关重要。一个云托管主动机器学习管道的例子如下:

  1. 未标记的数据存储在 AWS S3 桶中。

  2. 一个主动机器学习算法在可以访问 S3 桶的 EC2 实例上运行。

  3. 主动机器学习运行的成果保存在专门用于此目的的 S3 桶中,并与用于项目的标记平台相关联。

  4. 主动机器学习运行的最后一步是将选定的帧链接到标记平台并创建注释项目,以便标记人员开始工作。

在选择和配置 EC2 实例以运行主动机器学习代码时,考虑效率是至关重要的。很可能需要 GPU 来执行推理和计算主动机器学习嵌入。例如,如果你使用 Lightly,你可以参考他们在此页面的硬件推荐(docs.lightly.ai/docs/hardware-recommendations)。此外,考虑所选 EC2 实例的成本并确定其是否符合你的预算也很重要。你可以在这里找到 AWS EC2 按需定价(aws.amazon.com/ec2/pricing/on-demand/)。当你没有运行任何主动机器学习进程时,停止实例是一种良好的做法,可以节省金钱。

其他良好实践包括拥有一个 requirements.txt 文件,列出运行所需的软件包的所有版本。例如,对于在 第五章利用主动学习处理大数据 中使用的软件包,requirements.txt 文件可能看起来是这样的。

awscli==1.31.6
ultralytics==8.0.145
lightly==1.4.23
docker==6.1.3
encord==0.1.85

你可以用所需的任何版本替换任何版本;理想情况下,使用软件包的最新版本会更好。

此外,通过参数使管道可配置可以更容易地进行扩展。例如,通过 YAML 配置文件指定选项,如采样策略、模型选择和数据源。这允许在不更改代码的情况下更改管道行为,简化工作流程的集成。作为提醒,我们已经在 第二章设计查询策略框架 中探讨了不同的采样策略,并在 第四章将主动学习应用于计算机视觉 中探讨了计算机视觉任务的模型选择。

使用我们的 Lightly 示例配置 YAML 文件的简单示例,可以参考 第五章利用主动学习处理大数据,可能看起来是这样的:

model_path_in_s3: 's3://my-models-library/my-best-object-detection-model.pt'
inference_confidence_threshold: 0.3
proportionSamples: 0.20  # 20% of the samples
isSSLenabled: true
maxSSLepochs: 20
important_classes: {"person": 0, " sports ball": 32}
balance: true
balance_strategy:{ 'person': 0.50, 'sports ball': 0.50}
videos_folder_in_s3: "test"
s3_bucket_output: 'labeling-queue'

然后,可以使用此函数访问这些参数:

def get_config_yaml(path_to_config_yaml="config.yaml"):
    # Open the YAML file
    with open(path_to_config_yaml, "r") as file:
        # Load the YAML content
        config = yaml.safe_load(file)
    file.close()
    return config

然后是以下内容:

config = get_config_yaml(path_to_config_yaml="config.yaml")
model_path_in_s3 = config["model_path_in_s3"]
inference_confidence_threshold = config["inference_confidence_threshold"]
proportionSamples = config["proportionSamples"]
isSSLenabled = config["isSSLenabled"]
if isSSLenabled:
  maxSSLepochs = config['maxSSLepochs']
important_classes = config["important_classes"]
s3_bucket_output = config["s3_bucket_output"]
balance_strategy = config['balance_strategy']
if balance_strategy:
  balance = config['balance']

这些变量可以在 第五章利用主动学习处理大数据 中使用,并将使其可扩展到所有工作流程和应用。

因此,对于你的项目,你只需要更改 YAML 文件,然后就可以使用这些脚本为所有项目服务,而无需修改脚本本身。

接下来,我们将探讨监控我们的主动机器学习运行并确保我们能够全面了解整个过程的解决方案。

监控主动机器学习管道

logging,这是一个多功能且内置的库。

引入如ClearML(clear.ml/)这样的 MLOps 平台可以显著简化管道运行的监控。ClearML 提供实时统计、图形数据可视化、广泛的日志记录、模型工件以及以并排格式比较管道运行的能力。虽然 ClearML 传统上用于提高机器学习训练和部署管道的可观察性,但它对于活跃机器学习管道也非常有效,增强了其管理和监督。

active_learning_runs and initialize a task within it, labeled testing-AL, which corresponds to a specific run. Once implemented, this configuration enables the automatic tracking of the run, as illustrated in *Figure 6**.1*, under the console tab of the ClearML project configured via this code snippet:

图 6.1 – 初始化 ClearML 运行后自动保存的控制台日志

图 6.1 – 初始化 ClearML 运行后自动保存的控制台日志

这种集成不仅简化了监控和管理机器学习运行的过程,而且还确保所有相关数据和指标都能系统地捕获并可在 ClearML 平台上进行分析:

Task.set_credentials(api_host='https://api.community.clear.ml',
                    web_host='https://app.community.clear.ml',
                    key='your_clearml_access_key',
                    secret='your_clearml_secret_key')
task = Task.init(project_name='active_learning_runs',
                task_name='testing-AL',
                task_type=TaskTypes.inference)

我们选择 ClearML 任务类型TaskTypes.inference,因为它专门设计用于促进机器学习中推理过程的全面日志记录和细致监控。此任务类型擅长细致跟踪输入数据、模型输出的预测以及一系列相关指标或性能指标,使其特别适合活跃的机器学习运行。确实,正如我们在前面的章节中看到的,活跃的机器学习运行包括进行推理以识别最有利于添加到标注队列的帧。因此,TaskTypes.inference是这里理想的选项。此任务类型对于系统地收集和彻底分析推理阶段特有的关键性能指标(如延迟)至关重要。此外,利用TaskTypes.inference使团队能够积累有关模型与实时数据交互时行为的宝贵见解——这是活跃机器学习系统成功的基本方面。对运行实时性能的详细了解对于优化活跃机器学习策略和增强整体模型效能至关重要。

监控活跃机器学习管道的另一项宝贵工具是MongoDB(www.mongodb.com/),这是一个以用户友好著称的广泛使用的数据库。其灵活性使其成为机器学习管道的理想选择,因为机器学习管道通常会随着时间的推移而演变。在活跃机器学习管道的背景下,MongoDB 可以用于自动生成标注队列,例如。MongoDB 的这种应用不仅简化了数据处理过程,还有助于提高机器学习管道的整体效率和适应性。

mongodb:
username = 'your_mongodb_username'
password = 'your_mongodb_pwd'
cluster = 'your_mongodb_cluster'
uri = 'mongodb+srv://' + username + ':' + password + '@' + cluster
client = pymongo.MongoClient(uri)

接下来,我们为这个项目创建一个特定的 MongoDB 集合,我们将命名为ml_demo_project。在这个集合中,我们将创建一个名为ml_labeling_queue_demo的表格。这种在 MongoDB 中的组织结构将有助于高效管理和检索与我们的项目相关的数据:

db = client['ml_demo_project']
collection = db['ml_labeling_queue_demo']

最后一步是将我们活跃机器学习运行得出的数据填充到我们的标注队列表中。这是一个通用示例,应针对个别项目的具体要求进行调整。通过整合这一步骤,我们确保了机器学习运行的信息被准确且高效地转移到标注队列中,为针对每个项目的独特需求进行的后续处理和分析奠定了基础:

document = {'Name dataset': 'demo',
            'Labeler': 'TBD',
            'Reviewer': 'TBD',
            'Labeling status': 'In queue',
            'Reviewing status': 'None',
            'date': datetime.datetime.now()}
collection.insert_one(document)

这个 MongoDB 集合简化了监控标注队列进度的过程,便于与标注者就即将到来的项目进行有效沟通。这种设置消除了手动输入每个新标注项目需求,显著提高了工作流程效率。通过自动化跟踪和更新队列,它确保了管理标注任务更加顺畅和协调的方法。

通过日志、MLOps 平台、数据库和其他工具进行积极监控对于保持可见性和快速捕捉生产活跃机器学习管道中的任何问题至关重要。这有助于降低风险并提高系统可靠性。

为了确保这种监控在决策过程中得到有效利用,建立明确的临界行动标准至关重要,例如确定何时停止活跃的机器学习运行,我们将在下一部分进行讨论。

确定何时停止活跃机器学习运行

主动机器学习运行是动态和迭代的进程,需要仔细监控,正如我们之前所看到的。但它们还需要战略性的决策来决定停止的最佳时机。停止活跃机器学习运行的决定至关重要,因为它会影响学习模型的表现和效率。本节重点介绍有效确定何时停止活跃机器学习运行的关键考虑因素和策略。

在主动机器学习中,为项目建立明确的性能目标是至关重要的。例如,考虑一个旨在开发面部识别系统的项目。在这里,准确率和精确率可能是选择的表现指标。一个多样化的测试集,反映了现实世界的条件和不同的面部特征,对于评估模型至关重要。

假设我们在建立的测试集上预定义的准确率阈值为 95%,而对于精确度,则为 90%。活跃的机器学习过程应继续进行,直到模型在测试集上持续达到或超过这些指标。如果模型在测试集上显示出 95%或更高的准确率和 90%或更高的精确率,这表明模型已经学会了在不同面孔和场景中很好地泛化。这种在多样化的测试集上的一致表现表明,模型已经通过主动学习过程有效地进行了调整,可以应用于现实世界。

在决定何时停止活跃的机器学习过程时,额外的考虑因素起着至关重要的作用。在先前的面部识别示例中,在决定停止活跃的机器学习过程时,有几个简单但重要的额外因素需要考虑。以下是一些在决定停止活跃的机器学习过程之前可以采取的步骤:

  • 警惕过拟合:当模型在训练数据上的表现远好于测试集时,就会发生这种情况。如果我们看到这种情况,那就是停止并调整模型以避免过拟合的时候了。

  • 考虑我们的资源:时间、计算能力和金钱等资源是有限的。即使我们的模型还没有达到我们想要的 95%的准确率或 90%的精确度,如果我们资源不足,我们可能不得不停止。

  • 注意收益递减:这意味着如果继续训练并不能真正提高我们的模型,那么它可能已经学到了它能学到的所有东西。在这种情况下继续训练它不会有所帮助。

  • 通过反馈循环持续重新评估模型:随着世界和数据的改变,我们的模型的目标可能也需要改变。定期检查我们的模型是否仍然满足我们当前的需求有助于保持其相关性和有效性。

停止活跃的机器学习运行的决策应基于达到预定义的性能指标、在多样化的测试集上保持稳定性、监控资源限制以及警惕过拟合和收益递减。通过仔细考虑这些因素,我们可以确保活跃的机器学习模型既有效又高效,与项目的总体目标保持一致。

现在让我们讨论如何在生产环境中使用主动学习。

通过活跃的机器学习增强生产模型监控

已经对活跃的机器学习有了全面的理解,本节将重点转向其在生产环境中监控机器学习模型的实际应用。用户数据和市场条件的动态性为保持部署模型的准确性和相关性带来了独特的挑战。在此背景下,活跃的机器学习成为了一个关键工具,它提供了一种主动的方法来实时识别和适应变化。本节将探讨通过哪些方法和策略可以利用活跃的机器学习来持续改进和调整模型,根据不断变化的数据来确保这些模型保持稳健、高效,并与当前趋势和用户行为保持一致。

监控生产模型的挑战

在监控生产模型时存在几个挑战。首先,我们有数据漂移和模型退化的问题。

数据漂移指的是机器学习模型输入数据随时间的变化。这种变化可能由于各种原因而发生,例如用户行为的演变、季节性效应、经济变化或模型运行环境的更广泛环境的变化。数据漂移的关键特征是当前输入数据的统计特性与原始训练数据不同,如图 6.2所示。数据漂移可能会显著影响模型的性能,因为模型最初训练时所做的假设不再成立。它可能导致准确性和可靠性的下降,使模型在做出预测或分类时变得不那么有效:

图 6.2 – 数据漂移的示意图

图 6.2 – 数据漂移的示意图

模型退化,也称为模型降级或性能衰减,指的是机器学习模型随时间推移性能的下降。这一现象与数据漂移密切相关,如图 6.3所示。模型退化的一个主要原因是模型在真实环境中遇到的数据性质发生变化:

图 6.3 – 模型随时间退化的示意图

图 6.3 – 模型随时间退化的示意图

然而,模型退化也可能由于其他因素,例如以下因素:

  • 关系变化:随着时间的推移,变量之间的关系可能会发生变化,使得模型学习到的模式过时

  • 反馈循环:如果一个模型的预测被用作影响未来数据的决策过程的一部分,它可能会创建逐渐降低模型性能的反馈循环

  • 外部因素:政策变化、自然灾害或全球事件等不可预见的外部因素也可能导致模型退化

数据漂移和模型退化都强调了在生产中对机器学习模型进行持续监控和更新的必要性。确定这些变化何时以及如何发生对于保持模型的有效性和准确性至关重要。

活跃的机器学习用于监控生产中的模型

由于主动机器学习具有动态和响应性,它特别适合对抗数据漂移和模型退化。确实,正如我们在章节中讨论的那样,主动机器学习在目标数据获取方面表现出色,能够识别和获取最具信息量的数据点。这种方法在解决数据漂移和模型退化问题时特别有利,因为算法主动查询新的数据,这些数据能够准确反映当前的环境或用户行为。这种方法不仅比被动收集大量数据集更有效率,而且确保数据的相关性,避免冗余。主动机器学习系统天生具有适应性,能够快速调整其理解和预测,以应对新的数据,这对于在数据分布变化中保持有效性至关重要。这种适应性通过系统的持续学习和改进能力得到增强。随着主动机器学习系统接收新的数据点和反馈,它们不断更新和优化其模型,从而减轻模型退化的影响,并确保模型随着数据和环境的改变而发展。

主动机器学习通过选择最具信息量的样本来解决数据标注成本高和时间密集的问题,这个过程在适应数据漂移时特别有益。在标注过程中对资源的有效利用确保了模型获得最大效益。此外,主动机器学习算法旨在早期检测数据模式的变化性能下降,作为数据漂移和模型退化的早期预警系统。这种早期检测能力允许及时采取干预措施,如模型调整或重新训练,以防止性能显著下降。

第二章《设计查询策略框架》中,我们也讨论了主动机器学习如何提供可定制的查询策略,包括不确定性采样和委员会查询,这些策略可以根据应用程序的具体需求进行定制。这种灵活性使得在应对各种场景中数据漂移和模型退化等独特挑战时,能够更加有效地做出响应,凸显了主动机器学习在动态数据环境中的全面适应性。

一旦机器学习模型部署后,早期检测漂移和退化对于维持模型的性能至关重要。主动机器学习在这里扮演着不可或缺的角色,有效地作为早期预警系统。这种能力对于在问题升级之前进行预先识别和缓解潜在问题至关重要,从而保护模型的完整性和准确性。

我们现在将探讨通过哪些机制和策略可以使用主动机器学习(ML)来实现这一目标,并强调其在动态环境中主动管理和维护机器学习模型的重要性。

在前几章中,我们已经看到了一些使用主动机器学习方法进行早期检测的机制:

  1. 不确定性采样:主动机器学习算法通常采用不确定性采样,其中模型识别出对其预测信心最低的数据点。此类点数量的突然增加可能表明底层数据分布的变化,表明可能存在数据漂移。

  2. 异常检测:主动机器学习系统可以配备异常检测功能,以识别传入数据中的异常模式。这些异常可能表明数据景观的变化,如果不加以解决,可能导致模型退化。

  3. 委员会查询:这种方法涉及维护多个模型或模型的多个版本(委员会),并使用它们的分歧来识别具有挑战性的数据点。委员会成员预测之间的差异越来越大可能表明新兴的数据漂移或模型退化,因为它表明模型对当前数据的信心越来越低。

  4. 反馈循环:在用户反馈或现实世界结果可用的情况下,主动机器学习可以使用此反馈来评估模型性能。用户反馈模式的变化可以提供早期迹象,表明数据趋势的变化或模型有效性的下降。

主动机器学习在早期问题检测方面的能力至关重要,它允许及时进行干预。这种主动策略比传统的被动方法更为有效,后者只有在性能明显下降后才会处理问题。通过早期发现问题,主动机器学习确保为模型重新训练或调整分配的资源得到高效和审慎的使用。在计算资源或标记数据稀缺的环境中,这一点尤为重要。此外,在面向最终用户的应用中,模型性能的一致性对于维持用户信任至关重要。通过早期检测和及时纠正数据漂移或模型退化,主动机器学习对提供可靠和一致的用户体验做出了重大贡献,凸显了其在维持机器学习模型在各种实际应用中的可信度和有效性的价值。

早期检测数据漂移和模型退化

在主动机器学习中,有效实施数据漂移和模型退化的早期检测需要考虑几个关键因素:

  • 选择合适的监控指标是关键。这些指标应与模型的目标以及数据和应用的独特特征紧密一致。

  • 设置合理的警报阈值也非常关键,在敏感性和实用性之间取得平衡,以避免频繁的误报或错过关键变化。

  • 将活跃的机器学习系统与现有数据管道集成对于实时监控和对检测到的问题快速响应至关重要,从而提高系统效率和响应能力。对于实际实施,这意味着将活跃的机器学习算法直接链接到用户数据的存储,使系统能够在数据上传后立即自动参与和分析新数据。这种集成确保了持续、最新的监控,这对于及时检测和处理潜在的数据漂移或模型退化至关重要。

让我们考虑一个来自零售用例的例子,具体是在库存管理中使用的计算机视觉系统的背景下。想象一家零售店使用配备计算机视觉的活跃机器学习系统进行库存管理。该系统旨在通过摄像头监控商店的货架,跟踪库存水平,检测商品库存不足的情况,并确定何时需要补货。计算机视觉模型最初是在一个图像数据集上训练的,该数据集展示了货架库存的各种状态,从满载到几乎空。它学会了识别不同的产品、它们的位置和数量。随着时间的推移,商店引入了新产品并更改了一些商品的布局。在常规监控期间,活跃的机器学习系统开始检测图像中的异常;模型遇到了不熟悉的图像,导致其预测的不确定性。这种不确定性通常反映在较低的置信度分数上,表明潜在的异常。系统还采用统计方法来识别异常值——与产品排列的既定模式显著偏离的数据点。此外,它还分析随时间的变化,将当前图像与历史数据进行比较,以发现产品类型或排列中的偏差。当系统标记出异常时,它会提醒商店经理进行进一步检查。如果变化是有意的,例如新产品的引入,则此信息用于更新和重新训练模型,确保其适应新的商店布局和库存。如果变化是无意的,例如产品放置不当,则可以纠正以保持库存的准确性。这一自适应过程确保机器学习模型在实时库存管理中保持有效性,适应零售环境的渐进和突然变化。

在本例中,活跃的机器学习系统的异常检测能力对于维持库存管理系统的有效性至关重要。它确保计算机视觉模型在商店产品范围和布局发生变化时仍能保持准确性和可靠性,从而防止模型退化并确保运营效率。

总结来说,通过关注最有信息量的数据点并整合用户反馈,主动机器学习提供了一种动态的方法来维护模型在用户数据和市场条件变化中的相关性和准确性。这种方法带来的适应性和效率对于机器学习在各种领域的长期成功至关重要。

摘要

在本章中,我们深入探讨了严格评估主动机器学习系统性能的关键方面。我们首先理解了自动化流程以增强效率和准确性的重要性。然后,章节引导我们了解各种测试方法,强调它们在确保稳健和可靠的主动机器学习管道中的作用。

我们讨论的大部分内容集中在主动机器学习管道的持续监控的重要性上。这种监控不仅涉及观察性能,还涉及理解和解释结果,以便做出数据驱动的决策。

我们讨论的最重要的主题之一是确定主动机器学习运行的适当停止标准。我们探讨了如何设置预定义的性能指标,如准确性和精确度,对于指导这些决策至关重要。我们还强调了拥有多样性和代表性的测试集的重要性,以确保模型在实际场景中的适用性。

此外,我们还讨论了需要注意过度拟合、资源限制、回报递减以及实施反馈循环的重要性。这些考虑因素在确定何时停止机器学习运行以及确保模型在不断变化的环境中的整体成功和相关性方面发挥着关键作用。

最后,我们确定主动机器学习在监控生产环境中的模型方面非常擅长。其应用范围包括早期检测数据漂移和模型退化,尤其是在无缝集成到用户数据管道时。这种集成使得主动机器学习系统能够监控数据,确保任何偏差或异常都能被及时连续地检测到。此外,系统可以配置为在出现这些不规则性时触发警报,以便立即关注并采取行动。这种能力不仅增强了模型的可靠性和准确性,还确保了其在不断变化的数据景观面前具有适应性和弹性,使主动机器学习成为生产模型监控的有力工具。

在下一章,利用工具和包进行主动机器学习中,我们将关注在主动机器学习中常用到的各种 Python 库、框架和工具。我们将对这些资源进行概述,强调它们在实现各种主动机器学习技术中的价值。这将为您提供提升您的主动机器学习项目所需的知识和技能,并帮助您确定最适合它们的工具。这一章承诺将成为当前主动机器学习工具的全面指南。

第七章:利用主动机器学习的工具和包

在本章中,我们将讨论一系列在主动机器学习中常用的 Python 库、框架和工具。这些资源对于实现各种主动机器学习技术至关重要。本章的内容旨在为不同水平的专家提供信息丰富且实用的内容,从初学者到经验丰富的程序员。目标是提供对我们将要涵盖的工具的坚实基础理解,以便有效地将主动机器学习技术融入您的项目中。

在本章中,重点将放在理解主动机器学习的 Python 包上。我们将使用流行的 Python 库scikit-learnmodAL。您将了解它们的特性以及它们如何应用于主动机器学习场景。我们还将探索一系列主动机器学习工具。除了本书前几节中涵盖的工具外,本章还将介绍一些额外的主动机器学习工具。每个工具都将提供其特性和潜在应用的概述,帮助您了解它们如何适应不同的主动机器学习环境。

在本章中,我们将讨论以下主题:

  • 掌握用于增强主动机器学习的 Python 包

  • 熟悉主动机器学习工具

技术要求

对于本章的练习,您需要安装以下包:

pip install scikit-learn
pip install modAL-python

您将需要以下导入:

from sklearn.cluster import KMeans
from sklearn.linear_model import LogisticRegression
from sklearn.utils import shuffle
import numpy as np
import random
from modAL.models import ActiveLearner, Committee
from sklearn.ensemble import RandomForestClassifier
from modAL.uncertainty import uncertainty_sampling
import os
from PIL import Image
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from modAL.disagreement import vote_entropy_sampling

掌握用于增强主动机器学习的 Python 包

本节提供了两个广受欢迎的 Python 包的全面概述,这些包以其在促进主动机器学习方面的能力而闻名:scikit-learn,一个功能丰富且用户友好的库,在机器学习社区中是基础性的,因为它拥有广泛的传统机器学习工具。另一方面,专门为主动机器学习设计的modAL,建立在scikit-learn的强大框架之上,引入了更动态、数据高效的机器学习技术。这两个包共同代表了一个强大的工具包,供那些希望利用主动机器学习方法优势的人使用。

scikit-learn

虽然不是专门为主动机器学习设计的,但scikit-learnscikit-learn.org/stable/index.html)是 Python 机器学习生态系统中的基础包。它提供了一系列算法和工具,这些工具通常与主动机器学习包一起使用——一个用于分类、回归、聚类和降维的算法集合。它还提供了模型评估和数据预处理的工具。

scikit-learn通常用作模型开发的基础,并且经常与主动机器学习包集成以进行模型训练和评估。

例如,scikit-learn可以通过根据购买行为、人口统计和参与度指标对客户进行聚类,在营销中执行客户细分。scikit-learn中流行的 K-means 聚类算法有助于识别用于针对性营销活动的不同客户群体。通过迭代改进聚类模型,可以结合活跃机器学习。例如,营销分析师可以对聚类算法不确定的模糊案例进行标记,随着时间的推移提高模型的准确性。

让我们用一个模拟示例来说明这一点。

首先,我们使用KMeans进行初始聚类。我们首先定义一些模拟客户数据(年龄,年收入):

X = np.array([[34, 20000], [42, 30000], [23, 25000], [32, 45000], 
    [38, 30000]])

然后我们使用KMeans进行聚类:

kmeans = KMeans(n_clusters=2, random_state=0).fit(X)

然后,我们预测每个客户的聚类:

clusters = kmeans.predict(X)

我们已经根据年龄和年收入将客户分为两个聚类。

接下来,我们设置活跃机器学习部分。假设我们有一个更大的、未标记的客户特征数据集X_unlabeled。在我们的客户细分场景中使用KMeans时,未标记数据将包括具有与我们用于聚类的相同特征(在我们的案例中是年龄和年收入)的客户记录,但没有分配的聚类标签。这些数据是我们将在活跃机器学习框架中应用和改进聚类和分类模型的数据:

X_unlabeled = np.array([[28, 22000], [45, 55000], [37, 35000], 
    [50, 48000], [29, 27000], [41, 32000]])

我们需要一个模型(一个分类器)来对这个未标记的数据进行预测。为了说明,让我们使用一个简单的分类器LogisticRegression。我们初始化这个分类器,并使用聚类作为标签,在我们的初始数据集(X)上对其进行训练:

classifier = LogisticRegression()
classifier.fit(X, clusters)

然后我们实现活跃机器学习循环。在每次迭代中,分类器对未标记数据进行标签预测。首先,我们需要创建一个obtain_labels占位符函数,用于获取所选数据点的真实标签。在实际场景中,此函数将涉及获取实际标签的过程,例如进行调查或专家分析。由于我们正在创建一个模拟示例,我们设计这个函数以基于某些假设逻辑随机分配标签:

def obtain_labels(data):
    return np.random.choice([0, 1], size=len(data))

对于我们的活跃机器学习循环,我们需要选择我们想要进行的迭代次数以及每次迭代中要标记的样本数量:

num_iterations = 10
num_to_label = 2

我们现在可以创建我们的活跃机器学习循环,它将执行以下操作:

  1. 选择分类器最不自信的实例。

  2. 获取这些实例的真实标签(在实际操作中,这可能涉及手动标记或额外数据收集)。

  3. 使用这些新标签更新分类器。

  4. 定期使用新标记的数据更新KMeans模型,以细化客户细分。

以下是一个代码片段,帮助我们实现这一点:

for iteration in range(num_iterations):
    if len(X_unlabeled) == 0:
        break  # No more data to label
    # Predict on unlabeled data
    predictions = classifier.predict_proba(X_unlabeled)
    uncertainty = np.max(predictions, axis=1)
    # Select num_to_label instances with least confidence
    uncertain_indices = np.argsort(uncertainty)[:num_to_label]
    # Obtain labels for these instances
    new_labels = obtain_labels(X_unlabeled[uncertain_indices])
    # Update our dataset
    X = np.vstack([X, X_unlabeled[uncertain_indices]])
    clusters = np.hstack([clusters, new_labels])
    # Re-train classifier and KMeans
    classifier.fit(X, clusters)
    kmeans.fit(X)
    print(f"Iteration {iteration+1}, Labeled Data: {
        X_unlabeled[uncertain_indices]} with Labels: {new_labels}")
    # Remove labeled instances from unlabeled data
    X_unlabeled = np.delete(X_unlabeled, uncertain_indices, axis=0)
    # Shuffle unlabeled data to avoid any order bias
    X_unlabeled = shuffle(X_unlabeled)

上述代码返回以下结果:

Iteration 1, Labeled Data: [[45 55000] [29 27000]] with Labels: [0 1]
Iteration 2, Labeled Data: [[37 35000] [28 22000]] with Labels: [1 1]
Iteration 3, Labeled Data: [[41 32000] [50 48000]] with Labels: [0 0]

我们的活动机器学习循环迭代指定次数,每次选择分类器做出的最不自信的预测,为这些实例获取标签,然后使用新数据更新分类器和KMeans模型。记住,obtain_labels函数是一种简化。在实际应用中,获取标签将涉及一个预言者手动标记样本,正如我们在第三章中描述的,在循环中管理人类

modAL

scikit-learn。它允许轻松地将活动学习策略集成到现有的机器学习工作流程中。它提供了各种活动机器学习策略,如不确定性采样和委员会查询。它还支持自定义查询策略,并易于与scikit-learn模型集成。

例如,它非常适合图像分类和回归等任务,在这些任务中,活动机器学习可以有效地选择用于注释的信息性样本。

让我们看看一个例子,其中我们使用流行的torchvision数据集对图像进行分类。鉴于图像的大量,活动机器学习可以帮助优先考虑哪些图像应该手动标记。我们将使用modAL框架的不确定性采样查询策略。它将能够识别最有信息量的图像(分类器最不确定的图像)并对其进行标记查询。

我们实现了一个load_images函数来从数据集目录中读取图像,然后我们将它们转换为灰度图并展平图像以进行训练。实际上,我们需要将图像数据转换为与RandomForest兼容的格式,因此每个图像(一个二维数组)被展平成一个一维数组。这意味着将图像转换成一个像素值的长时间向量。对于我们的 32x32 像素的灰度图像,展平形式将是一个包含 1,024 个元素的向量(32x32):

def load_data():
    # Define the transformation
    transform = transforms.Compose([
        transforms.ToTensor(),  # Convert images to PyTorch tensors
    ])
        # Load the CIFAR10 dataset
    dataset = CIFAR10(root='data', train=True, download=True, 
        transform=transform)
    # Load all data into memory (for small datasets)
    dataloader = DataLoader(dataset, batch_size=len(dataset), 
        shuffle=False)
    data_iter = iter(dataloader)
    images, labels = next(data_iter)
    # Convert images and labels to numpy arrays
    X_all = images.numpy()
    y_all = np.array(labels)
    # Convert images from 3D to 1D (batch_size, 3, 32, 32) -> (batch_size, 3072) for RandomForest
    X_all = X_all.reshape(X_all.shape[0], -1)
    # Map numerical labels to string labels
    class_names = dataset.classes
    y_all = np.array([class_names[label] for label in y_all])
    return X_all, y_all

接下来,为了我们的示例,我们将数据集分为初始标记数据(图像存储在X_initial中,标签存储在y_initial中)和未标记数据(X_unlabeled):

X_initial, X_unlabeled, y_initial, _ = train_test_split(X_all, y_all, 
    test_size=0.75, random_state=42)

我们以 12,500 个标记图像和 37,500 个未标记图像开始我们的示例。

然后我们初始化modAL活动学习器:

learner = ActiveLearner(
    estimator=RandomForestClassifier(),
    query_strategy=uncertainty_sampling,
    X_training=X_initial_flat, y_training=y_initial
)
ActiveLearner object is created. This learner uses RandomForestClassifier as its estimator. RandomForest is a popular ensemble learning method for classification, which operates by constructing multiple decision trees during training and outputting the class that is the mode of the classes of the individual trees. The query strategy is set to X_initial_flat initial training data and y_training labels are provided to the learner.

最后,我们使用以下五次迭代循环模拟标签的查询:

for i in range(5):
    query_idx, _ = learner.query(X_unlabeled)
    actual_label = y_all[query_idx[0]] 
    print(f"Selected unlabeled query is sample number {query_idx[0]}. Actual label: {actual_label}")
    learner.teach(X_unlabeled[query_idx].reshape(1, -1), actual_label.reshape(1,))
    X_unlabeled = np.delete(X_unlabeled, query_idx, axis=0)
    y_all = np.delete(y_all, query_idx)

前面的循环返回以下内容:

Selected unlabeled query is sample number 3100\. Actual label: cat
Selected unlabeled query is sample number 7393\. Actual label: deer
Selected unlabeled query is sample number 4728\. Actual label: horse
Selected unlabeled query is sample number 447\. Actual label: deer
Selected unlabeled query is sample number 17968\. Actual label: bird

循环代表五次活动机器学习迭代。在每次迭代中,模型查询数据集以标记新实例。学习者查询X_unlabeled训练数据,并返回它最不确定的样本的query_idx索引和query_instance实例。然后,使用查询的实例对学习者进行教学。在现实世界场景中,这一步将涉及从预言者(如人类注释员)那里获取查询实例的标签。然而,在这个模拟示例中,标签直接从y_all数据集中获取。

这个例子说明了使用 modAL 进行主动机器学习的过程,其中模型主动查询特定的实例进行学习,而不是从静态数据集中被动学习。

modAL 是一个优秀的 Python 包,它允许我们轻松实现复杂的主动机器学习方法。例如,让我们使用 modAL 包创建一个主动机器学习的用例,特别关注 基于委员会 的算法。在这个例子中,我们将使用一个分类器委员会从未标记数据集中查询最有信息量的样本。作为提醒,我们在 第二章*,设计查询策略框架* 中定义了 委员会查询方法

在这个例子中,让我们使用 Iris 数据集(Fisher, R. A.. (1988). Iris. UCI Machine Learning Repository doi.org/10.24432/C56C76),这是分类任务中常用的选择。Iris 数据集是机器学习和统计学中的一个经典数据集,常用于演示分类算法。该数据集包含 150 个鸢尾花样本。每个样本有四个特征:花瓣长度、花瓣宽度、花萼长度和花萼宽度。这些特征是鸢尾花植物相应部分的厘米测量值。数据集中有三种(类别)鸢尾花植物:Iris setosa、Iris virginica 和 Iris versicolor。每个类别有 50 个样本,使得数据集在三个类别之间均衡。使用 Iris 数据集的典型任务是多类分类问题。目标是根据花萼和花瓣的测量值预测鸢尾花植物的物种。

我们将使用一个 K-Nearest Neighbors 分类器委员会。该委员会将使用 委员会查询(QBC)策略 来选择意见分歧最大的数据点。

我们首先加载 Iris 数据集(来自 scikit-learn 提供的数据集),并创建一个初始的小型标记数据集和一个较大的未标记数据集:

X, y = load_iris(return_X_y=True)
X_labeled, X_unlabeled, y_labeled, y_unlabeled = train_test_split(
    X, y, test_size=0.9, random_state=42)

我们初始化了二十个 ActiveLearner 实例,每个实例都使用一个 RandomForestClassifier,并将它们组合成一个 Committee

n_learners = 20
learners = [ActiveLearner(
        estimator=RandomForestClassifier(), X_training=X_labeled, \
        y_training=y_labeled
    ) for _ in range(n_learners)]
committee = Committee(learner_list=learners, 
    query_strategy=vote_entropy_sampling)

主动机器学习循环使用 vote_entropy_sampling 策略来选择委员会成员意见分歧最大的样本。

下面是我们的主动机器学习循环在五次迭代中的样子:

n_queries = 5
for idx in range(n_queries):
    query_idx, query_instance = committee.query(X_unlabeled)
    print(f"\nSelected unlabeled query is sample number {query_idx}. We simulate labeling this sample which is labeled as: {y_unlabeled[query_idx]}")
    committee.teach(X_unlabeled[query_idx], y_unlabeled[query_idx])
    # Remove the queried instance from the pool
    X_unlabeled = np.delete(X_unlabeled, query_idx, axis=0)
    y_unlabeled = np.delete(y_unlabeled, query_idx)
    print(f"Number of unlabeled samples is {len(X_unlabeled)}")
    # Calculate and print committee score
    committee_score = committee.score(X, y)
    print(f"Iteration {idx+1}, Committee Score: {committee_score}")

Committee 对象的 query 方法用于从未标记的 X_unlabeled 数据集中选择最有信息量的样本。该委员会由多个学习者组成,使用其内部的查询策略 vote_entropy_sampling 来确定在 X_unlabeled 中它认为对学习最有价值的实例。

每次迭代中选择的样本用于教导(重新训练)所有委员会的学习者。每次查询后,评估委员会的性能:

Selected unlabeled query is sample number [8]. We simulate labeling this sample which is labeled as: [0]
Number of unlabeled samples is 129
Iteration 1, Committee Score: 0.96
Selected unlabeled query is sample number [125]. We simulate labeling this sample which is labeled as: [2]
Number of unlabeled samples is 128
Iteration 2, Committee Score: 0.9466666666666667
Selected unlabeled query is sample number [42]. We simulate labeling this sample which is labeled as: [2]
Number of unlabeled samples is 127
Iteration 3, Committee Score: 0.9466666666666667
Selected unlabeled query is sample number [47]. We simulate labeling this sample which is labeled as: [1]
Number of unlabeled samples is 126
Iteration 4, Committee Score: 0.9733333333333334
Selected unlabeled query is sample number [95]. We simulate labeling this sample which is labeled as: [1]
Number of unlabeled samples is 125
Iteration 5, Committee Score: 0.9733333333333334

这个例子演示了如何使用modAL中的学习者委员会通过查询最有信息量的样本来主动提高模型性能。委员会的多样化意见有助于选择对学习更有信息量的样本,从而更有效地提高整体模型。例如,我们在输出中观察到,委员会的分数从 0.96 提高到 0.973。

在主动机器学习中,特别是在使用如前例所示的基于委员会的方法时,通常期望模型的性能(或在这种情况下,模型的委员会)会随着迭代而提高。这种改进是预期的,因为委员会正在被训练以越来越有信息量的样本,这些样本是根据委员会的不确定性或分歧选择的。

然而,有几个要点值得注意:

  • 增量改进:性能的提高可能不是线性的或在整个迭代过程中都是一致的。在某些迭代中,模型可能显著改进,而在其他迭代中,改进可能很小甚至停滞。我们可以从我们的例子中看到这一点,其中委员会的分数从 0.96 降至 0.94,然后又回升到 0.973。

  • 取决于数据和模型:改进的速度和一致性取决于数据的性质和学习算法的有效性。对于某些数据集或配置,改进可能快速且一致,而对于其他数据集,改进可能较慢或不可预测。

  • 递减回报:随着最有信息量的样本被添加到训练集中,剩余的无标签样本可能变得不那么有信息量,导致在后续迭代中性能改进的递减回报。

  • modAL函数默认使用准确率(accuracy)作为衡量委员会综合预测与真实标签一致性的指标。随着委员会接触到更多数据的有代表性样本,其预测应该变得更加准确。

  • 评估方法:评估委员会表现的方法也可能影响感知到的改进。如果评估是在静态测试集上进行的,改进可能更为明显。然而,如果评估是在训练集上进行的(包括新添加的样本),由于数据复杂性的增加或方差的变化,改进可能不那么明显。

总结来说,虽然在一个迭代周期内委员会性能分数的增加在主动机器学习中是一个常见的期望,但实际的改进模式可能因各种因素而异。定期监控和调整可能有必要,以确保主动机器学习过程产生预期的结果,正如我们在第六章评估和 提高效率中看到的。

选择合适的 Python 包进行主动机器学习取决于手头任务的特定要求,包括数据类型、所使用的机器学习模型和期望的主动学习策略。有效地整合这些包可以提高数据标注的效率、加快模型收敛速度,并整体提高机器学习模型的表现。

接下来,我们将探讨可以轻松用于对未标记数据进行主动机器学习的工具,如 Encord Active、Lightly、Cleanlab、Voxel51 和 UBIAI。

熟悉主动机器学习工具

在整本书中,我们介绍了讨论了几个关键的主动机器学习工具和标注平台,包括 Lightly、Encord、LabelBox、Snorkel AI、Prodigy、modAL和 Roboflow。为了进一步加深你的理解并帮助你选择最适合你特定项目需求的最合适的工具,让我们带着更深入的见解重新审视这些工具,并介绍一些额外的工具:

  • scikit-learn。它因其广泛的查询策略而脱颖而出,这些策略可以根据不同的主动机器学习场景进行定制。无论你是在处理分类、回归还是聚类任务,modAL都提供了一个强大且直观的界面,用于实现主动学习工作流程。

  • Label Studio (docs.humansignal.com/guide/active_learning.html?__hstc=90244869.a32555b92661e36e5f4b3b8a0f2cc99a.1706210819596.1706210819596.1706210819596.1&__hssc=90244869.2.1706210819596&__hsfp=3755259113&_gl=1*1i1r2ib*_ga*MTE1NzM0NDQ4Ny4xNzA2MjEwODE5*_ga_NQELN45JRH*MTcwNjIxMDgxOS4xLjEuMTcwNjIxMDgzNC4wLjAuMA): 一个开源的多类型数据标注工具,Label Studio 在适应不同形式的数据方面表现出色,包括文本、图像和音频。它允许将机器学习模型集成到标注过程中,从而通过主动机器学习提高标注效率。其灵活性扩展到可定制的标注界面,使其适用于数据标注的广泛应用。

  • Prodigy (prodi.gy/):Prodigy 提供了一种独特的主动机器学习和人机交互方法的结合。它是一个高效的标注工具,尤其适用于精炼 NLP 模型的训练数据。它的实时反馈循环允许快速迭代和模型改进,使其成为需要快速适应和精确数据标注的项目的一个理想选择。

  • Lightly(www.lightly.ai/): 专注于图像数据集,Lightly 使用主动机器学习来识别训练中最具代表性和多样化的图像集。这确保了模型在平衡和多样化的数据集上训练,从而提高了泛化能力和性能。Lightly 对于数据丰富但标注资源有限的项目特别有用。

  • Encord Active (encord.com/active): Encord Active 专注于图像和视频数据的主动机器学习,集成在一个全面的标注平台中。它通过识别和优先处理最有信息量的样本来简化标注流程,从而提高效率并减少人工标注的工作量。这个平台对于大规模计算机视觉项目特别有益。

  • Cleanlab (cleanlab.ai/): Cleanlab 以其在数据集中检测、量化并纠正标签错误的能力而脱颖而出。这种能力对于主动机器学习至关重要,因为标注数据的质量直接影响模型性能。它提供了一种确保数据完整性的系统方法,这对于训练稳健和可靠的模型至关重要。

  • Voxel51 (voxel51.com/blog/supercharge-your-annotation-workflow-with-active-learning): 专注于视频和图像数据,Voxel51 提供了一个优先处理标注最有信息量数据的主动机器学习平台。这增强了标注工作流程,使其更加高效和有效。该平台特别擅长处理复杂的大型视频数据集,提供强大的视频分析和机器学习工具。

  • UBIAI (ubiai.tools/active-learning-2): UBIAI 是一个专注于文本标注并支持主动机器学习的工具。它通过简化标注工作流程来简化训练和部署 NLP 模型的过程。其主动机器学习能力确保最有信息量的文本样本被优先标注,从而在更少的标注示例中提高模型准确性。

  • Snorkel AI (snorkel.ai): 以其创建、建模和管理训练数据的创新方法而闻名,Snorkel AI 使用一种称为弱监督的技术。这种方法结合了各种标注来源,以减少对大量标注数据集的依赖,补充主动机器学习策略以创建高效的训练数据管道。

  • Deepchecks (deepchecks.com/importance-of-active-learning-in-machine-learning): Deepchecks 提供了一套在主动机器学习环境中至关重要的验证检查。这些检查确保了数据集和模型的质量和多样性,从而促进了更准确、更稳健的机器学习系统的开发。它是维护数据完整性和模型可靠性在整个机器学习生命周期中的必备工具。

  • LabelBox (labelbox.com/guides/the-guide-to-getting-started-with-active-learning): 作为一款全面的数据标注平台,LabelBox 在管理整个数据标注流程方面表现出色。它提供了一套创建、管理和迭代标注数据的工具,适用于各种数据类型,如图像、视频和文本。其对主动学习方法的支撑进一步提高了标注过程的效率,使其成为大规模机器学习项目的理想选择。

  • Roboflow (docs.roboflow.com/api-reference/active-learning): 专为计算机视觉项目设计,Roboflow 简化了图像数据准备的过程。它对于涉及图像识别和目标检测的任务尤其有价值。Roboflow 专注于简化图像数据准备、标注和管理,使其成为计算机视觉领域团队和个人不可或缺的资源。

此扩展列表中的每个工具都为机器学习项目带来了独特的功能,解决了特定挑战。从图像和视频标注到文本处理和数据完整性检查,这些工具提供了通过主动机器学习策略提高项目效率和效果所必需的功能。

摘要

本章全面探讨了各种对主动机器学习至关重要的 Python 库、框架和工具。通过深入了解流行的库如scikit-learnmodAL的复杂性,我们探讨了它们的性能以及如何在主动机器学习场景中有效地应用。此外,本章还通过介绍一系列其他主动机器学习工具,每个工具都有其独特的特性和潜在应用,扩展了您的工具箱。

不论你是刚开始在主动机器学习领域迈出第一步的新手,还是寻求提升技能的经验丰富的程序员,本章旨在为你提供主动机器学习工具和技术的坚实基础。在这里获得的知识不仅仅是理论性的;它是一份实用指南,帮助你掌握增强主动机器学习的 Python 包,并熟悉广泛的主动机器学习工具。这种理解将使你能够为特定的机器学习项目选择并应用最合适的工具,从而提高模型的高效性和有效性。

恭喜!你已经到达了本书的结尾。但请记住,你只是在主动机器学习的世界中开始了你的旅程。随着你在机器学习旅程中不断前进,请记住,主动机器学习的领域正在不断演变。了解新的发展、工具和技术将是保持你在工作中保持前沿方法的关键。本章涵盖的工具和概念为在令人兴奋且动态的主动机器学习领域中进一步探索和创新提供了坚实的基础。