如何从train训练集中移除已有的val数据以生成新训练子集?
训练集过滤验证集重复样本实现方案
核心逻辑为匹配两个数据集的样本特征,剔除训练集中和验证集完全一致的样本即可,下面分常用的几种数据集格式给出实现代码:
- 如果你用的是Pandas DataFrame格式存储数据集
import pandas as pd # val_data = 过往实验得到的验证集 # train_data = 当前待处理的训练集 # 方法1:全字段匹配,适合没有唯一样本ID的场景 val_sample_keys = val_data.apply(tuple, axis=1).tolist() # 过滤出训练集里不在验证集中的样本 new_data = train_data[~train_data.apply(tuple, axis=1).isin(val_sample_keys)].reset_index(drop=True) # 方法2:有唯一样本ID/文件名的场景,效率更高 # new_data = train_data[~train_data['样本ID字段名'].isin(val_data['样本ID字段名'])].reset_index(drop=True)
- 如果你用的是普通Python列表存储样本(比如每个元素是字典、数组、文本字符串)
# 把验证集样本转成可哈希的格式存入集合,匹配效率远高于列表遍历 val_sample_set = set() for sample in val_data: # 字典格式样本就取所有值拼接成元组,其他格式直接转元组即可 sample_key = tuple(sample.values()) if isinstance(sample, dict) else tuple(sample) val_sample_set.add(sample_key) new_data = [] for sample in train_data: sample_key = tuple(sample.values()) if isinstance(sample, dict) else tuple(sample) if sample_key not in val_sample_set: new_data.append(sample)
- 如果你用的是Hugging Face Datasets格式的数据集
from datasets import Dataset def generate_sample_key(sample, col_list): # 按数据集的字段拼接生成唯一匹配键,无关字段可以直接排除 return tuple(sample[col] for col in col_list) val_keys = set(generate_sample_key(sample, val_data.column_names) for sample in val_data) # 过滤规则:样本不在验证集键集合里就保留 new_data = train_data.filter(lambda x: generate_sample_key(x, val_data.column_names) not in val_keys)
注意点:
- 数据集体量较大时优先用唯一ID匹配,不要全字段遍历,能大幅提升运行速度
- 生成匹配键的时候要排除和样本内容无关的字段(比如存储时附加的训练时间、处理时间戳字段),避免误删有效样本
内容的提问来源于stack exchange,提问作者manlike
相关产品推荐
相关产品推荐

