4、过采样方法:随机过采样、SMOTE算法原理、SMOTE变种
好,咱们接着聊样本不平衡的处理。上一节讲了欠采样,说白了就是砍掉多数样本。那这一节我们聊聊另一种思路——过采样,也就是给少数类“增员”。
我个人的习惯是,遇到不平衡问题,先试试过采样。为什么?因为你不丢数据啊。欠采样扔掉那么多样本,有时候挺心疼的。尤其是当你的数据本身就不多的时候,过采样往往是更好的选择。
4.1 随机过采样
先讲最简单的——随机过采样。名字听着挺唬人,其实原理特别朴素:从少数类样本里随机复制一些样本,直到多数类和少数类的数量差不多。
举个例子,假设你有1000个正样本(好人),100个负样本(坏人)。随机过采样就是把这100个坏人复制9遍,变成1000个坏人。好了,现在正负样本一样多了。
核心要点:随机过采样只是简单复制,没有生成新样本。
听起来很简单对吧?但这里有个坑。我曾经在一个信贷风控项目里用过随机过采样,结果模型训练出来,在验证集上表现特别差。后来一查,发现模型把很多重复的样本都“背”下来了,泛化能力很差。
⚠️ 避坑指南:随机过采样容易导致过拟合。因为复制的样本和原始样本一模一样,模型会记住这些重复样本,而不是学到真正的规律。
那怎么办?别急,下面这个算法就是来解决这个问题的。
4.2 SMOTE算法原理
SMOTE,全称是Synthetic Minority Over-sampling Technique,中文叫“合成少数类过采样技术”。这名字有点长,你记住SMOTE就行。
SMOTE的核心思想是:不复制样本,而是合成新样本。怎么合成?我画个图你就明白了。
SMOTE的步骤其实就三步:
- 选一个少数类样本,比如图中红色的点
- 找到它的k个近邻(通常k=5),图中我用虚线连了3个
- 在连线上随机插值,生成新的绿色样本
具体怎么插值?公式很简单:
新样本 = 原始样本 + 随机数 × (近邻样本 - 原始样本)
这里的随机数在0到1之间。你想想看,如果随机数是0.5,那新样本就在两个样本的正中间。如果是0.2,就靠近原始样本一些。
💡 我的经验:SMOTE的k值一般设5。但如果你发现生成的样本质量不好,可以调小一点。我在一个医疗诊断项目里,数据特别稀疏,k值调到了3才有效果。
4.3 SMOTE的局限性
SMOTE虽然比随机过采样好很多,但它也不是万能的。我遇到过两个典型问题:
问题一:边界模糊
SMOTE在生成样本时,不考虑样本在特征空间中的位置。如果少数类样本正好在边界上,SMOTE可能会生成一些“不伦不类”的样本,反而增加了分类难度。
问题二:噪声放大
如果少数类样本里有噪声点,SMOTE会基于这个噪声点生成更多噪声样本。这就像你在一张模糊的照片上不断复制模糊的像素,结果只会更模糊。
那怎么解决?下面这两个变种就是干这个的。
4.4 Borderline-SMOTE
Borderline-SMOTE,顾名思义,它关注的是边界上的样本。它的思路是:只有那些“危险”的样本才值得生成新样本。
怎么判断一个样本是否“危险”?看它周围多数类样本的数量:
- 安全样本:周围全是少数类样本,这种样本不用管
- 危险样本:周围多数类和少数类各占一半,这种样本需要重点关注
- 噪声样本:周围全是多数类样本,这种样本应该忽略
Borderline-SMOTE只对“危险样本”进行SMOTE操作。这样做的好处是:生成的样本集中在决策边界附近,能有效提升分类器的边界区分能力。
核心区别:SMOTE对所有少数类样本一视同仁,Borderline-SMOTE只对边界样本进行过采样。
我记得有一次做信用卡欺诈检测,正负样本比例是1:1000。用普通SMOTE效果一般,换成Borderline-SMOTE后,召回率提升了15%。为什么?因为欺诈样本和正常样本的边界本来就很模糊,Borderline-SMOTE正好强化了边界区域。
4.5 ADASYN
ADASYN,全称是Adaptive Synthetic Sampling,自适应合成采样。它比Borderline-SMOTE更进一步。
ADASYN的核心思想是:根据样本的“困难程度”来决定生成多少新样本。越难分类的样本,生成的新样本越多。
具体怎么做?
- 计算每个少数类样本的“困难度”——也就是它周围多数类样本的比例
- 根据困难度分配权重,困难度越高,权重越大
- 按照权重比例生成新样本
说白了,ADASYN就是给每个少数类样本分配一个“生娃指标”。越难搞定的样本,指标越高,生的孩子越多。
| 方法 | 核心策略 | 适用场景 | 缺点 |
|---|---|---|---|
| 随机过采样 | 简单复制少数类样本 | 数据量小,快速验证 | 容易过拟合 |
| SMOTE | 在近邻间插值生成新样本 | 通用场景 | 边界模糊,噪声放大 |
| Borderline-SMOTE | 只对边界样本过采样 | 边界模糊的数据集 | 忽略了内部样本 |
| ADASYN | 根据困难度自适应生成 | 噪声较多,分布不均 | 对噪声敏感 |
4.6 实战建议
说了这么多,到底该用哪个?我个人的经验是这样的:
- 先试SMOTE,它是最通用的选择,80%的场景都能搞定
- 如果边界模糊,换成Borderline-SMOTE
- 如果数据分布极不均匀,试试ADASYN
- 随机过采样?嗯,除非你只是想快速跑个基线模型,否则我建议别用
⚠️ 重要提醒:过采样一定要在训练集上做,千万不要在验证集或测试集上做。否则你的模型评估结果会虚高,上线后直接翻车。我曾经见过一个同事,把过采样放在了整个数据集上,结果模型上线后效果惨不忍睹。
好了,过采样这部分就讲到这里。记住一句话:过采样的本质是“增员”,但怎么增、增多少,这里面大有讲究。选对方法,你的模型效果能上一个台阶。