简介:文章中提到了8个tactics,但是对于每个tactics的介绍很简略,该笔记在此作为一个总结性的记录,同时针对每个tactics中提到的关键点做进一步的介绍。
一、Collect more data
- 收集更多数据,缓解数据不均衡的情况。这个比较简单,就如字面意思。
二、Change performance metric
-
原因:当使用Accuracy作为性能指标时,不均衡的情况会对评价结果有很大的影响,其实主要还是因为Accuracy的计算方式 (TP+TN)/(TP+TN+FP+FN) 引起的,尤其在多分类中更为明显。举个例子,0-99的100个类中,单个样例中,类别0的预测到了类别1,结果来说预测错了,但是计算Accuracy的考虑角度并不是严格的从单个结果,相当于是说,虽然对于类别0和类别1是错了,但是类别2~99 这98个类别都预测对了,因为确实不属于这个类,这……
-
而在这一项中作者提出的性能指标有6种,下面逐一介绍;
-
(1)、confusion matrix (混淆矩阵):
混淆矩阵的方式大概可以分两种,其一为二分类。二分类中的混淆矩阵,是2 X 2 的方阵,可以看成是下图这样的方式;
二分类.png
而多分类中如下所示:
多分类.png
混淆矩阵参考:https://www.cnblogs.com/cnkai/p/7755134.html
-
(2)、Precision(精确率):
精确率: TP / (TP + FP)
基本可以认为只计算了预测为正的样例中的准确率,即所有预测为正例的样例中,又有多少是对的,而错了就是错了,不考虑对于非本类的评分是多少。它的着重点在于预测结果。 -
(3)、Recall(召回率):
召回率:TP / (TP + FN)
可以理解为,整理样本中有多少被预测正确了,他的着重点在于正例样本。 -
(4)、F1 Score:
F1 Score: (2 * Precision * Recall) / (Precision + Recall)
范围:0~1
当你希望同时使用精确率和召回率的时候,F1就可以作为衡量标准,来找到 Precision 和 recall 之间的平衡点。 -
(5)、Kappa( Cohen's Kappa):
Kappa: K = (P0 - Pe) / (1 - Pe)
范围: -1 ~ 1
P0: 每一类中被正确预测的数量的综合/ 总样本数; 可以理解为总样本的精度;
Pe: 基于样本和预测结果的分布的计算,对于C个类别的多分类,如下:
Pe = (a0 * b0 + a1 * b1 + ... + aC * bC) / n * n;
ai: 样本中第i类的数量;
bi: 预测结果中第i类的数量;
n -> 样本数量总和,有:a0 + ... + aC = n; b0 + ... + C = n;
Kappa是基于混淆矩阵进行计算,描述两种分类标注的一致性。1表示完全一致,-1表示完全不一致,0表示几乎等同于随机预测。
Kappa参考:https://blog.csdn.net/weixin_38313518/article/details/80035094 -
(6)、ROC Curves (ROC曲线):
ROC曲线:真阳性率(TPR)和假阳性率(FPR)来实现的描述相关操作特征的曲线。
TPR:TP / (TP + FN)
FPR:FP / (FP + TN)
ROC曲线的x轴表示FPR,y轴表示TPR,两者之间的变化组成ROC 曲线,而曲线下的面积就是AUC;
具体可参考:https://www.cnblogs.com/linkr/articles/2317072.html
三、Resampling Your Dataset
-
描述:其实重采样也是我在处理数据时最常用以及最简单的方法,在数据满足要求的情况下,既然数据有不均衡的情况出现,那就手动进行均衡处理,多的减少,少的增加,这是最基本的思路,但有时候会受到数据集本身的影响而略有不同;
-
(1)、over sampling(上采样):
对于样本数量少的类别,可以进行上采样,即复制样本,对样本做一些形变等数据增强的方式,但有时候需要对任务和代码做一个分析,比如有些项目中区分左右以及角度时,就不能随意使用左右翻转或者旋转来扩充数据。但是当数据量差别能够接受,且数据类间特征明确时,也不需要对少数类别单独上采样依然能取得很好的结果。而且训练时需要注意的一点是,在使用TensorFlow的slim项目进行训练时,在数据的预处理中是默认加了随机左右翻转的,这样的处理对于需要区分左右的类别就造成了不可忽视的干扰,不过这部分在预处理的代码中可以更改。 -
(2)、under sampling(下采样):
这个我一般是看具体任务,比如某个类有3000多的数据量,而大部分类都在500~800左右,我基本会把多数的类别随机抛弃一部分,只保留1000左右;但是有些项目中,多数类别的数量也并不够多,这个时候任性的随机抛弃就会降低样本的多样性和泛化能力,对于这种类型的任务,我一般会在制作tfrecord的时候对于每一个record中的类别做一个划分,少数类别顺序放进来,多数类别每次挑选一部分进来,在每个record中的各个类别尽量均衡,有时候类别数较大的时候,也不一定是一个record,而是拿出一部分多数,一部分少数组成一个单位,在这个单位中,各个类别均衡,然后随机打乱后放入record中去。
四、Generate Synthetic Samples
- 样本生成其实就是扩充少量数据,对于图片来说上文中提到的形变就是其中的一种方式,文章中还提到朴素贝叶斯和SMOTE,可以单独搜索看看。
五、Diffrent Algorithms
- 尝试使用不同的算法进行,这个……好像没有什么不好理解的。
六、Penalized Models
-
加入惩罚因子,对结果进行校正。加入了惩罚因子的分类中,提高了对于少数类别分类错误的代价,也使得训练更关注于少数类别。
-
像SVM和LDA都有加入了惩罚项的版本,而我在图像相关的使用中,更多的是两个方式,一种是对计算的结果根据数量不同添加weight,一种是在loss中添加正则项作为惩罚项,最终的loss = regularizer + real_loss ,TensorFlow中也有相关的实现,用起来也方便。惩罚因子在使用中并不会是第一选择,一般是在对数据无法处理的时候才会考虑。最简单有效的方式还是从数据入手。
七、Different Perspective
- 这一项的意思就是说,数据不均衡的问题在很多领域内都有研究,如果实在无法解决的时候,可以看看异常检测和差异检测,也许能找到不同的思路与方法。
八、Getting Creative
- 或者尝试自己创新,比如把问题分解成不同的小问题来解决问题。其实很多时候如果能够充分理解问题本身,可能达到事半功倍的效果。
网友评论