样本不平衡的常用处理方法

数据不平衡

很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法取得理想的结果。因为实际数据往往分布得很不均匀,都会存在“长尾现象”,也就是所谓的“二八原理”。

不平衡程度相同的问题,解决的难易程度也可能不同,因为问题难易程度还取决于我们所拥有数据有多大。可以把问题根据难度从小到大排个序:大数据+分布均衡 < 大数据+分布不均衡 < 小数据+数据均衡 < 小数据+数据不均衡。
说明:对于需要解决的问题,拿到数据后,首先统计可用训练数据有多大,然后再观察数据分布情况。经验表明,训练数据中每个类别有5000个以上样本,其实也要相对于特征而言,来判断样本数目是不是足够,数据量是足够的,正负样本差一个数量级以内是可以接受的,不太需要考虑数据不平衡问题(完全是经验,没有理论依据,仅供参考)。

类别不平横会影响模型的效果

许多模型的输出类别是基于阈值的,例如逻辑回归中小于0.5的为反例,大于则为正例。在数据不平衡时,默认的阈值会导致模型输出倾向与类别数据多的类别。

如何解决

调整分类阈值,使得更倾向与类别少的数据。
选择合适的评估标准,比如ROC或者F1,而不是准确度(accuracy)。
采样法(sampling)来处理不平横的问题。
分为欠采样(undersampling)和过采样(oversampling)两种,过采样小样本(SMOTE),欠采样大样本。

  • 过采样:通过增加样本中小类样本的数据量来实现样本均衡。其中较为简单的方式是直接复制小类样本,形成数量上的均衡。但实际上,并没有为模型引入更多数据,过分强调正比例数据,会放大正比例噪音对模型的影响。即随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General)。
  • 欠采样:通过减少多数类样本的样本数量来实现样本均衡。其中比较简单直接的方法就是随机去掉一些数据来减少多数类样本的规模,但这种方法可能会丢失一些重要的信息。还有一种方法就是,假设少数类样本数量为N,那就将多数类样本分为N个簇,取每个簇的中心点作为多数类的新样本,再加上少数类的所有样本进行训练。这样就可以保证了多数类样本在特征空间的分布特性。
    数据合成
    SMOTE(Synthetic Minority Oversampling Technique)即合成少数类,它是基于随机过采样算法的一种改进方案,SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中。
    针对少数类样本的 x i x_{i} xi,求出其 k k k近邻,随机选取 k k k紧邻中一个样本记为 x n x_{n} xn。生成一个0到1之间的随机数r,然后根据 X n e w = x i + r ∗ ( x n − x i ) X_{new} = x_{i} + r * (x_{n} - x_{i}) Xnew=xi+r(xnxi)生成新数据。也可通过经过改进的抽样的方法,在少数类中加入随机噪声等生成数据。
    对原数据的权值进行改变
    通过改变多数类样本和少数类样本数据在训练时的权重来解决样本不均衡的问题,是指在训练分类器时,为少数类样本赋予更大的权值,为多数类样本赋予较小的权值。例如scikit-learn中的SVM算法,也称作penalized-SVM,可以手动设置权重。若选择balanced,则算法会设定样本权重与其对应的样本数量成反比。
    通过特征选择
    在样本数据较为不均衡,某一类别数据较少的情况下,通常会出现特征分布很不均衡的情况。例如文本分类中,有大量的特征可以选择。因此我们可以选择具有显著区分能力的特征进行训练,也能在一定程度上提高模型的泛化效果。
    通过组合集成方法解决
    通过训练多个模型的方式解决数据不均衡的问题,是指将多数类数据随机分成少数类数据的量N份,每一份与全部的少数类数据一起训练成为一个分类器,这样反复训练会生成很多的分类器。最后再用组合的方式(bagging或者boosting)对分类器进行组合,得到更好的预测效果。简单来说若是分类问题可采用投票法,预测问题可以采用平均值。这个解决方式需要很强的计算能力以及时间,但效果较好,相当于结合了组合分类器的优势。

注:
采样方法一般比直接调阈值效果好。
使用采样方法一般可以提升模型的泛化能力,但有一定的过拟合的风险,应和正则搭配使用。
过采样大部分时候比欠采样效果好,但很难一概而论哪种方法好,还是要根据数据的特性具体讨论。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以提供一个关于如何使用 SMOTE 处理样本平衡的示例。SMOTE 是一种常用处理样本平衡方法,它可以通过合成新的少数类样本来增加数据集中的少数类样本数量,从而提高模型的预测能力。下面是一个使用 SMOTE 处理样本平衡的示例: 假设我们有一个二分类问题,其中正样本数量为 1000,负样本数量为 100。由于样本平衡,我们需要使用 SMOTE 来生成新的少数类样本。具体步骤如下: 1. 导入 SMOTE 库和数据集。 ```python from imblearn.over_sampling import SMOTE import pandas as pd data = pd.read_csv('data.csv') X = data.drop('label', axis=1) y = data['label'] ``` 2. 使用 SMOTE 生成新的少数类样本。 ```python smote = SMOTE() X_smote, y_smote = smote.fit_resample(X, y) ``` 3. 查看生成的新样本数量。 ```python print('原始数据集中正样本数量:', sum(y==1)) print('原始数据集中负样本数量:', sum(y==0)) print('SMOTE 生成的新样本数量:', len(y_smote) - len(y)) ``` 4. 使用生成的新样本训练模型。 ```python from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression X_train, X_test, y_train, y_test = train_test_split(X_smote, y_smote, test_size=0.2, random_state=42) model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` 通过以上步骤,我们可以使用 SMOTE 处理样本平衡,并训练出一个预测能力更强的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值