【机器学习】解决数据不平衡问题——SMOTE(合成少数类过采样技术)

前言

在机器学习的广阔领域中,数据不平衡问题如同一道隐形的障碍,悄然影响着模型的性能与准确性。当数据集中某一类别的样本数量远少于其他类别时,便形成了数据不平衡现象。这种不平衡不仅使得模型难以学习到少数类的特征,还往往导致模型在预测时偏向于多数类,从而忽略了少数类的重要性。

例如在交易欺诈的预测中,正常交易的数据的量级要远高于欺诈交易的数据规模,从而导致对欺诈交易数据的学习不够充分而无法进行预测。

数据不平衡问题不仅影响分类任务的精度,还可能在医疗诊断、金融欺诈检测等关键领域引发严重的后果。为了应对这一挑战,研究者们提出了多种解决方案,其中过采样欠采样是两种常见且有效的策略。过采样通过增加少数类样本来平衡数据集,而欠采样则通过减少多数类样本来达到同样的目的。

SMOTE基本原理

SMOTE(Synthetic Minority Over-sampling Technique,合成少数类过采样技术),顾名思义,SMOTE是一种通过算法合成少数类样本的过采样技术。它的基本思想是在少数类样本之间插值来生成新的样本。具体步骤如下:

输入:数据集中的少数类样本 X_min
输出:用于平衡类分布的合成样本 X_syn

1. 计算要生成的合成样本数量:主要看多数样本和少数样本之间的差距

2. 确定最近邻:SMOTE主要用到K-近邻算法来确定生成合成样本的依据,因此要提前确定K值(通常取5)

3. 选择少数样本:从少数样本中随机选择一个样本X

4. 确定K近邻:在少数类样本集中找到x的k个最近邻N(即与x距离最近的k个样本)。这通常通过计算样本间的距离(如欧氏距离等)来实现。

5. 合成新样本:在K近邻中随机选取一个样本X',在样本X和样本X'之间插补新样本X_new。可以是X_new = X + rand(0,1)*(X' - X)【大概这么个随机方法】

6. 迭代:对少数类中的每一个样本,或者只对其中的一部分样本(为了控制生成新样本的数量),重复上述过程,直到达到所需的样本数量。

SMOTE的优缺点

优点

  • 提高分类器性能:通过平衡数据集,SMOTE可以帮助分类器更好地学习少数类的特征,从而提高对少数类的识别能力。
  • 灵活性:可以通过调整k值和生成新样本的数量来控制过采样的程度。
  • 适用性广:可以应用于各种分类算法,包括但不限于决策树、支持向量机、神经网络等。

缺点

  • 过拟合风险:如果生成的样本过于接近原始样本,可能会增加过拟合的风险。
  • 边界样本问题:在边界附近的样本生成新样本时,可能会引入噪声或产生不符合实际的数据点。
  • 计算成本:对于大型数据集,计算k个最近邻可能会非常耗时。

SMOTE的python实现

在Python中,我们可以使用imbalanced-learn库中的SMOTE类来实现SMOTE算法。

from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE

# 创建一个不平衡的数据集,不平衡比例为2%比98%
X, y = make_classification(n_classes=2, class_sep=2,
                           weights=[0.02, 0.98], n_informative=3, n_redundant=1, flip_y=0,
                           n_features=4, n_clusters_per_class=1, n_samples=200000, random_state=66)

print('原始数据集形状 %s' % Counter(y))

# 应用SMOTE
sm = SMOTE(random_state=38)
X_res, y_res = sm.fit_resample(X, y)

print('重采样后的数据集形状 %s' % Counter(y_res))

运行结果如下:

SMOTE改进

为了克服SMOTE的一些缺点,研究者们提出了多种改进版本,如Borderline-SMOTE、ADASYN(Adaptive Synthetic Sampling)等。这些改进版本通过不同的策略来选择用于生成新样本的原始样本,或者调整生成新样本的方式,以提高算法的性能和稳定性。

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值