文章目录
在训练二分类模型中,例如医疗诊断、网络入侵检测、信用卡反欺诈等,经常会遇到正负样本不均衡的问题。直接采用正负样本非常不均衡的数据集进行训练学习会遇到很多问题。使用不平衡数据集的挑战在于,大多数机器学习技术将忽略少数类,并且反过来在少数类上表现不佳,尽管通常最重要的是少数类(比如申请卡中的逾期)。
比如:正负样本比例是99:1,那么分类器将所有样本都预测成正样本就有99%的正确率
当碰到样本类别不均衡的情况下,占比大的类别往往会成为影响准确率的最主要因素。
这时就有两种思路来改进这种情况。
一、第一种思路:平衡采样
第一种思路就是通过平衡采样的方法,改变正负样本非常不均衡的情况。通常会对小数据量的类别进行上采样,或者对大数据量的类别进行下采样。这里基于数据量进行选择,如果大数据量极大,那么对大数据量进行下采样(欠采样)也同样能满足训练模型的需求;如果大数据量不是很多,为了满足训练模型的需求,就需要对小数据量进行上采样(过采样)。其中SMOTE算法与ADASYN算法正是过采样里面两个常用的算法。下面对这两种算法进行简单介绍。
1.SMOTE算法
SMOTE算法即合成少数过采样技术,顾名思义,其基本思想是:对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中。
SMOTE算法步骤:
- 利用最近邻算法进行采样,计算出每个少数类样本的K个近邻
- 从K个近邻中随机挑选N个样本进行随机线性插值
- 构造新的少数类样本
N e w = New= New= x x x i i i + r a n d ( 0 , 1 ) × +rand(0,1)× +rand(0,1)×( y y y j j j − - − x x x i i i), j = 1 , 2 , . . . N j=1,2,...N j=1,2,...N
其中 x x x i i i是少类中的一个观测点, y y y j j j是K近邻中随机抽取的样本 - 将新样本与原数据组合,组成新的数据集
python使用
SMOTE过采样算法实现 python有一个专门实现的库—imblearn.over_sampling.SMOTE
import pandas as pd
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.01, 0.99], n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1, n_samples=10000, random_state=10)
print('Original dataset shape %s' % Counter(y))
# 此时正负样本比大致为99:1
# 该数据集是公开的申请评分卡数据集,质量比较高
# 比如:经过过采样,我们想把数据集正负样本比例设置成10:1
# sampling_strategy这个参数控制采样后负样本占总样本的比例,这一个尤其注意
sm = SMOTE(sampling_strategy=0.1, random_state=10, k_neighbors=5, n_jobs=-1)
X_res, y_res = sm.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))
Original dataset shape Counter({
1: 9900, 0: 100})
Resampled dataset shape Counter({
1: 9900, 0: 990})
2.SMOTE与RandomUnderSampler进行结合
在SMOTE的原始论文中,建议将少数类别SMOTE过采样与多数类别的随机欠采样相结合。
from collections import Counter
from sklearn.datasets import make_classification
from