如何训练非平衡数据的分类器


训练一个分类器,第一步就是为每个类别准备大量数据。这一个看似简单,在实际中往往却最难达到理想情况。因为:实际中很多分类任务的数据不是平衡的,即类与类之间的数量悬殊,例如对磁盘进行故障预测分类,然而磁盘故障率每年小于1%,于是理想和现实如同如下左、右图那样。

 

 有很多学者对这种非平衡数据的分类问题进行了研究,总的来说,以下是解决这个问题的主要方法:

1. 不做任何事情,在这样自然分布的数据下坐等训练结果;
2. 对少数量的类进行上采样,对大数量的类进行下采样,或给少数量的类加入一些新的合成数据;
3. 不考虑少数量的类型,把问题转化为“异常检测”解法;
4. 做些算法上的优化,如给损失函数加权重控制、调整决策阈值、或是对算法做些修改使得对少量数据的类更敏感。
5. 设计一个新的算法。


在阐述具体方法前,我们来谈谈如何评价分类的性能,要注意以下几点:
1. 通过ROC来评价,不要就在某个阈值下讨论算法的效果,应该根据实际应用上的条件来寻找ROC曲线上最佳的值。
2. 要在“自然”分布的数据集上对算法进行测试验证 (sklearn.cross_validation.StratifiedKFold)。
3. 可以用The Area Under the ROC curve (AUC) 、F1-score、Cohen’s Kappa 进行单指标评价。


下面,具体来看以上谈到的几个方法:
1. 关于上、下采样。上采样可以放大错误,但也有副作用,它会让变量的方差过小;而下采样会让独立变量有更大的方差,如下图,由于样本少,使得分类变得方差较大(10个不同的采样导致10个不同的分类器),如下图左。于是,可以用bagging的方法来避免,如下图右。

ImbalancedClasses_fig8 ImbalancedClasses_fig9


2. 用邻域链接的方法来进行下采样: TomekLink。 如下图,该算法通过将少量数据类的样本附近的一个大量数据类的样本进行删除来实现。

Tomek links



3. 通过产生新的样本来进行数据平衡。如SMOTE法,通过在两个少量样本的中间差值获得新的样本。

4. 通过给不同类别赋予权重,如下图,通过给少量数据类更高的权重获得更好的分类效果(虚线)。然而这种方法只有在有明显的训练误差下才有用。
ImbalancedClasses_fig12
5. 还有一些不错的算法。比如 Box Drawings for Learning with Imbalanced Data 方法解决了数据倾斜下的训练问题。  该算法在 少量样本聚类中心周围构建box,基于此获得了少量数据类的一种简洁智能的表达。在训练时,box的数量作为一种惩罚,同时也作为正则项。Exact Boxes和Fast Boxes是两种训练方法。

6. 将问题看作“异常检测”,效果比较不错的是:Isolation-Based Anomaly Detection, 它通过学习一个随机森林并获得分割每个点的决策面的个数,这个个数可以衡量对应点的异常分数。

7. 最后,通过社会化众包发现数据也是很多公司采用的方法。

8. 模型级联。 EasyEnsemble and BalanceCascade (Exploratory Under Sampling for Class Imbalance Learning).  这是个迭代清洗数据获得多个模型的算法。首先从整体训练集中采样获得大类的子集M1,使得数量和小类S相当,然后用M1+S训练获得分类器H(1)。 获得H(1)分类结果中分类正确的M1的子集M11, 认为M11是M1的冗余,并从整体训练集中删去。接着重复同样的步骤,采样->训练->删冗余,迭代直至无法获得更好的结果。然后把所有模型级联起来进行分类。

9. one-sided selection (OSS).  这个是清洗数据使得更有利于训练的方法。它也是迭代进行的。每次获得Tomek links,即当不存在实例使得其到大类Xm和小类Xs的距离小于Xm和Xs之间的距离,则认为(Xm,Xs)是一个Tomek link. 属于Tomek link的两个实例,要么是噪声点,要么是类间的边界。如下图,左边虚线矩形框出了Tomek links, 右边是清理后的数据集。



原文连接: http://www.svds.com/learning-imbalanced-classes/#fn6


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值