文章目录
摆在眼前的有几个问题:
1、声纹识别与人脸识别的阈值获取方式一致么?(ROC曲线 or ERR曲线?)
2、如何绘制 ROC 曲线?
3、如何绘制 ERR 曲线?
下面直接了当,进入主题。
1. 如何绘制 ROC 曲线
1.1 What and Why
- ROC(Receiver Operating Characteristic)曲线全称是“受试者工作特征”。
- 通常用来衡量一个二分类学习器的好坏:如果一个学习器的ROC曲线能将另一个学习器的ROC曲线完全包住,则说明该学习器的性能优于另一个学习器。
1.2 How
理论
前提知识:二分类问题、混淆矩阵、四个基础指标
ROC 曲线的横纵坐标分别是:
- FPR(False Positive Rate)
- TPR(True Positive Rate)
实际问题:一个模型一次只能产生一对(FPR, TPR),这只能绘制一个点,不足以绘制出一条曲线。
解决办法:利用不同的阈值,产生不同的(FPR, TPR)对,从而绘制出 ROC 曲线。
对于许多学习器在判定二分类问题时是预测出一个对于真值的范围在[0.0, 1.0]之间的概率值,而判定是否为真值则看该概率值是否大于设定的阈值(Threshold)。例如如果阈值设定为0.5则所有概率值大于0.5的均为正例,其余为反例。
补充:
- AUC(Area Under Curve)值:ROC曲线下(所覆盖的)面积。AUC值可以更直观的判断学习器的性能,AUC越大则性能越好。
小结:
可以看出,对于普通的二分类问题,其混淆矩阵的评价基准是“是否将正/负样本正确地判断为正/负样本”,而对于人脸识别和声纹识别的问题,并不是通过样本的正负(样本本身并没有正负一说)是否匹配成功来计算评价指标,而是通过一个**阈值(相似度分数)**直接判断互相的比对是否成功来计算评价指标。具体内容可以查看:人脸识别模型评价指标:完整梳理。
因此,对于人脸识别和声纹识别问题我们使用 ERR 曲线。
注:很多人将人脸识别/声纹识别中的 FAR 和 FRR 等指标与基础二分类问题 FPR 和 FNR 等价来看,我这边觉得有问题,还是区分开来!!
2. 如何绘制 ERR 曲线
what and why
- EER (Equal Error Rate) 表示等误率,指的是某一阈值下,FAR=FRR时,FAR或者FRR的值。
这里有一个问题,阈值T指的是什么,分数?
how
3. 代码实现
基本代码介绍
from sklearn import metrics
from scipy import interpolate
from scipy.optimize import brentq
import matplotlib.pyplot as plt
# given y_test (the actual labels), y_pred_class (predicted results), y_pred_prob (predicted probabilities)
y_test = [1, 0, 0, 1, 0, 0, 1, 1, 0, 0] # true values
y_pred_class = [0, 0, 0, 0, 0, 0, 0, 1, 0, 1] # predicted values
y_pred_prob = [0.36752429, 0.28356344, 0.28895886, 0.4141062, 0.15896027, 0.17065156, \
0.49889026, 0.51341541, 0.27678612, 0.67189438] # predicted probabilities
y_test = [1.0, 0.0, 0.0, 1.0, 0.0,