主要思想
在处理不平衡数据主要从两方面入手:数据集方面、算法本身方面
数据方面
对数据进行重采样,使原本不均衡的样本变得均衡。最简单的处理不均衡样本集的方法是随机采样。
- 随机过采样:从少数类样本集中随机重复抽取样本(有放回)以得到更多样本
- 随机欠采样:从多数类样本中随机选取较少的样本(有放回或无放回)以得到更多样本
上述方法只是简单的重复的复制样本,采取一些方法生成新的样本
对于过采样:
- SMOTE:对少数类样本集 S m i n S_{min} Smin中的每个样本 x x x,从它在 S m i n S_{min} Smin中的K近邻中随机选取一个样本 y y y,然后在 x , y x,y x,y连线上随机选取一个点作为新合成的样本(根据需要重复上述操作)
对于欠采样:
- Easy Ensemble算法:每次从多数类 S m a j S_{maj} Smaj中随机抽取一个子集 E ( E ≈ S m i n ) E(E \approx S_{min}) E(E≈Smin), 然后用 S m i n + E S_{min}+E Smin+E训练一个分类器,重复若干次得到级联结构,最终的输出结果也是各级分类器结果的融合。
- Balance Cascade算法:每次从多数类 S m a j S_{maj} Smaj中随机抽取一个子集 E E E, 然后用 S m i n + E S_{min}+E Smin+E训练一个分类器;然后将 S m a j S_{maj} Smaj中能够被当前分类器正确分类的样本进行剔除,继续下一级操作,重复若干次得到级联结构,最终的输出结果也是各级分类器结果的融合。
算法方面
Facol loss:将简单样本进行降低权重,从而使样本训练的损失可以集中在比较难以学习的负样本上,引入调制因子。
P
L
(
p
t
)
=
−
(
1
−
p
t
)
γ
l
o
g
(
p
t
)
PL(p_{t}) = -(1-p_{t})^\gamma log(p_{t})
PL(pt)=−(1−pt)γlog(pt)
当一个样本被错误分类时
p
t
p_{t}
pt很小,对原来损失无影响,当
p
t
p_{t}
pt趋近于1时调制因子接近0,对容易分类的样本进行了降权,
γ
\gamma
γ控制降权的比率。
实践
最近参加了第二届中国移动“梧桐杯”大数据应用创新大赛的城市赛道。“灵珑”电信反诈模型旨在从普通用户中区分出电信诈骗人员号码,利用用户通信、流量使用等行为数据识别电信诈骗人员。正样本比例不超过5%。
使用imblearn进行不均衡数据处理
对数据进行简单的处理,一共有三万多个数据,实际数据更多,这里只是简单的进行演示。
from imblearn.over_sampling import RandomOverSampler
from collections import Counter
# df_all_label:数据标签
# 查看数据标签数量分别是多少
Counter(df_all_label)
#输出:Counter({0.0: 31318, 1.0: 74})
from imblearn.combine import SMOTEENN
smote_enn = SMOTEENN(random_state=0)
df_all_data_resampled, df_all_label_resampled = smote_enn.fit_resample(df_all_data, df_all_label)
print(sorted(Counter(df_all_label_resampled).items()))
#输出:[(0.0, 22361), (1.0, 20046)]