多分类学习
我们初始遇见最多的是一般是二分类问题,如kaggle平台上的众多竞赛(CTR、异常检测任务等)。关于多分类任务,可以由二分类学习的思想进行推广来解决。考虑N个类别
,多分类学习的基本思想是“拆解法”,就是我们可以将其拆解为多个二分类的任务,训练多个分类器,最后将这些分类器的预测结果进行集成来获得多分类任务的结果。采用这种方式的关键就在于如何拆分,如何将分类器的结果集成。经典的拆分策略:一对一(OvO)、一对其余(OvR)、多对多(MvM)。
给定数据集,。采用一对一(OvO)的方式就是将这N个类别进行两两配对,这样就可以产生N(N-1)/2个二分类任务(这个计算应该会吧:(n-1)+(n-2)+....+1),这样一来就是等到了N(N-1)/2个分类的结果,如果来了一个新的数据,我们不知道这个是哪一个类别,那么这个新的数据就输入已经训练好的分类器中,这样产生的结果进行投票,哪个预测出的类别数最多,那么这个新的数据就属于哪个类别。
对于一对其余(OvR)的方式而言,则是每次将一个类的样例作为正例、所有的其他类作为反例来训练N个分类器。如果来了一个新的数据,我们不知道这个是哪一个类别,那么这个新的数据就输入已经训练好的N个分类器中,如果仅仅有一个分类器预测为正类,则对应的类别标记作为最终的分类结果。
从上面我们可以看到,一对其余的方式只需要训练N个分类器,而一对一的方式需要训练N(N-1)/2个分类器。这就取决自己的算力。至于多对多的方式,楼主这里就不讲了,可以自己看看西瓜书。其实楼主在面对多分类任务的时候,更加偏向使用神经网络,直接建立一个神经网络,在输出层的节点数等于分类的类别数,本人觉得这样还更方便一点,至于大家平时更偏向哪一种也可以交流交流。
类别不平衡问题
类别不平衡就是说在分类任务中不同类别的训练样例数目差别很大,这样我们在训练分类器的时候,其更偏向于学习类别数更加多的样例,并且在新样本到来的时候,分类器也更偏向于将其预测为类别数多的那一类,这样的分类器往往没有价值
解决方法:欠采样、过采样、阈值移动
欠采样:直接对训练集中的反类样例进行“欠采样”,取除一些反例使得正、反例数目接近,然后再进行学习。这里不一定是去除反类样例,应该是去除类别数多的样例,但是参考各种数据竞赛,确实是反例比正例更多,特别是异常检测中。
过采样:对训练集中的正类样例进行“过采样”,也就是说增加一些正例使得正、反例数目接近,然后再进行学习。
阈值移动:这种方式不对样例进行改变,而是直接基于原视训练集进行学习,但是在预测的时候,我们将条件设为严苛一点。之前提到,在逻辑回归中,我们不仅仅能够预测类别,还可以输出属于某个类别的概率,在我们不进行干预的情况下,往往将0.5作为阈值,如果属于某个类别的概率大于0.5,那么我们直接判断为新来的样例就属于这个类别。现在你我们将这个阈值设置得严苛一点,大于0.5,这样分类器更不容易偏向于类别数多得类别。这是楼主的理解,西瓜书上有严苛的公式。
欠采样的时间开销通常小于过采样,因为前者丢失了很多反例,这样训练集变小了,而过采样增加了很多正例,训练集变大了。过采样的代表性算法是SMOTE,欠采样的代表性算法是EasyEnsemble。在使用的时候,我们可以直接掉包,方便使用。并且在解决类别不平衡的时候,楼主更加偏向使用过采样和欠采样,直接从数据集入手,阈值移动楼主没用过。至于具体使用哪种方法,这个就根据自己的任务来看,以及自己的算力来看,个人使用过采样比欠采样更好,我的理解就是训练模型的好坏也是与数据集的大小有关,一般而言有更多的数据集来训练模型更好。
来源:CSDN
作者:Lavender-csdn
链接:https://blog.csdn.net/kidchildcsdn/article/details/104751322