模型验证前怎么查重复样本?用行指纹核对训练集和验证集

表格模型验证前,要先查训练集和验证集有没有完全相同的特征行。重复行若来自同一原始记录的复制,验证分数可能偏乐观;同一特征行若对应不同标签,还要回查标注。下面用稳定的行指纹找出跨集合匹配,并保留两边编号供人工核实。

表格模型验证前,要先查训练集和验证集有没有完全相同的特征行。重复行若来自同一原始记录的复制,验证分数可能偏乐观;同一特征行若对应不同标签,还要回查标注。下面用稳定的行指纹找出跨集合匹配,并保留两边编号供人工核实。

准备环境与教学数据

以下代码已在 Windows 的 Python 3.11 独立环境运行。文中数据是人为构造或库自带的教学样本,不代表任何业务系统的效果;例子不调用在线大模型。

模型验证前怎么查重复样本?用行指纹核对训练集和验证集

在空目录把完整代码保存为 demo.py,运行 python demo.py;本例只用 Python 标准库。

Python 3.11 标准库,无需额外安装依赖

先确定比较的字段和精度

例子使用两列整数特征,训练集4行、验证集4行,故意让验证集里的两行与训练集完全一致,其中一行标签也一致,另一行标签冲突。指纹只覆盖两列特征,不把标签放进去,否则相同特征、不同标签的矛盾会被漏掉。

把特征按固定列顺序序列化为 JSON,再计算 SHA-256;程序还在指纹命中后比较原始特征元组,避免仅凭摘要判定相等。实际表格还需先约定缺失值、浮点精度、时间字段和类别编码的规范化方式,不能任意四舍五入后把不同样本变成“重复”。

把命中行送回来源核查

输出 train_id、valid_id 和标签是否冲突。结果是候选清单,不是自动删行命令:同样的数值组合可能由不同真实对象产生;如果目标是预测新用户,还应按用户 ID 分组检查,而不是只看特征完全相同。

这里仅排查结构化表格跨训练与验证集合的完全重复。文本近重复、图片相似和同一实体的不同记录需要另外设计比较规则。核实为复制记录后,在重新切分或按实体隔离后重跑验证,保留处理前后的行数与样本 ID。

完整可运行代码

import hashlib
import json

train = [
    {"id": "T01", "features": [1, 2], "label": 0},
    {"id": "T02", "features": [3, 4], "label": 1},
    {"id": "T03", "features": [5, 6], "label": 0},
    {"id": "T04", "features": [7, 8], "label": 1},
]
valid = [
    {"id": "V01", "features": [9, 0], "label": 0},
    {"id": "V02", "features": [3, 4], "label": 1},
    {"id": "V03", "features": [1, 2], "label": 1},
    {"id": "V04", "features": [6, 5], "label": 0},
]
def row_fingerprint(values):
    encoded = json.dumps(values, ensure_ascii=False,
                         separators=(",", ":")).encode("utf-8")
    return hashlib.sha256(encoded).hexdigest()

index = {}
for row in train:
    index.setdefault(row_fingerprint(row["features"]), []).append(row)
matches = []
for row in valid:
    for earlier in index.get(row_fingerprint(row["features"]), []):
        if tuple(earlier["features"]) == tuple(row["features"]):
            matches.append((earlier["id"], row["id"],
                            earlier["label"] != row["label"]))
for train_id, valid_id, conflict in matches:
    print("train_id", train_id, "valid_id", valid_id,
          "label_conflict", conflict)
print("cross_split_exact_matches", len(matches))
assert matches == [("T02", "V02", False), ("T01", "V03", True)]

运行结果与核对

下列是本文代码在上述环境的实际输出。更换运行环境时,先核对输入、代码和断言,再比较输出数值。

train_id T02 valid_id V02 label_conflict False
train_id T01 valid_id V03 label_conflict True
cross_split_exact_matches 2

输出必须有 T02→V02 与 T01→V03 两组跨集合完全重复,后者的 label_conflict 为 True。换成真实表后先核对特征列与序列化顺序,再按样本编号和来源文件逐项核查命中行;不能直接把所有命中行删除。

适用边界

8行都是人工构造的整数教学数据,指纹只识别指定两列完全相同,不识别近重复、同一用户的不同记录或改写过的文本。相同特征值不必然等于同一真实对象;最终是否泄漏取决于记录来源和验证目标。

常见问题

把标签一起算进行指纹更保险吗?

不适合本题。同样的特征若存在不同标签,标签入指纹会让这对冲突记录不匹配。先按特征生成候选,再单独比较标签与来源。

参考资料

以下接口行为依据官方文档核对于 2026 年 10 月 1 日;本文的运行结果仅覆盖上述教学输入。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31766.html

赞 (0)
AI小管家的头像AI小管家
回归模型对哪些业务组误差大?按预定义分组计算 MAE 与样本数
上一篇 2小时前
回归模型 MAPE 为什么会暴涨?检查零真值并对照 MAE
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部