机器学习中重复数据管理的最佳实践

本文深入探讨了机器学习中重复数据对模型性能的影响,详细介绍了文本、图像和音频数据的去重技术,包括精确匹配、模糊匹配和感知哈希等方法,并提供了实际代码示例和最佳实践建议。

掌握机器学习中的重复数据管理以实现最佳模型性能

在当今数据驱动的世界中,机器学习从业者经常面临一个关键但未被充分认识的挑战:重复数据管理。大量多样化数据为当今的ML模型提供动力。尽管收集大规模数据集变得比以往任何时候都更容易,但重复记录的存在会显著影响其质量、性能,并经常导致有偏差的结果。本文试图深入探讨重复数据如何影响机器学习模型,以及它如何影响其准确性和其他性能指标。我们将尝试揭示有效识别、分析和管理重复数据的实用策略。您将找到有关管理重复数据、最佳实践、当前趋势等的部分。我们希望您觉得本文发人深省!

理解机器学习中的重复数据

重复数据可以出现在机器学习模型训练期间消耗的所有数据类型中。因此,它可以出现在文本、图像、音频、视频和表格数据中。请记住,这些重复对从这些数据中学习的模型没有好处。广义上说,重复数据可以分为精确重复、近似重复和相似或释义版本。让我们详细探讨每种模式。

文本数据

理解我们在文本领域可能遇到的不同类型的重复数据集非常重要。文本重复通常通过跨站点抓取相同内容、社交媒体转发、复制文章、具有轻微变化的自动生成内容以及表达相同含义的翻译对出现。这些重复在从多个在线来源进行大规模数据收集时自然出现。

让我们逐一来看。

精确重复:将这些视为文本领域中几乎相同的双胞胎。因此,精确重复的文本包括空格、大写、标点符号等。精确文本数据重复的主要原因是网络抓取、内容联合和社交媒体共享,其中相同内容出现在多个平台上。营销材料、新闻报道和商业文档经常被重复或重新发布,产生精确副本。

近似重复:这些是具有微小变化的文本数据,例如拼写错误,并且经常添加或删除停用词和标点符号。一个例子可能是“A quick brown fox jumped”与“The quick brown fox jumps”。近似重复文本通常通过社交媒体共享、内容聚合器和新闻联合进入数据集。相同材料的细微变化通常由基于模板的内容和微小修改产生。

释义:不同措辞传达相同含义。例如,“The fox is quick and brown.”和“The brown fox is fast.”可以被视为释义。

数据增强导致的伪影:在NLP过程中,数据增强技术如回译和同义词替换有时可能无意中引入近似重复数据点。这些数据主要通过自动内容创建、SEO优化的旋转文本、聊天机器人交互和类似系统在网站、博客和社交媒体上扩散。

图像数据

由于几个相互关联的过程,数据集自然包含重复图像。通常,相同的视觉材料以多种文件格式呈现,如JPEG、PNG或WebP,图像处理通过颜色、裁剪和调整大小产生变化。通过数字操作(包括镜像、旋转和滤镜应用)产生几乎相同的重复。网站上广泛使用库存图片和捕获相关内容的截图进一步增加了重复。此外,通过有意使用数据增强技术产生原始照片的变体。

精确重复:这些可以是像素到像素相同的图像。这意味着它们具有相同的大小、分辨率等。它们通常由无意中的数据复制或摄取错误创建。

近似重复:这些图像表现出轻微变化,例如被裁剪、添加水印、分辨率不同或是全景拍摄。一个例子,如下所示,可能包括连拍序列中的图像。

相似和增强图像:图像增强在计算机视觉中通过人工扩展训练数据集的大小和多样性起着关键作用。创建 altered 图像,例如从多个视角或角度显示相同对象或场景的图像,是此过程的一部分。当涉及计算机视觉和机器学习模型时,使用增强图像非常重要。它们帮助模型识别看起来相似的图像中的模式和相似性。深度神经网络尤其需要大量训练数据来有效学习并避免过拟合。然而,收集足够的训练样本可能很困难。这就是为什么并非每个看起来几乎相同的图像都是问题——有些实际上可能有益于训练。在选择增强技术时考虑特定的学习任务以确保增强数据相关且有用非常重要。

音频数据

相同重复:类似于文本和图像重复,这些由存储或检索中的重复错误形成。

近似重复:具有微小变化的音频,例如不同的编码格式(*.aac, *mp3),添加了噪声或不同的比特率。例如,同一首歌可能以多种格式或带有轻微编辑上传,导致近似重复。这些变化可能无意中被包含在数据集中,通过引入冗余和偏差影响模型训练。

相似音频:相同事件或声音的音频记录但具有不同的麦克风放置或背景噪声。例如,来自不同地点的同一场音乐会的多个录音是相似音频的经典例子。

在探讨了不同模态的各种类型和潜在来源的重复数据之后,让我们现在深入探讨它们的影响。

重复数据对模型性能的影响

重复数据通常会影响模型性能,除非它们是专门增强的以提高模型性能或增加少数类表示。影响的程度和性质取决于几个因素,包括重复的比例、重复的类型(精确或近似)、使用的学习算法和特定用例。必须注意,影响既可能是负面的,有时也可能是正面的。让我们看看由重复数据引起的潜在问题。

负面效应

有偏差的评估:这主要可能由于训练和验证集中存在精确和近似重复数据,导致模型性能指标膨胀。因此,模型在先前未见数据上的表现似乎比实际更好。相反,如果模型在重复数据点上表现不佳,它可能使整体模型性能指标缩水。这可能有效地使模型显得不如实际有效,因为对同一数据点的重复不良表现不成比例地影响整体评估。

过拟合:这里本质上,模型变得过于专门化于训练集,无法捕获在先前未见数据上表现良好所需的底层模式。这对于精确重复和近似重复尤其如此。训练数据集中的精确或近似重复可能强化不代表一般数据集特征的模式。这通常导致冗余,其中模型专注于记忆这些特定实例而不是学习底层模式。

训练成本:在预处理/后处理期间,重复数据的计算在训练期间产生额外开销而不为模型增加任何实际价值,这最终增加了训练时间和资源需求。

有偏差的特征重要性:重复数据可能人为地扭曲数据集中某些特征的重要性。如果一个特征始终与重复实例相关联,模型可能赋予它比应得更高的重要性,导致不正确的特征选择或解释。这里需要注意的重要一点是,这并不总是坏结果。我们将在后续部分讨论此事。

正面效应

如前所述,不只是负面!下面提到了一些正面效应的例子。

重要模式的强化:重复或重复/近似重复的出现有助于模型内部化某些模式,特别是大型语言模型(LLMs)和代码生成模型,这导致更可靠和有效的代码生成。例如,当高质量代码示例(如基于OOPS的代码结构和其他设计模式(通常是近似重复)在整个训练数据集中重复时,模型更彻底地学习最佳实践和设计概念。另一个例子可能是多个适当的API错误处理模式实例帮助模型一致地生成健壮的错误处理代码。因此,实际上,近似重复将有益模式强化到模型中。

对重复社交媒体数据影响的深入探讨可以在论文Xianming Li等人2024中找到。本文提出了一个基于生成AI的去重框架,用于检测社交媒体数据中的冗余。他们使用自监督生成模型预测关键词,通过训练期间向数据集添加高斯噪声来识别和删除语义重复文本,从而防止模型学习琐碎特征。在TweetEval数据集上的实验证明了该方法的有效性,结果显示减少了训练样本和时间,同时提高了模型性能。

如何识别重复数据

重复数据识别策略取决于所处理的重复数据类型。方法在精确重复和近似重复之间略有不同。

文本数据

有不同的流行技术来识别重复文本数据。

精确字符串匹配:这种方法用于识别完美匹配的文本数据。首先我们为每个文本数据创建唯一哈希。然后在识别重复时查找这些哈希键。这里的优点是,使用基于哈希的实现,我们可以将去重工作的时间复杂度降低到O(n)。下面显示了一个简单的Python实现。

1
2
3
# Exact String Matching
def exact_match_deduplication(texts):
    return list(set(texts))

如果训练数据集中找到精确重复的可能性很高,可以使用精确字符串匹配算法。但这些算法的时间复杂度往往是O(n2)或O(n)log(n)。但基于哈希的实现具有O(n)复杂度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Exact string matching using Hashing
from typing import List, Set, Dict
import hashlib

class ExactStringMatcher:
    def __init__(self):
        self.hash_table: Dict[str, str] = {}
    
    def get_hash_string(self, text: str) -> str:
        """Generate SHA-256 hash for a string"""
        return hashlib.sha256(text.encode('utf-8')).hexdigest()
    
    def find_duplicates(self, texts: List[str]) -> Dict[str, List[str]]:
       
 """Find exact duplicates using hash table with O(n) complexity"""
        duplicates: Dict[str, List[str]] = {}
        
        # Single pass through all strings - O(n)
        for text in texts:
            hash_value = self.get_hash_string(text)
            
            if hash_value in self.hash_table:
                if hash_value not in duplicates:
                    duplicates[hash_value] = [self.hash_table[hash_value]]
                duplicates[hash_value].append(text)
            else:
                self.hash_table[hash_value] = text
                
        return duplicates

# Usage
matcher = ExactStringMatcher()
# Sample text data
texts = [
    "Hello World",
    "Python Programming",
    "Hello World",
    "Data Structures",
    "Python Programming",
    "Algorithms"
]

# Find duplicates
duplicates = matcher.find_duplicates(texts)

模糊字符串匹配:这是另一种用于查找重复文本数据的流行技术。模糊匹配使用智能算法检测相似单词和短语,超越精确匹配。通过调整匹配参数,您可以识别共享强相似性即使不完全相同的重复。这使得模糊匹配成为跨数据集合查找相关内容的有力工具。

模糊匹配领域有几种技术。下面提到了其中一些流行的。

Levenshtein距离:它是一种通过计算将一个字符串转换为另一个字符串所需的最小单字符编辑(插入、删除或替换)次数来测量两个字符串之间差异的度量。

汉明距离:两个等长字符串之间的汉明距离是相应符号不同的位置数。

N-Gram基于匹配:它通过将文本文档分解为N个连续单词的重叠序列(N-Grams)来比较文本文档。

BK-Tree(使用Levenshtein距离和三角不等式):它基于编辑距离(Levenshtein距离)组织字符串,允许通过递归修剪搜索分支快速搜索特定相似性阈值内的字符串。

更多细节,请参考本文。下面是使用Levenshtein距离演示模糊匹配的示例Python代码片段。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Fuzzy String Matching using Levenshtein Distance
from fuzzywuzzy import fuzz
def fuzzy_match_deduplication(texts, threshold=90):
    unique_text_list = []
    for text in texts:
        if not any(fuzz.ratio(text, t) > threshold for t in unique_text_list):
            unique_text_list.append(text)
    return unique_text_list
texts = [
        "apple",
        "appel",
        "banana",
        "bananna",
        "orange",
        "oragne"
    ]
threshold = 80
unique_texts = fuzzy_match_deduplication(texts, threshold)

MinHash:让我们简要检查一下Jaccard相似性是关于什么的。Jaccard相似性指数是一个比较集合的函数,并将两个有限集的相似性表征为它们的重叠大小与并集大小的比率J(A, B)= |A∩B| / |A∪B|对于两个不相交的集合,分子∣A∩B∣为零,指数变为零。但如果集合相同,A∩B=A∪B=A=B,Jaccard相似性为1。​MinHash使用概率技术近似Jaccard相似性:它将哈希函数应用于文本集中的每个元素并保留最小哈希值。两个集合具有相同最小哈希值的概率等于它们的Jaccard相似性。上述组合为我们提供了快速准确的近似重复检测,特别是对于大型文档集合。深入知识,请参考此博客文章。

一个经典的现实世界用例是GPT-3训练:GPT-3加权预训练数据集的60%源自Common Crawl的过滤版本,包含4100亿个字节对编码令牌。使用Apache Spark的MinHashLSH对此数据集执行模糊去重。该模型在45TB去重数据与100TB原始数据上实现了更好的性能,从而显著降低了训练成本。

向量空间理论:这种方法基于类似文本将在其多维向量空间中靠近的假设识别近似重复文本。它是自然语言处理中高度流行的技术,我们将单词转换为高维空间中的密集向量表示,其中语义相似性由这些向量之间的空间关系捕获。语义相似性的距离度量包括余弦相似性、欧几里得距离、曼哈顿距离等。

聚类:聚类可以使用嵌入向量或TF-IDF向量等特征对文本进行分组。重复文本自然倾向于落入同一簇。无监督算法如K-Means聚类、DBSCAN普遍用于创建文本簇。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Function for Clustering-based deduplication
from sklearn.cluster import DBSCAN
def cluster_deduplication(vectors, eps=0.5):
	"""
    Perform clustering-based deduplication on vectors using DBSCAN
    
    Args:
        vectors: numpy array of vectors to deduplicate
        eps: epsilon parameter for DBSCAN (default: 0.5)
        
    Returns:
        List of indices for unique vectors
    """
    clustering = DBSCAN(eps=eps, min_samples=2).fit(vectors)
    unique_indices = [i for i, label in enumerate(clustering.labels_) 
                     if label == -1]
    return unique_indices

# Run deduplication
unique_idx = cluster_deduplication(sample_vectors, eps=0.5)
    
             # Print results
print("Unique vectors indices:", unique_idx)

用于去重的主动学习:除了上述经典技术外,最近的研究使用如主动学习等技术,在Liu, Xinyao等人的论文“A Pre-trained Deep Active Learning Model for Data Deduplication[Link]”中进行了探索。他们提出了PDDM-AL,一种将去重作为序列分类问题并应用主动学习的架构。在模型训练之前,数据经过摘要、分块、序列化和领域知识注入。不确定示例被选择用于专家标记,然后反馈到训练数据集中以进行额外的主动学习迭代,而训练模型对未标记数据生成重复/非重复预测。

PDDMAL的设计图 DagsHub通过结合Data Engine、MLflow和Label Studio等工具使主动学习更容易。您可以参考本文中的工作流了解更多。通过选择并标记与模型置信度评级相适应的数据点,用户可以迭代改进模型,优化资源利用同时提高模型准确性。工作流还促进数据管理、模型训练和注释程序。

图像数据

图像数据集中使用的去重技术与我们对文本所做的没有太大不同。哈希、向量嵌入、聚类等广泛用于图像去重。删除重复图像有助于提高数据集质量,减少训练时间,并可以通过确保模型从多样化示例中学习来增强模型性能。让我们下面详细探讨这些技术。

哈希技术

这种技术基于图像的视觉内容生成哈希值。与加密哈希不同,感知哈希被设计为对于视觉上相似的图像是相似的。因此,感知哈希(或pHashing)是最流行的。

下面显示了pHashes如何工作的演示。还给出了生成图像哈希的代码片段。

作者图像 最终模式的哈希二进制表示(如上图所示)如下所示 1100100111001001101101100011110010111100100100110011010010010100 将任何图像转换为其pHash表示的Python代码如下。更多信息请参考Ofcom的论文。本文提供了关于流行感知哈希技术的概述。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from PIL import Image
import imagehash
import matplotlib.pyplot as plt
import numpy as np

# Load the image
image_path = 'path_to_your_image.jpg'
original_image = Image.open(image_path)

# Step 1: Convert to grayscale
gray_image = original_image.convert('L')

# Step 2: Resize using LANCZOS
resized_image = gray_image.resize((32, 32), Image.Resampling.LANCZOS)

# Step 3: Compute pHash
phash = imagehash.phash(original_image)

# Step 4: Convert hash to binary array for visualization
# Convert hex hash to binary string and then to array
hash_binary = bin(int(str(phash), 16))[2:].zfill(64)
hash_array = np.array([int(bit) for bit in hash_binary]).reshape(8, 8)

# Display all steps
fig, axes = plt.subplots(1, 4, figsize=(16, 4))
axes[0].imshow(original_image)
axes[0].set_title('Original Image')
axes[0].axis('off')

axes[1].imshow(gray_image, cmap='gray')
axes[1].set_title('Grayscale Image')
axes[1].axis('off')

axes[2].imshow(resized_image, cmap='gray')
axes[2].set_title('Resized Image (32x32)')
axes[2].axis('off')

axes[3].imshow(hash_array, cmap='binary')
axes[3].set_title('pHash Binary Pattern (8x8)')
axes[3].axis('off')

plt.tight_layout()
plt.show()
print(f"Perceptual Hash: {hash_binary}")

另一组哈希技术使用傅里叶变换将图像分解为一组波,其中图像中像素的暗度和亮度由这些波的峰和谷表示,如下图所示。更多信息请参考源文档。

左侧数字照片和右侧,显示了相同数字照片的图像函数及其傅里叶变换:来源 CNNS(深度神经网络)基于方法 预训练CNNS例如(VGG、InceptionNET、ResNet)可用于从图像中提取高级特征。然后可以使用余弦相似性和欧几里得距离等度量比较这些特征,进而用于去重工作。有关CNNs基于特征提取的更多信息,请参考Rodrigo Silva题为“Exploring Feature Extraction with CNNs”的文章。

使用CNN从图像提取特征的视觉表示:来自文章和Pexels的图像 图像嵌入

CNNs和自动编码器可以有效地用于生成紧凑的图像嵌入。通过使用特定相似性度量(均方误差、结构相似性指数等)比较这些嵌入,您可以识别相似或重复的图像。

聚类技术(例如,K-Means和DBSCAN)

这些算法可用于基于提取的特征或嵌入对相似图像进行聚类。重复图像通常在同一簇中找到。

上述每种技术都有其优点和缺点,方法的选择通常取决于数据集、ML模型的具体要求和可用计算资源。在实践中,这些技术的组合可能用于实现健壮的图像去重。

音频数据

类似于图像和文本数据,音频文件去重是一个有趣的工作领域。由于文件格式、比特率和元数据的差异,这可能具有挑战性。下面是一些使用的常用技术。

音频指纹识别

音频指纹识别是最流行的去重方法。

理论基础:基于音频信号的声学特性创建紧凑的数字摘要。通常使用感知哈希算法生成唯一指纹,这些指纹在尽管有微小修改的情况下保持稳定(这类似于图像pHashing技术)。请参考Sergiu Ciumac的此文章以获取深入参考。

频谱分析

通过比较频谱分布,例如使用傅里叶变换,可以识别具有相似音频内容的文件,即使它们在其他方面不同,如具有不同的比特率或压缩级别。

音频文件的频谱分析如下所示链接到此音频文件。

作者图像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np

# Load the MP3 file
file_path = 'path/to/your/audiofile.mp3'
y, sr = librosa.load(file_path, sr=None)

# Compute the Short-Time Fourier Transform (STFT)
D = librosa.stft(y)

# Convert the amplitude to decibels
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)

# Plot the spectrogram
plt.figure(figsize=(10, 6))
librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='log', cmap='viridis')
plt.title('Spectrogram')
plt.xlabel('Time')
plt.ylabel('Frequency')
plt.tight_layout()
plt.show()

频谱分析可以是重复音频检测的强大工具,因为它提供了音频文件随时间频率内容的详细表示。创建频谱分析后,可以制作检测重复音频文件的工作流,如下所述。 加载音频文件并计算其频谱图 从频谱图中提取相关特征 - 示例可以是梅尔频率倒谱系数(MFCCs)、色度特征等。 使用相似性度量(音频特定)或训练模型比较提取的特征 根据相似性阈值决定是否去重或保留。

ML模型训练的数据去重最佳实践

在实施任何数据去重技术之前,您需要了解数据源和类型的性质和特征。格式、标准和质量水平可能因数据提供者而异。来自不同来源的数据可能具有不同的特征、值和连接。

虽然没有一套黄金规则,但以下是开发去重管道的一些通用最佳实践。下面列出了其中一些。

数据验证:这对于去重很重要,因为它有助于在开始去重过程之前建立数据的基线质量。因此确保传入数据符合预期的数据模式。还要确保检查数据完整性、缺失值和异常。像Tensorflow Validation这样的工具可以帮助自动化过程。

维护清晰的文档数据源、转换和处理步骤。对数据集和预处理脚本使用版本控制。有效管理元数据收集和存储。通过创建数据管道中如何识别和处理重复记录的清晰审计跟踪,将有助于未来改进过程。

对于流数据,使用窗口化去重技术识别特定时间范围内的重复。像Apache Kafka和Apache Flink这样的工具可以配置用于此目的。此外,我们可以使用事件时间戳准确识别和删除流数据中的重复,确保正确处理延迟到达的数据。

领域特定工作流:利用领域知识定义什么构成重复。开发为数据集和要训练的ML模型量身定制的自定义算法。这可能涉及仅用于去重的单独机器学习模型。始终使用反馈循环和SMEs的参与来改进和完善去重管道。一个经典例子可以在医疗保健领域观察到,其中患者记录可能被视为重复,即使它们共享相同的名称、ID、出生日期等,但具有不同的地址。

未来方向和新兴技术

随着AI训练数据集的快速扩展,数据去重变得越来越关键。当代去重方法强调效率和保持数据质量同时消除冗余。下面讨论了一些最近和即将到来的去重趋势。

语义去重:使用向量嵌入的语义去重在文本和图像去重工作流中变得越来越普遍。这确保在去除冗余变化的同时保留多样化示例。

实时去重:出现了如实时处理和去重数据的趋势,特别是使用哈希和索引技术(前面讨论过),这特别适用于流数据源。它们通常使用分布式计算和优化数据结构以确保低延迟处理。

多模态:像跨模态相似性检测和集成多样化数据格式等技术可能变得越来越普遍。向多模态ML模型的这种转变通过利用来自各种来源(如音频、图像和文本)的信息实现更全面和细致的理解。

使用机器学习和强化学习模型:自监督和自我改进的去重模型。这些模型通常自适应地选择过滤阈值。

用于去重的区块链:利用区块链技术维护数据块的去中心化和不可变记录,确保在分布式系统中识别和管理重复。

联邦学习:去重可以有效地应用于数据分布在多个节点上的联邦学习设置。这确保去重发生而不集中数据。

质量感知去重:这是一种新兴的去重技术,我们选择性地保留高质量训练样本。它们通常专门于自动偏差检测和缓解。

结论

如标题所示,掌握重复数据管理仍然是成功机器学习模型开发的关键标准。在整个本文中,我们一直在探索用于每种数据模态的去重技术。如您可能已经观察到的,从文本和图像到音频文件,每种数据模态都需要专门的去重技术,以平衡效率与数据质量。

现代方法为我们提供了健壮的框架来应对跨各种领域和模态的这一挑战。我们特别探索了用于文本、图像和音频数据集的技术。您会观察到这里提到的一些算法在模态之间重叠,特别是在文本和图像数据类型之间,原因是两者都处理模式识别和特征比较。此外,它们使用相同的相似性度量,如余弦相似性和欧几里得距离。

当我们生活在一个数据集以指数速度增长的时代时,整个去重工作需要高度自适应和智能的解决方案,即使实时处理数据也能保留相关和有价值的训练样本。我们希望本文作为有效数据去重和构建智能解决方案的指南,同时优化其ML管道,降低训练成本,并最终构建更可靠和性能更好的模型!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计