【手把手】如何使用置信学习cleanlab对数据集进行去噪

开源代码

https://gitee.com/qq874455953/cleanlab_nlp_keras/
目前可能是数据集选的不好, 数据集本身没什么噪声 所以有点小问题 不过总体框架是搭建起来的

前言

在做一个项目的时候,发现数据集噪声非常多,项目是是一个文本分类问题, 但是数据集中经常出现 label 错误的情况, 也就是所谓的

label noise问题,在这样的数据集对模型进行训练效果非常差。关于label noise感兴趣可以看 Noisy Label 20 篇论文纵览 ,也是一个研究的热门方向,且对于工业界意义很大。

笔者在经过一些相关的调研之后, 从实现难度,教程数量, 原理理解这些方面角度,最终选取置信学习这种方式对数据集合进行去噪

置信学习相关介绍

那什么是置信学习呢?这个概念来自一篇由MIT和Google联合提出的paper:《Confident Learning: Estimating Uncertainty in Dataset Labels[1] 》。论文提出的置信学习(confident learning,CL是一种新兴的、具有原则性的框架,以识别标签错误、表征标签噪声并应用于带噪学习(noisy label learning)

置信学习主要包括3个部分

  • Count:估计噪声标签和真实标签的联合分布
  • Clean:找出并过滤掉错误样本
  • Re-training:过滤错误样本后,重新训练

其中count 阶段

  • 可以理解为 找到 可能是噪声的集合,

  • 如何判断是否可能为噪声 则是根据是否大于平均概率得到的,

  • 平均概率则是所有label 为class a 的平均概率

    例子:在这里插入图片描述

类别0的平均概率则是mean([0.9 , 0.9, 0.5, 0.3, 0.3])

所以我们进行置信学习 需要的有

  1. 每个样本在每个类别的概率 —> count 阶段用
  2. 每个样本实际属于哪个类别 —> count 阶段用

Clean阶段则是

  • 对于Count 阶段得到的 不可信集合中 以一定的策略进行可信度排序
  • 然后根据顺序取出最不可信的样本
  • 文章给了5种策略 感兴趣可以阅读https://zhuanlan.zhihu.com/p/146557232 这个作者的例子举的很好

置信学习开源工具:cleanlab

作者对这个置信学习框架进行了开源, 地址如下

https://github.com/cgnorthcutt/cleanlab

文档地址如下:

https://l7.curtisnorthcutt.com/cleanlab-python-package

我们就是通过cleanlab 工具 对带躁数据集合进行去噪声

实战

鉴于网上都没有给出完整的一个置信学习流程, 而且有的话也是非常简略, 什么参数都不告诉你怎么来的,特别是基于tensorflow pytorch kears 深度学习框架 则是完全没有,唯一的一个详细的教程竟然需要收费。 作者靠着自己的摸索,给出一个相对完整的教程,一起相互需学习。本文是使用keras 搭建的神经网络模型

如何去噪

官方原话: 我们使用cheanlab。只需要一行代码即可对数据进行去噪

这一行代码如下

# Compute psx (n x m matrix of predicted probabilities) 
#     in your favorite framework on your own first, with any classifier.
# Be sure to compute psx in an out-of-sample way (e.g. cross-validation)
# Label errors are ordered by likelihood of being an error.
#     First index in the output list is the most likely error.
from cleanlab.pruning import get_noise_indices

ordered_label_errors = get_noise_indices(
    s=numpy_array_of_noisy_labels,
    psx=numpy_array_of_predicted_probabilities,
    sorted_index_method='normalized_margin', # Orders label errors
 )

numpy_array_of_noisy_labels : 每个样本实际属于哪个类别

numpy_array_of_predicted_probabilities: 模型预测每个样本在每个类别的概率

sorted_index_method: 选择是否是噪声数据的策略

1. 安装cleanlab

Pip install cleanlab

2. 计算概率

这里就学问大了, 如何计算每个样本的概率呢, 原文的说法是进行K轮交叉验证

K轮交叉验证的具体意思则是

  • 把数据分为K份(这里我使用的是5。最好大于5)
  • 其中选一份为测试集, 其余K-1份为 训练集,训练一个模型
  • 把测试集 输入 训练的模型, 得到测试集每个样本的预测每个类的概率 得到我们需要的 每个样本在每个类别的概率
  • 测试集 每个样本 自身的label 则是 每个样本实际属于哪个类别

这样通过K轮交叉验证 我们得到了工具包所需的所有参数,具体怎么做可以看我开源的工程

BERT + mulit-CNN -> 文本分类

3. 调工具包得到 噪声数据位置

# Compute psx (n x m matrix of predicted probabilities) 
#     in your favorite framework on your own first, with any classifier.
# Be sure to compute psx in an out-of-sample way (e.g. cross-validation)
# Label errors are ordered by likelihood of being an error.
#     First index in the output list is the most likely error.
from cleanlab.pruning import get_noise_indices

ordered_label_errors = get_noise_indices(
    s=numpy_array_of_noisy_labels,
    psx=numpy_array_of_predicted_probabilities,
    sorted_index_method='normalized_margin', # Orders label errors
 )

4. 去除噪声数据

在上一步训练的过程中我们得到 ordered_label_errors

也就是 所有不可信数据的置信排序, 最不可信到最可信

然后我们则可以对验证集合进行遍历, 如果index 在这个 ordered_label_errors里面 , 说明这个index 的数据是噪声数据

我们取出,否则保留, 得到这一份验证集的去噪版本

重复K次, 把每一份验证集的去噪声版本进行合并则得到我们最终的去噪数据集

参考文献

### 回答1: Cleanlab 是一个 Python 库,用于学习和诊断训练数据中的标签错误。它不是一个用于图像的工具。但是,我们可以使用 Cleanlab 来检测和修复含有标签错误的图像数据集,并将其用于图像。 以下是使用 Cleanlab 进行图像的步骤: 1. 准备带有标签错误的图像数据集。 2. 使用 Cleanlab 进行数据集的标签错误检测和修复。 3. 使用修复后的数据集进行训练和测试。 4. 在测试集上评估模型的性能。 下面是一个示例代码,演示如何使用 Cleanlab 进行图像: ```python import numpy as np import matplotlib.pyplot as plt from skimage import io, color from sklearn.model_selection import train_test_split from cleanlab.classification import LearningWithNoisyLabels from cleanlab.noise_generation import generate_noise_matrix_from_trace # 加载图像数据集 image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg', ...] images = [] for path in image_paths: image = io.imread(path) images.append(color.rgb2gray(image)) # 准备带有标签错误的标签信息 true_labels = np.array([0, 1, 2, ...]) noisy_labels = generate_noise_matrix_from_trace(len(true_labels), trace=0.3) # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(images, noisy_labels) # 使用 Cleanlab 进行标签错误检测和修复 model = LearningWithNoisyLabels() model.fit(X_train, y_train) clean_labels = model.predict(X_test) # 使用修复后的标签信息进行训练和测试 # ... ``` 在这个示例代码中,我们首先加载了一组图像数据集,并生成了一些带有标签错误的标签信息。然后,我们将数据集分为训练集和测试集,并使用 Cleanlab 进行标签错误检测和修复。最后,我们使用修复后的标签信息进行训练和测试。 需要注意的是,Cleanlab 不一定能够完全修复所有的标签错误。因此,在使用修复后的数据集进行训练和测试时,仍然需要谨慎评估模型的性能。 ### 回答2: cleanlab是一种用于机器学习分类器标注错误检测和修复的开源库,可以用于图像。以下是使用cleanlab实现图像的步骤: 1. 准备数据集:首先,需要准备一个包含图像和声标签的数据集。这些图像可能包含不同程度的声,可以手动添加或使用已标注的声图像。 2. 构建分类器:使用深度学习框架如TensorFlow或PyTorch构建分类器模型。模型的训练可以使用带标签的训练集进行。 3. 标注错误检测:接下来,使用cleanlab库中的函数来检测分类器对训练集的错误标注。该函数会输出错误标注的索引。 4. 错误标注修复:根据cleanlab检测到的错误标注索引,可以采取不同的修复策略。一种常见的方法是使用人工方式重新标注错误标签,或根据图像内容进行纠正。 5. 重新训练分类器:修复错误标注后,可以使用修正的数据集重新训练分类器模型。这样,分类器就能更准确地图像。 通过使用cleanlab实现图像,可以提高分类器模型在声环境中的性能。这种方法可以应用于各种图像任务,如图像降、图像修复等。 ### 回答3: cleanlab是一个用于机器学习模型的标记错误检测和纠正的工具包,它可以有效地声标签。在图像方面,我们可以将cleanlab应用于图像分类问题。 图像是一个重要的图像处理任务,其目标是从受声污染的图像中恢复出清晰的图像。然而,在训练一个图像模型时,由于标签错误或人工标注错误,我们可能会遇到许多带有声标签的训练样本。这些声标签会导致模型性能的下降,所以我们需要使用cleanlab除这些声标签。 使用cleanlab进行图像的步骤如下: 1. 数据准备:收集包含声标签的训练数据集,并且还需要一个小的已经准确标记的验证数据集。 2. 构建图像分类模型:训练一个基于深度学习的图像分类模型,使用上面准备好的训练数据集进行训练。 3. 执行cleanlab使用cleanlab评估此训练模型中的标签错误。cleanlab将根据验证数据集的标签和模型的预测结果来估计每个样本的标签错误概率。 4. 检测和纠正错误标签:根据cleanlab提供的标签错误概率信息,我们可以检测出带有错误标签的样本,并将其从训练数据集中删除或进行纠正。 5. 重新训练模型:在除了声标签后,使用剩余的准确标签重新训练图像分类模型。 6. 测试模型:使用测试数据集评估最终训练好的图像模型的性能。 通过使用cleanlab实现图像,我们可以有效地检测和纠正训练数据集中的声标签,提高了图像分类模型的性能和准确性。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值