参数解释
average: string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]
将一个二分类matrics拓展到多分类或多标签问题时,我们可以将数据看成多个二分类问题的集合,每个类都是一个二分类。接着,我们可以通过跨多个分类计算每个二分类metrics得分的均值,这在一些情况下很有用。你可以使用average参数来指定。
macro:计算二分类metrics的均值,为每个类给出相同权重的分值。当小类很重要时会出问题,因为该macro-averging方法是对性能的平均。另一方面,该方法假设所有分类都是一样重要的,因此macro-averaging方法会对小类的性能影响很大。
weighted:对于不均衡数量的类来说,计算二分类metrics的平均,通过在每个类的score上进行加权实现。
micro:给出了每个样本类以及它对整个metrics的贡献的pair(sample-weight),而非对整个类的metrics求和,它会每个类的metrics上的权重及因子进行求和,来计算整个份额。Micro-averaging方法在多标签(multilabel)问题中设置,包含多分类,此时,大类将被忽略。
samples:应用在multilabel问题上。它不会计算每个类,相反,它会在评估数据中,通过计算真实类和预测类的差异的metrics,来求平均(sample_weight-weighted)
average:average=None将返回一个数组,它包含了每个类的得分.
ROC曲线
macro:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。
micro:首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。
PRF:准确率、召回率、F值
对于二分类问题,可将样例根据其真实类别和分类器预测类别划分为:
真正例(True Positive,TP):真实类别为正例,预测类别为正例。
假正例(False Positive,FP):真实类别为负例,预测类别为正例。
假负例(False Negative,FN):真实类别为正例,预测类别为负例。
真负例(True Negative,TN):真实类别为负例,预测类别为负例。
然后可以构建混淆矩阵(Confusion Matrix)如下表所示。
准确率,又称查准率(Precision,P):
召回率,又称查全率(Recall,R):
F1值:
F1的一般形式F_beta:从公式中可以看出参数1其实是准确率和召回率的调和参数,小于1则提高准确率的权重,大于1则提高召回率的权重,因此在实际中也有F0.5-score, F2-score的使用
宏平均(Macro-averaging)
分别计算每个类别的PRF,然后分别求平均得到PRF。即对多个混淆矩阵求PRF,然后求PRF的算术平均。宏平均指标相对微平均指标而言受小类别的影响更大。
其中
,,在计算宏平均F值时我给出了两个公式分别。都可以用。
举例,假设是三个类别的分类模型:(若除法过程中,分子分母同时为0,则结果也为0)
y_true=[1,2,3]y_pred=[1,1,3]
(1)如下,将第一个类别设置为True(1),非第一个类别设置为False(0),
y_true=[1,0,0]y_pred=[1,1,0]
由此我们统计得到第一个类别的混淆矩阵:
第一类 | 预测 | ||
真(正) | 假(负) | ||
实际 | 真(正) | 1(TP) | 0(FN) |
假(负) | 1(FP) | 1(TN) |
我们可以计算第一个类别的PRF值如下:
- P1 = TP/(TP+FP) = 1/(1+1) = 1/2
- R1 = TP/(TP+FN) = 1/1 = 1
- F1_1 = 2*P1*R1/(P1+R1) = 2/3
(2)如下,将第二个类别设置为True(1),非第二个类别设置为False(0),
y_true=[0,1,0]y_pred=[0,0,0]
由此我们统计得到第二个类别的混淆矩阵:
第二类 | 预测 | ||
真(正) | 假(负) | ||
实际 | 真(正) | 0(TP) | 1(FN) |
假(负) | 0(FP) | 2(TN) |
我们可以计算第二个类别的PRF值如下:
- P2 = TP/(TP+FP) = 0
- R2 = TP/(TP+FN) = 0
- F1_2 = 2*P2*R2/(P2+R2) = 0
(3)如下,将第三个类别设置为True(1),非第三个类别设置为False(0),
y_true=[0,0,1]y_pred=[0,0,1]
由此我们统计得到第三个类别的混淆矩阵:
第三类 | 预测 | ||
真(正) | 假(负) | ||
实际 | 真(正) | 1(TP) | 0(FN) |
假(负) | 0(FP) | 2(TN) |
我们可以计算第三个类别的PRF值如下:
- P3 = TP/(TP+FP) = 1/1 = 1
- R3 = TP/(TP+FN) = 1/1 = 1
- F1_3 = 2*P3*R3/(P3+R3) = 1
(4)对P1, P2, P3取平均得到P, 对R1, R2, R3取平均得到R, 对F1_1, F1_2, F1_3求平均得到F1:
- P = (P1+P2+P3)/3 = (1/2 + 0 + 1/3 = 1/2
- R = (R1+R2+R3)/3=(1 +0 +1)/3 = 2/3
- F1 = 2*P*R/(P+R) = 4/7
微平均(Micro-averaging)
对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算相应指标。
举个简单的例子来理解,同上面的例子一样,假设是三个类别的分类模型:
y_true=[1,2,3]y_pred=[1,1,3]
(1)如下,将第一个类别设置为True(1),非第一个类别设置为False(0),
y_true=[1,0,0]y_pred=[1,1,0]
由此我们统计得到第一个类别的混淆矩阵:
第一类 | 预测 | ||
真(正) | 假(负) | ||
实际 | 真(正) | 1(TP) | 0(FN) |
假(负) | 1(FP) | 1(TN) |
(2)如下,将第二个类别设置为True(1),非第二个类别设置为False(0),
y_true=[0,1,0]y_pred=[0,0,0]
由此我们统计得到第二个类别的混淆矩阵:
第二类 | 预测 | ||
真(正) | 假(负) | ||
实际 | 真(正) | 0(TP) | 1(FN) |
假(负) | 0(FP) | 2(TN) |
(3)如下,将第三个类别设置为True(1),非第三个类别设置为False(0),
y_true=[0,0,1]y_pred=[0,0,1]
由此我们统计得到第三个类别的混淆矩阵:
第三类 | 预测 | ||
真(正) | 假(负) | ||
实际 | 真(正) | 1(TP) | 0(FN) |
假(负) | 0(FP) | 2(TN) |
(4)根据微平均算法公式我们得到最终的混淆矩阵,如下:
最终 | 预测 | ||
真(正) | 假(负) | ||
实际 | 真(正) | 2/3(TP) | 1/3(FN) |
假(负) | 1/3(FP) | 5/3(TN) |
带入微平均公式得:
micro-P = TP/(TP+FP) = (2/3)/(2/3 + 1/3)= 2/3
micro-R = TP/(TP+FN) = (2/3)/(2/3 + 1/3)= 2/3
micro-F1 = 2*P*R/(P+R) = 2/3