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

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

数据清洗之识别重复值

  • 一 重复值的概念与危害
    • 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 基于机器学习模型:

方法描述:

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

优点:

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

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

缺点:

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

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

适用场景:

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

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

八 总结

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

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

在这里插入图片描述

这篇文章到这里就结束了

谢谢大家的阅读!

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

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

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React入门到精通:掌握前端开发的必备技能!

介绍&#xff1a;React是一个由Facebook开发和维护的JavaScript库&#xff0c;用于构建用户界面&#xff0c;特别是用于构建单页应用程序和移动应用程序的用户界面。以下是对React的详细介绍&#xff1a; 虚拟DOM&#xff1a;React通过使用虚拟DOM&#xff08;Document Object …

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…

C语言指针(初阶)

文章目录 1:内存与地址1.1内存1.2:如何理解编址 2:指针变量与地址2.1:指针变量与解引用操作符2.1.1:指针变量2.1.2:如何拆解指针类型2.1.3:解引用操作符 2.2:指针变量的大小 3:指针变量类型的意义代码1解引用修改前解引用修改后 代码2解引用修改前解引用修改后 4:const修饰指针…

RSIC-V“一芯”学习笔记(三)——读后感以及部分PA0工作

文章目录 一、别像弱智一样提问二、提问的智慧三、安装linux以及配置问题3.1 关于问题配置 一、别像弱智一样提问 提问前&#xff0c;应该清晰问自己几个问题&#xff0c;1. 是否尝试了在搜索引擎进行搜索过2. 相关的手册和文档是否看了3. 找找有没有常见的问题文档&#xff0…

Android Jetpack:提高开发效率的终极工具集

Android Jetpack&#xff1a;提高开发效率的终极工具集 1. 引言 Android Jetpack是一套为Android应用程序开发提供帮助的工具集。它旨在简化开发流程&#xff0c;提高开发效率&#xff0c;并提供一致的用户体验。无论您是新手还是经验丰富的开发者&#xff0c;Jetpack都可以为…

命令行参数和环境变量

命令行参数 命令行参数是在用户在命令行中输入命令时&#xff0c;跟随命令一起输入的一些附加信息。这些参数可以用来配置命令的行为或传递一些数据给命令。 让同样的程序在不同的命令行参数下运行出不同的结果&#xff01; 将这些命令和参数可以传给 main 函数生&#xff0…

Junit5基础教程

文章目录 一&#xff0c;导入依赖二&#xff0c;基本功能一、常用断言二、执行顺序和常用注解1、通过BeforeAll类的注解来保证顺序2、通过order注解来保证执行顺序 三、依赖测试四、参数化测试五、测试套件SelectPackages、IncludePackages、SelectClasses、IncludeTags等注解的…

苹果手机充电充不进去怎么办?这里有你想要的一些故障排除技巧

当你的iPhone插上充电器或将其放在无线充电器上充电时,稍后再检查发现它没有充电,怎么办呢?可能的原因不少。让我们来看看一些最常见的iPhone充电问题,以及你能做些什么。 常规故障排除提示 故障排除中最基本的技术之一是用已知的好的相同组件代替不起作用的组件,如把你的…

【复现】cellinx摄像设备 未授权漏洞_50

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 cellinx是一家韩国的摄像设备 二 .漏洞影响 通过未授权访问可以创建用户进入后台&#xff0c;可能造成系统功能破坏。 三.漏洞复…

python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

1、视频推流 参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示:ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/…

挑战杯 python的搜索引擎系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

租赁香港服务器多少钱一个月?24元

阿里云香港服务器2核1G、30M带宽、40GB ESSD系统盘优惠价格24元/月&#xff0c;288元一年&#xff0c;每月流量1024GB&#xff0c;多配置可选&#xff0c;官方优惠活动入口 https://t.aliyun.com/U/bLynLC 阿里云服务器网aliyunfuwuqi.com分享阿里云香港服务器优惠活动、详细配…

图像识别基础之模板匹配

principle 图像匹配 本质&#xff1a;图像的相似度很高(矩阵的相似度很高) code /*\brief 我的图像匹配函数&#xff0c;获取差方和均值最小的矩阵作为结果\param srcPicFile:用以匹配的图像文件\param templatePicFile:模板图像文件\param destPicFile:输出的检测结果文件…

【方法】如何打开带密码的RAR分卷压缩文件?

RAR分卷文件是一种特殊的RAR压缩文件格式&#xff0c;也就是将文件压缩成多个相同大小的压缩包&#xff0c;可以更方便传输。那如果收到了带有密码的RAR分卷压缩文件&#xff0c;要如何打开呢&#xff1f; 无论RAR分卷压缩文件是否设置了密码保护&#xff0c;在打开或者解压分…

数据结构与算法:双向链表

朋友们大家好啊&#xff0c;在上节完成单链表的讲解后&#xff0c;我们本篇文章来对带头循环双向链表进行讲解 双向链表 双向链表、头节点和循环的介绍构建双向链表节点的构建初始化双向循环链表&#xff08;空链表&#xff09;销毁双向链表 链表的打印双向链表头尾的插与删尾插…

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

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

【C语言】指针的进阶篇,深入理解指针和数组,函数之间的关系

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】指针的进阶篇&#xff0c;深入理解指针和数组&#xff0c;函数之间的关系&#xff0c;图文讲解其他指针类型以及指针和数组&#xff0c;函数之间的关系&#xff0c;带大家更深刻理解指针&#xff0c;以及数组指针&#xf…

谁拿了最多奖学金——NOIP 2005 提高组

输入样例&#xff1a; 4 YaoLin 87 82 Y N 0 ChenRuiyi 88 78 N Y 1 LiXin 92 88 N N 0 ZhangQin 83 87 Y N 1 输出样例&#xff1a; ChenRuiyi 9000 28700 这道题用结构体做对吧 #include <bits/stdc.h> using namespace std; class student{public:string name;int FG…

Springboot+vue的大学生智能消费记账系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的大学生智能消费记账系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的大学生智能消费记账系统的设计与实现&#xff0c;采…

Midjourney绘图欣赏系列(三)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…