数据增强场景下如何规避数据泄露?现有代码方案有效性求证
你的数据增强防泄露方案完全可行!
这个思路精准命中了数据增强防泄露的核心要求:先基于原始数据集做分层划分(你用stratify=y还保证了训练/测试集的类别分布一致,这点做得很好),再将对应ID的增强数据归入原始数据所在的集合。这样一来,任何原始数据和它的所有增强副本都会被严格限制在同一集合里,绝对不会出现“副本在训练集、原始数据在测试集”这种泄露场景。
代码里的几个小优化点
- 替换已弃用的
append方法:pandas从2.0版本开始弃用了DataFrame.append,建议改用pd.concat,兼容性更好; - 简化标签提取逻辑:不用复杂的列筛选,直接提取
emotion列即可。
优化后的代码示例:
import pandas as pd from sklearn.model_selection import train_test_split # 读取数据 df = pd.read_excel("/content/drive/MyDrive/data/audio.xlsx") df2 = pd.read_excel("/content/drive/MyDrive/data/audioAUG.xlsx") # 拆分原始数据特征与标签 X = df.drop('emotion', axis=1) y = df['emotion'] # 先划分原始数据的训练/测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42, stratify=y) # 匹配对应ID的增强数据 X_train_AUG = df2[df2['id'].isin(X_train.id.to_list())] X_test_AUG = df2[df2['id'].isin(X_test.id.to_list())] # 合并特征(用concat替代append) X_train = pd.concat([X_train, X_train_AUG.drop('emotion', axis=1)]) X_test = pd.concat([X_test, X_test_AUG.drop('emotion', axis=1)]) # 合并标签 y_train = pd.concat([y_train, X_train_AUG['emotion']]) y_test = pd.concat([y_test, X_test_AUG['emotion']])
额外注意事项
- 确保
id字段的唯一性:每个原始数据的ID必须唯一,且增强数据的ID严格对应原始数据,否则会出现匹配错误; - 如果后续要做交叉验证,也要遵循同一逻辑:先按ID分组,再把整个组分配到训练或验证fold中,不能在fold内部再拆分原始数据和增强副本。
内容的提问来源于stack exchange,提问作者PM92
相关产品推荐
相关产品推荐

