在自然语言任务中,评价模型性能经常会用到accuracy、precision、recall、F1等指标,在二分类任务中,指标值计算一般不会出现问题,而在多分类任务中特别容易出现问题,比如四个指标值相等,这个时候就要考虑宏平均和微平均。下面从混淆矩阵开始,一步一步讲解指标值的计算,定能解你心头疑惑。
1. 混淆矩阵
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。
在二分类问题中,根据真实值和预测值划分:
真正类(True Positive,TP):真实类别为正例,预测类别为正例。
假正类(False Positive,FP):真实类别为负例,预测类别为正例。
真负类(True Negative,TN):真实类别为负例,预测类别为负例。
假负类(False Negative,FN):真实类别为正例,预测类别为负例。
混淆矩阵(Confusion Matrix)如下表所示:
根据混淆矩阵各个指标值的计算:
准确率(Accuracy):指分类器正确分类的样本数与总样本数之比。
精确率(Precision):指分类正确的正样本个数(TP)占分类器判定为正样本的样本个数(TP+FP)的比例。
召回率(Recall):指分类正确的正样本个数(TP)占真正的正样本个数(TP+FN)的比例。
F1:指精确率和召回率的调和平均值。
对于二分类任务使用上述公式计算或者使用已封装的函数,如slearn中的accuracy_score、precision_score、recall_score、f1_score、classification_report等,seqeval.metrics.classification_report等。
2. 多分类指标计算
如果只有一个二分类混淆矩阵,可以用P、R、F指标进行评价,但是当我们在n个二分类混淆矩阵上要综合考察评价指标的时候就会用到宏平均和微平均。
宏平均(Macro-averaging),是先对每一个类统计指标值,然后再对所有类求算术平均值。
微平均(Micro-averging),是对数据集中的每一个实例不分类进行统计建立全局混淆矩阵,然后计算相应指标。
宏平均和微平均的使用:
sklearn.metrics.precision中参数average选择micro和macro,其他类似。
宏平均和微平均的区别
宏平均的计算方法独立于不同类别,将每个类别的P、R、F值单独计算出来,然后将所有类别的度量值直接平均,因此它将各个类别平等对待。
微平均会结合不同类别的贡献大小来计算平均值。
所以在多分类问题中,如果存在数据不平衡问题,则使用微平均得到的效果更加可信。
3. Accuracy=Precision=Recall=F1问题
在多分类任务中,偶然会出现四个指标相同的问题。
比如情感分类问题,判断情感极性positive,negative,neural,三个类别,在Micro-averging中计算指标,计算公式如下:
出现四个指标值一样的情况是因为,在某一类中被判断成FP的样本,在其他类中一定是FN的样本。
此时,Micro-precision和Micro-recall的数值都等于Accuracy,因为它们计算了对角线样本数和总样本数的比值。
解决方法
使用宏平均(Macro-averaging),这种方法对不同的类分别计算评估指标,然后加起来求平均。