Sklearn中解决方案
在Python的sklearn中,经常会使用分层抽样的方法,使用train_test_split方法对数据集进行切分,如若指定分层抽样则随机切分数据集的比例将会和源数据集中正负样本的比例保持一致,这是常用的一种方法。
另外在sklearn中,对数据集通常采用k则交叉验证的方法,数据集中任何一个部分都会参与模型的训练和模型的测试,如此得到K个模型准确率得分,能更加准确的衡量模型的准备率。
理论支撑
我们在处理分类问题的时候,都有一个基本的假设:不同类别的训练样例数目相当。
如果不同类别的训练样例稍微有差别,通常对模型训练影响不大,但是若差别很大,则会都会学习过程有很大的影响。
比如有998个反例,但正例只有2个,那么学习方法则只需要返回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度。然而这样学习器往往没有任何价值,因为它不能预测出任何正类。
究竟怎么定义类别不均衡?
指的是分类任务中不同类别的训练样例数目相差很大的情况
如何处理类别不均衡的问题?
最简单的方法:
(1)欠采样(下采样):去除一些反例使得正反例数据接近,然后在学习-----特点:开销时间小,容易丢失重要信息
代表算法-----EasyEnsemble算法利用集成学习机制,将反例划分为不同集合供不同学习器使用,如此对每个学习器都进行了欠采样,但在全局看来不会丢失重要信息。
(2)过采样(上采样):对训练数据集中正类样例进行“过采样”,即增加一些正例,使得正反例样本接近,然后在学习------特点:开销时间长,不能简单的对初始数据正例样本进行重复采样,否则会导致过拟合。
代表算法-----SMOTE算法是通过对训练集里的正例进行插值来产生额外的正例。
(3)直接基于源数据集进行学习,但是在训练好的分类器进行预测时,嵌入一个类别比例缩放的过程,也叫“阈值移动”。
如何缩放----y‘/(1-y')=y/(1-y)* (m-/m+),其中m-和m+为源数据集中的负样本个数和正样本的个数,y为原分类,y‘为放缩后的分类