利用采样方法解决数据样本不平衡问题

一. 什么是样本不平衡

对于一个二分类问题,若两个类别的样本数目相差很大,那么在模型训练时会出现很严重的问题。

举一个简单的例子:对一个图片集分类,其中狗有990张,猫有10张,像这样属于某一分类的数据量与其他分类的数据量相比很少的情况就称为不平衡。这时在模型里只需要把所有输入的样本都预测分类为狗就可获得99%的准确率,而这样训练得到的分类器却是没有用(价值)的,因为该模型无法预测分类出为猫的图片,即分类器预测分类失败。

二. 对样本不平衡的处理

为了解决类别不平衡问题,我们可以采取以下方法:

  1. 对不同分类的数据赋予权重,即选择调整阈值,使模型适应较少的类别的预测分类。
  2. 选择合适的评估指标,比如ROC或F1值,而不是准确度(accuracy)。
  3. 利用采样方法,即欠采样或过采样来处理。

三.欠采样和过采样原理与示例

通过采样来调整数据的不平衡的问题具体分为欠采样和过采样两种情况:
欠采样就是从多数类的样本中删除部分样本;而过采样则是在少数类的样本中添加部分样本,如随机重复正比例的数据。

这里使用一个Python上处理数据不平衡的工具库:imblearn,作示例。

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

X, y = make_classification(n_classes=2, class_sep=2,
weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
print('Original dataset shape %s' % Counter(y))

ros = RandomOverSampler(random_state=42)
X_res, y_res = ros.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))

输出结果

Original dataset shape Counter({1: 900, 0: 100})
Resampled dataset shape Counter({0: 900, 1: 900})

虽然使用采样方法(过采样和欠采样)一般情况下可以提升模型的泛化能力,但是有一定的过拟合的风险。

因为过采样是采取随机的简单复制样本的方式来增加少数类的样本,会容易导致模型出现过拟合的问题,即削弱了模型的泛化能力。

但是如果欠采样丢弃大量的数据,则也会和过采样一样会存在过拟合的情况。

所以为了降低过拟合的风险,我们可以进行数据合成(Synthetic Minority Oversampling Technique,SMOTE)。

四.数据合成

数据合成:即合成少数类样本的过采样技术,它是基于随机过采样算法的一种改进方案,SMOTE算法的基本思想是对少数类样本分析并依据少数类样本进行人工合成新样本增加到数据集中。使用SMOTE 进行过度采样,示例如下。

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

X, y = make_classification(n_classes=2, class_sep=2,
weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
print('Original dataset shape %s' % Counter(y))

sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))

输出结果

Original dataset shape Counter({1: 900, 0: 100})
Resampled dataset shape Counter({0: 900, 1: 900})

SMOTE算法的变体–SVM-SMOTE的示例

#使用SVM-SMOTE进行过度采样
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SVMSMOTE
 
X, y = make_classification(n_classes=2, class_sep=2,
weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
print('Original dataset shape %s' % Counter(y))

sm = SVMSMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))

输出结果

Original dataset shape Counter({1: 900, 0: 100})
Resampled dataset shape Counter({0: 900, 1: 900})

想了解imbalanced的的更多信息的,请移步:https://imbalanced-learn.org/stable/

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月10日
下一篇 2022年5月10日

相关推荐