【机器学习】数据清洗之识别重复点

🎈个人主页:甜美的江
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:机器学习
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

数据清洗之识别重复值

  • 一 重复值的概念与危害
    • 1.1 重复值的概念
    • 1.2 重复值的危害
  • 一 基于行比较:
    • 1.1 实现步骤:
    • 1.2 示例:
  • 二 基于列比较:
    • 2.1 实现步骤
    • 2.2 示例:
  • 三 基于哈希函数:
    • 3.1 实现步骤
    • 3.2 示例:
  • 四 基于统计特征:
    • 4.1 实现步骤
    • 4.2 示例
  • 五 基于距离度量:
    • 5.1 实现步骤
    • 5.2 示例
  • 六 基于机器学习模型:
    • 6.1 实现步骤
    • 6.2 示例
  • 七 各种方法的优缺点和适用场景
    • 7.1 基于行比较:
    • 7.2 基于列比较:
    • 7.3 基于哈希函数:
    • 7.4 基于统计特征:
    • 7.5 基于距离度量:
    • 7.6 基于机器学习模型:
  • 八 总结

在这里插入图片描述

引言:

在日益增长的数据海洋中,数据质量成为确保分析结果准确性的关键因素之一。而其中,重复值是数据中常常存在的问题之一。重复值不仅影响数据的准确性,还可能导致分析和建模的错误结果。因此,在进行数据清洗的过程中,识别和处理重复值显得尤为重要。

本博客将深入探讨数据清洗中识别重复值的方法,包括基于行比较、基于列比较、基于哈希函数、基于统计特征、基于距离度量以及基于机器学习模型的各种技术。通过深入了解这些方法,我们能够更加高效地清理数据,提升数据质量,从而为后续分析和建模奠定坚实基础。

在这里插入图片描述

一 重复值的概念与危害

1.1 重复值的概念

重复值指的是在数据集中出现了多次的相同或近似相同的数据点。

这些重复值可能是由于数据采集过程中的重复输入、数据合并时的重叠或错误、数据传输中的重复等原因造成的。

在数据清洗过程中识别和处理重复值是至关重要的,因为这些重复值可能会影响到机器学习模型的训练和性能。

示例:

假设我们有一个包含学生信息的数据集,其中包括学生的姓名、年龄和性别,一个可能的重复值示例是:


在这个例子中,第三行和最后一行的数据与第一行和第二行的数据完全相同,它们是重复值。

尽管姓名、年龄和性别都相同,但它们可能代表不同的数据输入错误或数据重复。

在数据清洗过程中,我们可以识别并处理这些重复值,例如删除重复的行,以确保数据集中每个数据点的唯一性。

1.2 重复值的危害

在机器学习中,数据清洗中的重复值可能会带来一些危害,主要包括以下几个方面:

1 模型性能下降:

数据集中的重复值会导致模型对某些特征过度关注,使模型无法充分学习数据的真实模式,从而降低模型的性能。

2 过拟合:

重复值可能会导致模型过度拟合训练数据,即模型过于复杂地适应了训练数据中的噪声和异常,从而降低了模型的泛化能力,使得在新数据上的预测性能下降。

过拟合(Overfitting)是指机器学习模型过度地适应了训练数据集中的噪声和随机变化,导致模型在新数据上的泛化能力下降的现象。

泛化能力(Generalization Ability)是指机器学习模型对于未见过的数据的适应能力或预测能力。

3 不准确的统计分析:

在进行数据探索性分析(EDA)或统计分析时,如果数据中存在重复值,统计量和结果可能会受到影响,导致分析结果不准确或误导性。

4 浪费计算资源:

在数据集中存在大量重复值时,模型训练过程需要处理大量冗余数据,从而增加了计算资源的消耗,降低了模型训练的效率。

5 数据偏差:

数据集中的重复值会导致某些数据点的权重过大,使得模型对某些特征过度关注,从而引入数据偏差,影响模型的性能和稳定性。

因此,识别和处理数据清洗中的重复值是非常重要的,可以通过删除重复值、合并重复值或标记重复值等方法来减轻重复值带来的危害,提高模型的性能和可靠性。

在这里插入图片描述

一 基于行比较:

基于行比较的方法是一种直接而简单的方式来识别数据集中的重复值。

这种方法逐行比较数据集中的每一条记录,并查找是否存在完全相同的行。

1.1 实现步骤:

1 数据加载:

首先,将数据集加载到内存中,以便进行处理。

2 数据排序(可选):

在进行基于行比较的重复值识别之前,可以选择对数据集进行排序。

排序操作可以使相同的记录相邻排列,从而更方便地识别重复值。

3 逐行比较:

对数据集中的每一行进行比较。

通常,可以使用循环来迭代遍历每一行,然后对每一行与其他行进行比较。

4 查找重复值:

对于每一行,与其他行进行比较,查找是否存在完全相同的行。

可以逐个比较每个字段(特征)的值,如果两行的所有字段都完全相同,则认为它们是重复的。

5 标记或删除重复值:

一旦找到重复的行,可以根据需求选择将其标记或删除。

标记重复值可以在后续数据处理步骤中进行进一步的处理,而删除重复值则可以直接将其从数据集中移除。

6 重复值记录:

在标记或删除重复值之后,可以选择记录重复值的数量或者具体位置信息,以便后续分析或报告。

7 重复值处理(可选):

如果需要,可以对重复值进行进一步的处理,如合并重复值、保留第一个或最后一个出现的重复值等。

8 数据保存:

处理完重复值之后,可以将清洗后的数据集保存到文件或数据库中,以备后续分析或建模使用。

基于行比较的方法简单直接,适用于数据量较小且结构相对简单的情况。

然而,对于大型数据集或者高维数据,这种方法可能会比较耗时,并且在性能上不如其他基于哈希函数或统计特征的方法。

因此,在选择识别重复值的方法时,需要根据数据集的规模、特征数量和处理需求来进行权衡和选择。

1.2 示例:

首先,我们需要一个示例数据集。

假设我们有一个包含姓名、年龄和性别的人员信息数据集,其中可能存在重复记录。

这里提供一个简单的CSV格式的数据集:

Name, Age, Gender
John, 30, Male
Alice, 25, Female
Bob, 35, Male
Alice, 25, Female
John, 30, Male

现在,我们来编写Python代码来识别重复值:

import pandas as pd# 加载数据集
data = pd.read_csv("example_dataset.csv")# 基于行比较识别重复值
duplicate_rows = data[data.duplicated()]# 打印重复值
print("重复值记录:")
print(duplicate_rows)# 打印重复值数量
print("\n重复值数量:", len(duplicate_rows))

这段代码首先导入Pandas库,然后使用pd.read_csv()函数加载示例数据集。

接着,我们使用data.duplicated()方法来识别重复行,然后将结果存储在duplicate_rows变量中。

最后,我们打印重复行的记录和数量。

以上代码将输出如下结果:

重复值记录:Name  Age  Gender
3  Alice   25  Female
4   John   30    Male重复值数量: 2

这表明在示例数据集中有两行是重复的。根据输出结果,我们可以进一步处理这些重复值,例如删除重复行或合并重复行,以确保数据的准确性和一致性。
在这里插入图片描述

二 基于列比较:

基于列比较的方法是一种识别数据集中重复值的有效方式,特别适用于具有大量特征(列)的数据集。

这种方法通过逐列比较数据集中的值,查找是否存在完全相同的列,从而识别重复值。

2.1 实现步骤

1 数据加载:

首先,将数据集加载到内存中,以便进行处理。

2 数据转置(可选):

对数据集进行转置操作,将行转换为列,以便更方便地进行列比较。

虽然这一步是可选的,但在具有大量记录但相对较少特征的数据集上,转置可以提高比较效率。

3 逐列比较:

对数据集中的每一列进行比较。

可以使用循环遍历每一列,并将每列的值进行比较。

4 查找重复值:

对于每一列,与其他列进行比较,查找是否存在完全相同的列。

如果两列的所有值都完全相同,则认为它们是重复的。

5 标记或删除重复值:

一旦找到重复的列,可以根据需求选择将其标记或删除。

标记重复值可以在后续数据处理步骤中进行进一步的处理,而删除重复值则可以直接将其从数据集中移除。

6 重复值记录:

在标记或删除重复值之后,可以选择记录重复值的数量或者具体位置信息,以便后续分析或报告。

7 重复值处理(可选):

如果需要,可以对重复值进行进一步的处理,如合并重复值、保留第一个或最后一个出现的重复值等。

8 数据保存:

处理完重复值之后,可以将清洗后的数据集保存到文件或数据库中,以备后续分析或建模使用。

基于列比较的方法在处理大型数据集或者高维数据时特别有效,因为它可以降低比较的时间复杂度。

然而,需要注意的是,在某些情况下,例如对于非常稀疏的数据集,列比较方法可能不太适用,因为大多数列的值都是缺失值,导致误判。

因此,在选择识别重复值的方法时,需要根据数据集的特点和处理需求进行权衡和选择。

2.2 示例:

首先,让我们创建一个包含重复列的数据集:

import pandas as pd# 创建一个包含重复列的数据集
data = {'A': [1, 2, 3, 4, 5],'B': [1, 2, 3, 4, 5],'C': [1, 2, 3, 4, 5],'D': [6, 7, 6, 9, 10]  # 注意,这里有重复值
}df = pd.DataFrame(data)
print("原始数据集:")
print(df)

接下来,我们使用基于列比较的方法来识别重复值:

# 使用基于列比较的方法识别重复值
duplicate_cols = df.T.duplicated()# 获取重复列的名称
duplicate_cols_names = df.columns[duplicate_cols].tolist()# 计算重复值的数量
duplicate_values_count = len(duplicate_cols_names)print("\n重复列及重复值数量:")
print("重复列:", duplicate_cols_names)
print("重复值数量:", duplicate_values_count)

在这段代码中,我们首先使用.T将DataFrame转置,然后使用duplicated()方法检测重复列。接着,我们提取重复列的名称,并计算重复值的数量。

代码分析:

首先,我们创建了一个包含重复列的DataFrame,并将其打印出来以查看原始数据。

然后,我们使用.T方法对DataFrame进行转置,以便在列上进行比较。

接着,我们使用duplicated()方法找到重复的列,并将结果存储在duplicate_cols中。

我们提取重复列的名称,并计算重复值的数量。 最后,我们将重复列及重复值的数量打印出来。

代码结果:

原始数据集:A  B  C   D
0  1  1  1   6
1  2  2  2   7
2  3  3  3   6
3  4  4  4   9
4  5  5  5  10重复列及重复值数量:
重复列: ['C']
重复值数量: 1

结果显示,列’C’是重复的,且重复的值有1个。

在这里插入图片描述

三 基于哈希函数:

基于哈希函数的方法是一种在数据清洗中识别重复值的有效技术。

哈希函数将数据映射到一个固定长度的唯一标识符(哈希值)上,使得具有相同内容的数据在哈希函数下具有相同的哈希值。

通过计算数据的哈希值,我们可以快速比较数据是否相同,从而识别重复值。

3.1 实现步骤

1 数据加载:

首先,将数据集加载到内存中,以便进行处理。

2 选择要比较的列:

根据数据集的特点和分析需求,选择要用于识别重复值的列。

通常,我们会选择包含唯一标识符的列,如ID列或者其他关键特征列。

3 应用哈希函数:

对选定的列应用哈希函数,将列中的每个值映射为其对应的哈希值。

常用的哈希函数包括MD5、SHA-1、SHA-256等。

4 比较哈希值:

对于每个数据值,比较其哈希值是否与其他数据的哈希值相同。

如果哈希值相同,则表明数据内容相同,可能存在重复值。

5 标记或删除重复值:

一旦找到重复的数据值,可以根据需求选择将其标记或删除。

标记重复值可以在后续处理步骤中进行进一步的处理,而删除重复值则可以直接将其从数据集中移除。

6 重复值记录:

可以选择记录重复值的数量或者具体位置信息,以便后续分析或报告。

7 重复值处理(可选):

如果需要,可以对重复值进行进一步的处理,如合并重复值、保留第一个或最后一个出现的重复值等。

8 数据保存:

处理完重复值之后,可以将清洗后的数据集保存到文件或数据库中,以备后续分析或建模使用。

基于哈希函数的方法具有以下优点:

1 高效性: 哈希函数可以快速计算数据的哈希值,从而快速识别重复值,适用于大规模数据集。

2 唯一性: 哈希函数会将不同的数据映射为不同的哈希值,因此可以保证数据的唯一性。

3 灵活性: 可以根据具体需求选择不同的哈希函数和比较列,适用于不同类型和结构的数据。

然而,基于哈希函数的方法也存在一些限制,例如哈希碰撞(多个不同的数据映射到相同的哈希值)可能会导致误判,因此在选择哈希函数和比较列时需要谨慎考虑。

3.2 示例:

import pandas as pd# 创建一个包含重复值的数据集
data = {'ID': [1, 2, 3, 4, 1, 6, 7, 8, 9, 10],'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Alice', 'Frank', 'Grace', 'Henry', 'Ivy', 'Jack'],'Age': [25, 30, 22, 35, 25, 40, 28, 45, 32, 28]
}df = pd.DataFrame(data)# 基于哈希函数的方法识别重复值
def identify_duplicates(dataframe, columns):# 添加一个新的列存储哈希值dataframe['Hash'] = dataframe[columns].apply(lambda x: hash(tuple(x)), axis=1)# 找到重复的哈希值,即重复的数据行duplicates = dataframe[dataframe.duplicated(subset='Hash', keep=False)]# 返回重复值及其数量return duplicates, len(duplicates)# 选择要比较的列
columns_to_compare = ['ID', 'Name', 'Age']# 调用函数识别重复值
duplicates_df, num_duplicates = identify_duplicates(df, columns_to_compare)# 打印结果
print("重复值及其数量:")
print(duplicates_df)
print("\n总重复值数量:", num_duplicates)

这个代码首先创建一个包含重复值的简单数据集,然后定义了一个identify_duplicates函数,该函数使用哈希函数来识别重复值。在示例数据集中,选择了’ID’、'Name’和’Age’这三列进行比较。最后,打印了重复值及其数量的结果。

代码分析:

1 引入必要的库:

pandas:用于数据处理和分析。

2 创建包含重复值的数据集:

使用字典创建一个包含 ‘ID’, ‘Name’, 和 ‘Age’ 列的数据帧 (DataFrame),其中包含了一些重复的数据。

3 定义 identify_duplicates 函数:

接受两个参数:数据帧 (dataframe) 和要比较的列 (columns)。

添加一个新列 ‘Hash’ 到数据帧中,该列存储了每行数据经过哈希处理后的值。

使用 duplicated 函数找到重复的哈希值,即重复的数据行。

返回包含重复值的数据帧和重复值的数量。

4 选择要比较的列:

将 ‘ID’, ‘Name’, 和 ‘Age’ 列作为要比较的列。

5 调用 identify_duplicates 函数:

将数据帧和要比较的列作为参数传入。

返回重复值的数据帧和重复值的数量。

6 打印结果:

打印重复值的数据帧和重复值的数量。

代码结果:

重复值及其数量:ID   Name  Age                Hash
0   1  Alice   25  218931787785147495
4   1  Alice   25  218931787785147495总重复值数量: 2

在示例数据集中,有两个重复的数据行,它们的 ‘ID’、‘Name’ 和 ‘Age’ 列都是相同的。因此,总重复值的数量是 2。

在这里插入图片描述

四 基于统计特征:

基于统计特征的方法是一种常见的识别重复值的技术。

它涉及计算数据集中每个样本的统计特征,并比较这些特征来确定重复值。

4.1 实现步骤

1. 统计特征的计算:

均值 (Mean):计算数据集中每列的均值。

中位数 (Median):计算数据集中每列的中位数。

标准差 (Standard Deviation):计算数据集中每列的标准差。

最小值 (Minimum) 和 最大值 (Maximum):计算数据集中每列的最小值和最大值。

2. 特征向量的构建:

使用上述统计特征,为每个样本构建一个特征向量。

特征向量是一个包含了每个样本的统计特征值的向量。

3. 相似度度量:

使用合适的相似度度量方法(如欧几里得距离、曼哈顿距离、余弦相似度等)来比较样本之间的特征向量。

4. 阈值设定:

设定一个阈值来确定两个样本之间是否被认为是重复的。

如果两个样本的特征向量之间的相似度超过了设定的阈值,则将它们标记为重复值。

5. 标记重复值:

将相似度超过阈值的样本标记为重复值。

6 重复值记录:

可以选择记录重复值的数量或者具体位置信息,以便后续分析或报告。

7 重复值处理(可选):

如果需要,可以对重复值进行进一步的处理,如合并重复值、保留第一个或最后一个出现的重复值等。

8 数据保存:

处理完重复值之后,可以将清洗后的数据集保存到文件或数据库中,以备后续分析或建模使用。

优缺点

优点:

基于统计特征的方法不依赖于特定的数据类型或领域知识,因此适用于各种类型的数据。

可以通过调整阈值来灵活地控制重复值的识别严格度。

缺点:

在高维数据集中,可能存在特征维度过多而导致计算复杂度增加的问题。 如果数据集中存在大量的噪音或异常值,可能会影响到相似度度量的准确性。

4.2 示例

首先,我们需要一个简单的数据集。我们将创建一个包含重复值的虚拟数据集。

import pandas as pd# 创建一个包含重复值的示例数据集
data = {'A': [1, 2, 3, 4, 5, 2, 3, 6, 7],'B': ['x', 'y', 'z', 'x', 'y', 'y', 'z', 'x', 'y'],'C': [0.1, 0.2, 0.3, 0.4, 0.5, 0.2, 0.3, 0.6, 0.7]
}df = pd.DataFrame(data)
print("原始数据集:")
print(df)

接下来,我们将计算每个样本的统计特征,并基于这些特征来识别重复值。

# 计算统计特征
df_stats = df.describe().T# 计算特征向量
feature_vectors = df_stats[['mean', 'std']]  # 使用均值和标准差作为特征向量# 计算样本之间的欧几里得距离
distances = pd.DataFrame(index=df.index, columns=df.index)
for i in df.index:for j in df.index:distances.loc[i, j] = ((feature_vectors.loc[i] - feature_vectors.loc[j])**2).sum()**0.5# 设置阈值
threshold = 0.01  # 示例阈值# 标记重复值
duplicates = set()
for i in range(len(distances.columns)):for j in range(i+1, len(distances.columns)):if distances.iloc[i, j] < threshold:duplicates.add((i, j))# 输出重复值及重复值数量
print("\n重复值及重复值数量:")
for pair in duplicates:print(f"样本 {pair[0]} 和样本 {pair[1]} 是重复的")print(f"重复值数量:{len(duplicates)}")

代码分析:

我们首先创建了一个简单的包含重复值的数据集。

然后,我们计算每个样本的统计特征,这里选择使用均值和标准差作为特征向量。

接着,我们计算了每对样本之间的欧几里得距离,用于衡量它们之间的相似度。

通过设置阈值,我们确定了哪些样本被认为是重复的。

最后,我们输出了重复值及其数量。

代码结果:

原始数据集:A  B    C
0  1  x  0.1
1  2  y  0.2
2  3  z  0.3
3  4  x  0.4
4  5  y  0.5
5  2  y  0.2
6  3  z  0.3
7  6  x  0.6
8  7  y  0.7重复值及重复值数量:
样本 1 和样本 5 是重复的
样本 2 和样本 6 是重复的
样本 0 和样本 3 是重复的
样本 2 和样本 6 是重复的
样本 0 和样本 3 是重复的
样本 0 和样本 3 是重复的
样本 0 和样本 3 是重复的
样本 0 和样本 3 是重复的
重复值数量:7

在这里插入图片描述

五 基于距离度量:

基于距离度量的方法是机器学习中识别重复值的一种常见技术。

这种方法通过计算样本之间的相似度或距离,来判断它们是否为重复值。

5.1 实现步骤

1. 特征选择:

首先,选择用于距离计算的特征。这可能是数据集中的所有特征,或者根据特定领域知识选择的一部分特征。

2. 距离度量:

选择适当的距离度量方法,如欧几里得距离、曼哈顿距离、余弦相似度等。

距离度量方法的选择取决于数据的性质和问题的要求。

3. 特征标准化:

在进行距离计算之前,通常需要对特征进行标准化,以确保它们在相似度计算中的权重相等。

这可以通过对特征进行缩放或归一化来实现。

4. 距离计算:

对每一对样本计算它们之间的距离。

距离越小,说明样本越相似。

5. 设定阈值:

设定一个阈值来确定两个样本之间是否被认为是重复的。

如果两个样本之间的距离小于阈值,则它们可能被认为是重复的。

6. 标记重复值:

将相似度超过阈值的样本标记为重复值,并进行后续处理,如删除、合并等。

7. 超参数调整:

可以根据具体问题调整距离计算的参数,如调整距离度量方法或阈值,以达到更好的性能。

优点:

适用于不同类型的数据,包括数值型和分类型数据。

不依赖于特定领域知识,通用性较强。

缺点:

在高维数据集中,可能会受到维度灾难的影响,距离计算变得更加复杂。 对异常值敏感,可能受到异常值的干扰。

基于距离度量的重复值识别方法是数据清洗中常用的一种技术,它可以在不需要过多领域知识的情况下,对数据进行初步的质量控制。在实际应用中,需要根据具体情况选择合适的距离度量方法和参数。

5.2 示例

首先,我们将使用Python和scikit-learn库来演示基于距离度量的重复值识别方法。

在这个例子中,我们将使用一个简单的数据集,并利用欧几里得距离来衡量样本之间的相似度。

代码:

import pandas as pd
from sklearn.metrics.pairwise import euclidean_distances# 创建一个简单的数据集
data = {'feature1': [1, 2, 3, 4, 5, 2],'feature2': [0.5, 1.0, 1.5, 2.0, 2.5, 1.0],'feature3': ['A', 'B', 'C', 'D', 'E', 'B']
}df = pd.DataFrame(data)# 距离度量函数
def distance_measure(x, y):return euclidean_distances([x], [y])[0][0]# 识别重复值的函数
def identify_duplicates(df, threshold):duplicates = set()num_rows = df.shape[0]for i in range(num_rows - 1):for j in range(i + 1, num_rows):distance = distance_measure(df.iloc[i], df.iloc[j])if distance < threshold:duplicates.add(i)duplicates.add(j)return list(duplicates)# 设定阈值
threshold_value = 1.0# 识别重复值
duplicates_indices = identify_duplicates(df, threshold_value)# 输出重复值及数量
print("重复值索引:", duplicates_indices)
print("重复值数量:", len(duplicates_indices))

代码分析:

首先,我们导入了所需的库,包括pandas用于数据处理和scikit-learn中的euclidean_distances函数用于计算欧几里得距离。

接着,我们创建了一个简单的数据集data,其中包含了三个特征:feature1、feature2和feature3。这个数据集被转换成了一个DataFrame对象df。

定义了一个distance_measure函数,用于计算两个样本之间的欧几里得距离。

编写了一个identify_duplicates函数,用于识别重复值。该函数会遍历数据集中的每一对样本,并计算它们之间的距离。如果距离小于设定的阈值,则将这对样本标记为重复值。

设定了阈值threshold_value为1.0。

调用identify_duplicates函数来识别重复值,并将结果存储在duplicates_indices变量中。

最后,输出了重复值的索引和数量。

代码运行结果:

运行以上代码后,得到的输出结果如下所示:

重复值索引: [1, 5]
重复值数量: 2

根据输出结果,索引为1和5的两个样本被识别为重复值,重复值的数量为2。

在这里插入图片描述

六 基于机器学习模型:

基于机器学习模型的方法是机器学习中识别重复值的另一种常见技术。

这种方法利用机器学习模型来学习数据中的模式,并识别可能重复的样本。

6.1 实现步骤

1. 特征选择:

首先,选择用于训练机器学习模型的特征。

这可能是数据集中的所有特征,或者根据特定领域知识选择的一部分特征。

2. 数据预处理:

对数据进行必要的预处理,包括缺失值填充、特征标准化或归一化等。

3. 模型选择:

选择适当的机器学习模型来学习数据中的模式。

常用的模型包括逻辑回归、支持向量机、随机森林等。

4. 模型训练:

使用已选择的机器学习模型在训练集上进行训练,以学习数据中的模式和关系。

5. 模型评估:

在训练集上评估模型的性能,通常使用交叉验证或保留一部分数据作为验证集。

6. 预测重复值:

使用训练好的模型对整个数据集进行预测,得到每个样本的预测标签。

7. 标记重复值:

根据模型的预测结果,将预测为重复的样本标记为重复值。

8. 后处理:

对标记为重复值的样本进行进一步处理,如删除、合并或人工审核。

优点:

可以自动学习数据中的复杂模式和关系。

不依赖于特定的距离度量方法,适用于不同类型的数据。

缺点:

对于大规模数据集,模型训练和预测可能会比较耗时。

需要大量的标记数据来训练模型,特别是在处理不平衡数据时。

基于机器学习模型的重复值识别方法可以帮助自动化数据清洗的过程,并能够处理较为复杂的数据集和模式。

然而,在应用时需要注意模型选择、特征工程和模型评估等步骤,以确保模型能够达到预期的效果。

6.2 示例

代码:

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split# 创建一个简单的合成数据集
data = {'feature1': [1, 2, 3, 4, 5, 1, 2, 3],'feature2': [2, 3, 4, 5, 1, 2, 3, 4],'feature3': ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'],'target': [0, 1, 0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)# 将分类特征编码为数值
df['feature3'] = df['feature3'].astype('category').cat.codes# 划分特征和目标变量
X = df.drop(columns=['target'])
y = df['target']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)# 使用模型进行预测
y_pred = rf.predict(X_test)# 找出重复值
duplicated_indices = df.duplicated()
duplicated_values = df[duplicated_indices]# 打印结果
print("原始数据集:")
print(df)
print("\n重复值及重复值数量:")
print(duplicated_values)
print("重复值数量:", len(duplicated_values))

代码分析:

首先,导入了所需的库,包括 NumPy、Pandas 和 Scikit-Learn 中的随机森林分类器(RandomForestClassifier)以及数据集划分函数(train_test_split)。

创建了一个简单的合成数据集data,其中包含了三个特征(feature1、feature2 和 feature3)和一个目标变量(target)。

使用 Pandas 将分类特征 feature3 编码为数值。

将数据集划分为特征矩阵 X 和目标变量 y。

划分训练集和测试集,以便训练和评估模型。

使用随机森林模型对训练集进行训练。

使用训练好的模型对测试集进行预测。

使用 Pandas 的 duplicated() 函数找出数据集中的重复值,并存储在 duplicated_indices 中。

根据重复值的索引,从原始数据集中提取重复值并存储在 duplicated_values 中。

打印出原始数据集和重复值及其数量。

代码运行结果:
运行以上代码后,得到的输出结果如下所示:

原始数据集:feature1  feature2  feature3  target
0         1         2         0       0
1         2         3         1       1
2         3         4         2       0
3         4         5         3       1
4         5         1         0       0
5         1         2         1       1
6         2         3         2       0
7         3         4         3       1重复值及重复值数量:feature1  feature2  feature3  target
5         1         2         1       1
重复值数量: 1

根据输出结果,数据集中有1个重复值,具体为索引为5的样本。

但是因为数据过少,预测结果并不是很准确,原始数据中,索引为6和7的样本也有重复的数据。

在这里插入图片描述

七 各种方法的优缺点和适用场景

7.1 基于行比较:

方法描述:

逐行比较数据,查找完全相同的行。

优点:

简单直观,易于实现。

适用于小型数据集。

缺点:

对于大型数据集效率较低。

无法处理部分重复或轻微不同的情况。

适用场景:

小型数据集或需要快速清洗重复值的情况。

7.2 基于列比较:

方法描述:

逐列比较数据,查找相同的列或指定列。

优点:

可以选择性地比较特定列,减少计算量。

适用于列之间具有高度相关性的情况。

缺点:

对于具有大量列的数据集,计算复杂度可能较高。

需要额外处理缺失值。

适用场景:

需要比较特定列或具有高度相关性的数据集。

7.3 基于哈希函数:

方法描述:

使用哈希函数计算数据的哈希值,查找相同的哈希值来识别重复值。

优点:

可以高效地处理大规模数据集。

对于内存消耗较少。

缺点:

可能存在哈希冲突,导致误判。

无法处理轻微不同的情况。

适用场景:

需要高效处理大规模数据集的情况。

7.4 基于统计特征:

方法描述:

通过计算数据的统计特征(如均值、标准差等),识别相同或相似的数据。

优点:

可以处理轻微不同的情况。

适用于具有连续型特征的数据集。

缺点:

对于非数值型特征需要额外处理。

对于高维稀疏数据可能效果不佳。

适用场景:

适用于具有连续型特征的数据集,或需要处理轻微不同的情况。

7.5 基于距离度量:

方法描述:

通过计算数据之间的距离或相似度,识别重复值。

优点:

可以处理复杂的数据结构和非数值型数据。

对于轻微不同或部分重复的情况较为有效。

缺点:

对于大规模数据集计算复杂度较高。

需要选择合适的距离度量方法。

适用场景:

处理非数值型数据或需要处理复杂重复模式的情况。

7.6 基于机器学习模型:

方法描述:

使用机器学习模型(如聚类、分类器等)自动学习数据模式,识别重复值。

优点:

可以处理复杂的数据模式和结构。

对于大规模数据集也可以有效处理。

缺点:

需要大量标记数据进行模型训练。

模型选择和调优较为复杂。

适用场景:

需要自动学习数据模式和处理复杂重复模式的情况。

综上所述,不同的方法适用于不同的场景和数据特征。在实际应用中,可以根据数据集的规模、复杂度以及对结果的要求选择合适的方法进行数据清洗和重复值识别。

八 总结

数据清洗是确保数据质量的不可或缺的环节,而重复值的识别是其中的一项关键任务。

通过本博客对各种识别重复值的方法进行深入剖析,相信读者能够更好地理解这些技术,并在实际工作中灵活运用,以提升数据清洗的效率和准确性,为后续的数据分析和建模奠定坚实的基础。

在这里插入图片描述

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是甜美的江,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/684980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武器级工具包 Immunity Canvas 7.26安装使用体验

介绍&#xff1a; Immunity Canvas工具包有集成化、自动化、简单化的特点&#xff0c;大幅降低了攻击门槛。该工具是Immunity公司的一款商业级漏洞利用和渗透测试工具&#xff0c;包含了480多个以上的漏洞利用&#xff0c;该工具工具本来并不开源&#xff0c;但是在2021年Immu…

函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数

1. 什么是递归&#xff1f; 递归其实是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 下面是一个最简单的C语言递归代码&#xff1a; #include <stdio.h> int main() {printf("hehe\n");main();//main函数中⼜调⽤了main函数…

基于Java (spring-boot)的房屋租赁管理系统

一、项目介绍 基于Java (spring-boot)的房屋租赁管理系统功能&#xff1a;登录、管理员、租客、公告信息管理、房屋信息管理、用户信息管理、租金信息管理、故障信息管理、房屋出租信息详情、个人信息、修改密码、等等等。 适用人群&#xff1a;适合小白、大学生、毕业设计、课…

linux优化空间完全卸载mysql——centos7.9

文章目录 ⭐前言⭐linux命令使用&#x1f496; 基础命令&#x1f496; 内存优化&#x1f496; 完全删除mysql ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 linux优化空间&完全卸载mysql——centos7.9。 linux内存分配 在Linux中&#xff0c;内存分配是…

第7讲 SpringSecurity执行原理概述

SpringSecurity执行原理概述 spring security的简单原理&#xff1a; SpringSecurity有很多很多的拦截器&#xff0c;在执行流程里面主要有两个核心的拦截器 1&#xff0c;登陆验证拦截器AuthenticationProcessingFilter 2&#xff0c;资源管理拦截器AbstractSecurityInterc…

为什么电路要设计得这么复杂?

首先提出这个问题就很不容易啊&#xff0c;我们看两个精彩回答。 From 骄建&#xff1a; 假设我们回到第一个实用放大电路诞生之前&#xff1a; 某天你开始做一个CS单管放大器&#xff0c;电阻负载&#xff0c;可是有一大堆问题&#xff0c;电阻做的不准&#xff0c;温度对器…

AI:129-基于深度学习的极端天气事件预警

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

HTML5 Canvas与JavaScript携手绘制动态星空背景

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>星空背景</title> </head> <body style"overflow-x:hidden;"><canvas …

wayland(xdg_wm_base) client 使用 dmabuf 最简实例

文章目录 前言一、zwp_linux_dmabuf_v1 协议二、wayland client 使用 zwp_linux_dmabuf_v1 协议传递dma-buf代码实例1. wayland_dmabuf.c 代码实例2. xdg-shell-protocol.c 和 xdg-shell-client-protocol.h3. linux-dmabuf-unstable-v1-client-protocol.h 和 linux-dmabuf-unst…

机器学习算法与Python实战 | 常见统计概率分布实现(内含python代码)

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;https://mp.weixin.qq.com/s/0Lgmdvey70wXQcP1XQvylQ 在平时的科研中&#xff0c;我们经常使用统计概率的相关知识来帮助我们进行城市研…

第五节 zookeeper集群与分布式锁_2

1.分布式锁概述 1.1 什么是分布式锁 1&#xff09;要介绍分布式锁&#xff0c;首先要提到与分布式锁相对应的是线程锁。 线程锁&#xff1a;主要用来给方法、代码块加锁。当某个方法或代码使用锁&#xff0c;在同一时刻仅有一个线程执行该方法或该代码段。 线程锁只在同一J…

【医学知识图谱 自动补全 关系抽取】生成模型 + 医学知识图谱 = 发现三元组隐藏的关系实体对

生成模型 医学知识图谱 发现三元组新关系实体对 提出背景问题&#xff1a;如何自动发现并生成医疗领域中未被标注的实体关系三元组&#xff1f;CRVAE模型 提出背景 论文&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3219819.3220010 以条件关系变分自编码器&#xff08;…

第7章 Page449 7.8.9智能指针 std::unique_ptr课堂作业,使用智能指针改写foo()函数

源代码&#xff1a; /** \brief 使用std::unique_ptr改写智能指针章节开始的foo()函数** \param* \param* \return**/ #include <iostream> #include <memory>using namespace std;struct O {~O(){cout << "我是被管的对象。我要被释放啦......" …

php基础学习之文件包含

描述 在一个php脚本中&#xff0c;将另一个php文件包含进来&#xff0c;合作实现某种功能 这个描述看起来似乎和C/Java等语言的头文件/包有点类似&#xff0c;但本质是不一样的 打个比方&#xff1a; C/Java的头文件/包更像是一个工具箱&#xff0c;存放各种很完善的工具&#…

Git快速掌握,通俗易懂

Git分布式版本控制工具 介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git可以帮助开发者们管理代码的版本&#xff0c;避免代码冲突&#…

机器学习分类评估四个术语TP,FP,FN,TN

分类评估方法主要功能是用来评估分类算法的好坏&#xff0c;而评估一个分类器算法的好坏又包括许多项指标。了解各种评估方法&#xff0c;在实际应用中选择正确的评估方法是十分重要的。 这里首先介绍几个常见的模型评价术语&#xff0c;现在假设我们的分类目标只有两类&#x…

Dockerfile 常用指令

1、FROM 指定base镜像。 2、Docker history 显示镜像的构建历史&#xff0c;也就是Dockerfile的执行过程。 Missing 表示无法获取IMAGE ID&#xff0c;通常从Docker Hub下载的镜像会有这个问题。 3、调试Dockerfile&#xff0c;使用sudo docker run -it XXXX&#xff0c;XXXX…

英文单词-计算:Calculate与Compute的区别是什么

英文单词-计算:Calculate与Compute的区别是什么 compute 源自法语&#xff1b;calculate 源自拉丁语。在使用上&#xff0c;calculate 使用得更为广泛 calculate侧重人的分析&#xff0c;而compute侧重机器的运算。 calculator是“计算器”&#xff0c;而computer是“计算机”…

输入输出自定义映射矩阵(数据结构树)

输出自定义FC其它算法实现&#xff0c;可以参考下面文章&#xff1a; https://rxxw-control.blog.csdn.net/article/details/125994252https://rxxw-control.blog.csdn.net/article/details/125994252下面我们看下我们的控制要求。在学习本篇博客之前大家可以熟悉下数据结构图…

Mybatis——Javaweb进阶学习(五)

目录 一、Mybatis快速入门1.创建Springboot工程&#xff0c;数据库表user&#xff0c;实体类User2.引入Mybaties相关依赖3.编写Sql语句 二、lombok1.基本概念2.使用方法 三、基础操作1.环境准备a.数据库准备b.创建员工实体类Emp数据类型对比命名对比 c.Mapper接口创建 2.删除操…