训练集与测试集划分前或后执行欠采样的合理性探讨——基于信用卡欺诈不平衡数据集的技术问询
关于不平衡数据集采样时机的关键问题解答
首先直接给你明确结论:绝对不应该在划分训练集和测试集之前进行欠采样(或者任何形式的采样操作,包括过采样),这种操作会严重破坏测试集的分布,让你的模型评估结果完全脱离真实场景,根本不具备参考价值。
为什么划分前采样会出问题?
你在划分前做欠采样后,整个数据集的类别比例被改成了接近1:1(因为砍掉了大部分多数类的非欺诈样本),这时候你的测试集也跟着变成了均衡分布。模型在这种测试集上得到的“优异精确率”完全是虚假的——真实场景里非欺诈交易占98%,模型面对的是极不均衡的样本,而你用均衡的测试集去评估,相当于给模型开了“作弊模式”,结果根本不能反映它在实际中的表现。
为什么训练集单独欠采样时精确率差?
这反而才是模型在真实场景下的真实表现:
- 召回率保持不变,说明你的模型确实学到了识别欺诈样本的特征,能抓住大部分欺诈交易(毕竟训练时你通过欠采样给了模型足够多的欺诈样本进行学习);
- 精确率低,是因为测试集保留了原始的98%非欺诈比例,模型可能会把一些非欺诈样本误判成欺诈——这是不平衡数据模型的常见现象,毕竟非欺诈样本基数太大,哪怕误判率很低,累积起来的误判数量也会拉低精确率。这个结果反而更能帮你判断模型在真实场景中的实际效果。
关于“采样破坏分布”的适用范围
别搞错了:不管是欠采样还是过采样,都不能在划分训练测试集之前做。测试集的核心作用是模拟真实的业务环境,必须严格保留原始数据的分布特征。任何提前对整体数据的采样操作,都会污染测试集的分布,让评估结果失真——这个逻辑对欠采样和过采样完全通用,没有例外。
给你的后续建议
- 坚持只在训练集上做欠采样,用原始分布的测试集评估模型;
- 不要过度纠结精确率,对于欺诈检测这类场景,召回率(尽可能抓住所有欺诈)和F1分数(平衡召回和精确)、AUC-ROC才是更重要的评估指标;
- 可以尝试其他处理不平衡数据的方法:比如给模型设置类别权重(让欺诈样本的错误惩罚更高)、用集成学习方法(比如XGBoost的
scale_pos_weight参数)、或者在训练集上用SMOTE这类过采样方法(同样只在训练集上做)。
内容的提问来源于stack exchange,提问作者Vardaan Khanted
相关产品推荐
相关产品推荐

