样本不均衡分类问题学习整理

非原创非原创非原创,仅供自己学习记录,参考文章主要有这几篇

https://blog.csdn.net/weixin_42462804/article/details/99821091?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

https://www.zhihu.com/question/269698662/answer/352279936

https://zhuanlan.zhihu.com/p/32940093

https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&mid=2247484993&idx=1&sn=0bd32089a638e5a1b48239656febb6e0&chksm=970c2e97a07ba7818d63dddbb469486dccb369ecc11f38ffdea596452b9e5bf65772820a8ac9&token=407616831&lang=zh_CN


1、样本类别分布不均衡导致的危害?

样本类别不均衡将导致样本量少的分类所包含的特征过少,并很难从中提取规律;即使得到分类模型,也容易产生过度依赖与有限的数据样本而导致过拟合问题,当模型应用到新的数据上时,模型的准确性会很差。


2、解决方法:

数据层面:采样,数据增强,数据合成等;
模型层面:修改损失函数值,异常检测等。
模型评估


2.1、数据层面

随机过采样:从少数类样本集中随机重复抽取样本(有放回)以得到更多的样本;
随机欠采样:从多数类样本集中随机选择较少的样本(有放回/无放回);

随机采样的缺点:

过采样容易造成过拟合;
欠采样可能损失有用的信息。

为解决采样过拟合的风险,可搭配使用正则化模型。

过采样中的“奇淫巧技”:

1、SMOTE:通过插值的方式加入近邻的数据点;简单来说smote算法的思想是合成新的少数类样本,合成的策略是对每个少数类样本a,从它的最近邻中随机选一个样本b,然后在a、b之间的连线上随机选一点作为新合成的少数类样本。

2、基于聚类的过采样:先对数据进行聚类,然后对聚类后的数据分别进行过采样。这种方法能够降低类间和类内的不平衡。

3、神经网络中的过采样:SGD训练时,保证每个batch内部样本均衡。

4、文本挖掘领域会使用一些文本增强的方法,最常见的就是对文本进行同义词替换、翻译成外文再翻译回来等。

欠采样中的“奇淫巧技”:

1、丢掉一些类别边界部分的数据,克服丢失数据带来的信息缺失这一缺点。

2、反复做欠采样,对这反复做欠采样生成的不同样本分别训练,并集成结果。这样数据达到了有效利用,但也存在风险:

训练多个模型造成了过大的开销,合并模型结果需要额外步骤,有可能造成其他错误;

正例被反复使用,和过采样一样,很容易造成模型的过拟合。

3、对数据先进行聚类,再将大的簇进行随机欠采样或者小的簇进行数据生成

采样法最受人诟病的就是可能会改变原始数据的分布,从而带来偏差。但是我觉得如果随机采样足够随机,不一定会改变原始数据的分布?(https://www.zhihu.com/question/269698662/answer/352279936)


2.2、模型层面

调整阈值

对于使用阈值的分类问题,比如二分类,或者某些多标签分类方法,输出范围通常为 [ 0,1 ] ,当某个样本大于0.5就会被划分为正例。在类别不平衡时,比如反例过多,采用默认阈值可能会导致输出全是反例,产生虚假的高准确度。可以调整阈值,是模型对于较少的类别更为敏感。 

调整权重(代价敏感学习)

Sklearn的决策树有一个参数是class_weight,在计算的损失函数乘上对应的sample_weight来计算最终的损失。这样计算而来的损失函数不会因为样本不平衡而被“推向”样本量偏少的类别中。

其实就是在cost function中调整惩罚项的权重,使样本较少的类别在被分类错误产生的代价更为严重。

异常检测

把监督学习变为无监督学习,舍弃掉标签把问题转化为一个无监督问题,如异常检测。

无监督异常检测最大优势就是在不需要数据标签,如果在对数据假设正确时效果甚至可以比监督学习更好,尤其是当获取标签成本很高时。

https://www.zhihu.com/question/280696035/answer/417091151


2.3、类别不平衡下的评估问题

选择合适的评估标准,比如ROC或者F1,而不是准确度(accuracy)

对于平衡的数据,我们一般都用准确率(accuracy),也就是(1-误分率)作为一般的评估标准。这种标准的默认假设前提是:“数据是平衡的,正例与反例的重要性一样,二分类器的阈值是0.5。”在这种情况下,用准确率来对分类器进行评估是合理的。

而当类别不平衡时,准确率就非常具有迷惑性,而且意义不大。给出几种主流的评估方法:

  • ROC是一种常见的替代方法,全名receiver operating curve,计算ROC曲线下的面积是一种主流方法
  • Precision-recall curve和ROC有相似的地方,但定义不同,计算此曲线下的面积也是一种方法
  • Precision@n是另一种方法,特制将分类阈值设定得到恰好n个正例时分类器的precision
  • Average precision也叫做平均精度,主要描述了precision的一般表现,在异常检测中有时候会用
  • 直接使用Precision也是一种想法,但此时的假设是分类器的阈值是0.5,因此意义不大

至于哪种方法更好,一般来看我们在极端类别不平衡中更在意“少数的类别”,因此ROC不像precision-recall curve那样更具有吸引力。在这种情况下,Precision-recall curve不失为一种好的评估标准。还有一种做法是,仅分析ROC曲线左边的一小部分,从这个角度看和precision-recall curve有很高的相似性。

同理,因为我们更在意罕见的正例,因此precision尤为重要,因此average precision (macro)也是常见的评估标准。此处特意要提醒两点:

  • 没有特殊情况,不要用准确率(accuracy),一般都没什么帮助
  • 如果使用precision,请注意调整分类阈值,precision@n更有意义

 

 

 

 

 

 

 

 

你可能感兴趣的:(学习笔记)