不管是声纹识别和图像识别,以及指纹识别,在评价模型时总要用到这三个指标。下边说下这三个指标的含义。
1、错误接受率 (
FAR
-False Acceptance Rate)
FAR = nontarget_is_target / ( target_is_target + nontarget_is_target )
另一种比较容易理解的表示方式:
FAR = NFA / NIRA
式中 NIRA 代表的是类间测试次数,既不同类别间的测试次数,打比方如果有1000个识别 模型,有1000个人要识别,而且每人只提供一个待识别的素材,那 NIRA=1000*(1000-1) 。NFA是错误接受次数。
2、错误拒绝率 (
FRR
-False Rejection Rate)
FRR = target_is_nontarget / ( target_is_nontarget + nontarget_is_nontarget )
比较容易理解的表示方式:
FRR = NFR / NGRA
上式中NGRA是类内测试次数,既同类别内的测试次数,打比方如果有1000个识别模型, 有1000个人要识别, 而且每人只提供一个待识别的素 材,那 NGRA=1000,如果每个人提供N张图片,那么 NGRA=N*1000 。NFR是错误拒绝次数。
3、等错误率 (
EER
-Equal Error Rate)
取一组0到1之间的等差数列,分别作为识别模型的判别界限,既坐标x轴,画出FFR和FAR的坐标图,交点就是EER值。
4、简单的程序实现
假如我们可以得到用户与不同模型之间的相似度,每个用户训练一个模型,提供两个素材 用于识别验证,如下图:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
class_in=[] #定义类内相似度列表
class_each=[] #定义类间相似度列表
data = pd.read_csv('filepath.csv') #这里以结果在csv文件为例
user_id_length = len(data.values[0,1:]) #要识别的数量
model_id_length = len(data.values[1:,0])#计算出模型ID数量
for i in range(user_id_length):
for j in range(model_id_length):
#需要识别的用户id和模型id一样,就认为是类内测试,否则是类间测试
if data.values[i+1][0]==data.values[0][j+1]:
class_in.append(np.float(data.values[i+1][j+1]))
else:
class_each.append(np.float(data.values[i+1][j+1]))
FRR = []
FAR = []
thresld=np.arange(0.1,0.9,0.01) #生成模型阈值的等差列表
eer = 1
for i in range(len(thresld)):
frr = np.sum(class_in < thresld[i])/len(class_in)
FRR.append(frr)
far = np.sum(class_each > thresld[i])/len(class_each)
FAR.append(far)
if (abs(frr-far)<0.02): #frr和far值相差很小时认为相等
eer = abs(frr+far)/2
plt.plot(thresld,FRR,'x-',label='FRR')
plt.plot(thresld,FAR,'+-',label='FAR')
plt.grid(True)
plt.legend(bbox_to_anchor=(1.0,1),loc=1,borderaxespad=0.)
plt.show()
print ('EER is: ',eer)
这里我随机生成了一些数据,跑出的效果图如下:
因为是随机生成的数据,所以EER的值在0.5左右。