不平衡数据分类学习
一、 不平衡数据的出现场景
搜索引擎的点击预测
- 点击的网页往往占据
很小的比例 - 电子商务领域的商品推荐
- 推荐的商品被购买的
比例很低 - 信用卡欺诈检测
- 网络攻击识别
- …
二、 解决方案
2.1 从数据的角度:抽样,从而使得数据相对均衡
-
随机欠采样:从多数类中随机选择少量样本再合并原有少数类样本作为新的训练数据集
- 有放回采样
- 无放回采样
- 会造成一些信息缺失,选取的样本可能有偏差
-
随机过采样:随机复制少数类来样本
- 扩大了数据集,造成模型训练复杂度加大,另一方 面也容易造成模型的过拟合问题
2.2 从算法的角度:考虑不同误分类情况代价的差异性对算法进行优化
- 对于多数类样本,通过n次有放回抽样生成n份子集
- 少数类样本分别和这n份样本合并训练一个模型:n个模型
- 最终模型:n个模型预测结果的平均值
- 从多数类中有效地选择一些样本与少数类样本合并为新的数据集进行训练
- 训练好的模型每个多数类样本进行预测。若预测正确,则不考虑将其作为 下一轮的训练样本
- 依次迭代直到满足某一停止条件,最终的模型是多次迭代模型的组合
设训练集的一个少数类的样本数为 T ,那么SMOTE算法将为这个少数类合成 NT 个新样本。这里要求 N必须是正整数,如果给定的 N<1 那么算法将“认为”少数类的样本数 T=NT ,并将强制 N=1。 考虑该少数类的一个样本 i ,其特征向量为 xi,i∈{1,…,T}:
- 首先从该少数类的全部 T个样本中找到样本 xi 的 k 个近邻(例如用欧氏距离),
记为 xi(near),near∈{1,…,k}- 然后从这 k 个近邻中随机选择一个样本 xi(n) ,再生成一个 0 到 1之间的
随机数ζ1,从而合成一个新样本 xi1 :- 将步骤2重复进行 N 次,从而可以合成 NN个新样本:xinew,new∈1,…,N.
那么,对全部的 T个少数类样本进行上述操作,便可为该少数类合成 NT 个新样本。
SMOTE算法摒弃了随机过采样复制样本的做法,可以防止随机过采样易过拟合的问题。实践证明此方法可以提高分类器的性能。SMOTE 对高维数据不是很有效。当生成合成性实例时,SMOTE 并不会把来自其他类的相邻实例考虑进来,这导致了类重叠的增加,并会引入额外的噪音。为了解决SMOTE算法的这一缺点提出一些改进算法,如Borderline-SMOTE算法
基于代价矩阵分析,代价敏感学习方法主要有以下三种实现方式:
- 从贝叶斯风险理论出发,把代价敏感学习看成是分类结果的一种后处理,按照传统方法学习到一个模型,以实现损失最小为目标对结果进行调整
- 不依赖所用具体的分类器
- 但是缺点要求分类器输出值为概率
- . 从学习模型出发,对具体学习方法的改造,使之能适应不平衡数据下的学习
1. 代价敏感的支持向量机,决策树,神经网络- 从预处理的角度出发,将代价用于权重的调整,使得分类器 满足代价敏感的特性
三、Scikit learn中的不均衡样本分类处理
3.1 类别权重class_weight
class_weight参数用于标示分类模型中各类别样本的权重
- 不考虑权重,即所有类别的权重相同
- balanced:自动计算类别权重
- 某类别的样本量越多,其权重越低;样本量越少,则权重越高
- 类权重计算方法为:n_samples / (n_classes * np.bincount(y))
n s a m p l e s 为 样 本 数 , n c l a s s e s 为 类 别 数 量 , n p . b i n c o u n t ( y ) 输 出 每 个 类 的 样 本 数 n_{samples}为样本数,n_{classes}为类别数量,np.bincount(y) 输出每个类的样本数 nsamples为样本数,nclasses为类别数量,np.bincount(y)输出每个类的样本数
- 手动指定各个类别的权重
1. 如对于0,1二类分类问题,可以定义class_weight={0:0.9, 1:0.1},即类别0的权重为90%,而类别1的权重为10%
3.2 样本权重sample_weight
模型训练:fit(X, y, sample_weight=None)
- 其中参数
s
a
m
p
l
e
w
e
i
g
h
t
sample_{weight}
sampleweight为样本权重参数
当样本高度失衡时,样本不是总体样本的无偏估计,可能导致模型预测能力下降 - 解决方案:调节样本权重
- 一种是在 c l a s s w e i g h t class_{weight} classweight使用balanced
- 另一种是在调用fit函数时,通过 s a m p l e w e i g h t sample_{weight} sampleweight来调节每个样本权重
- 如果两种方法都用了,那么样本的真正权重是 c l a s s w e i g h t ∗ s a m p l e w e i g h t class_{weight}*sample_{weight} classweight∗sampleweight