在活体检测中经常使用roc_curve来绘制ROC曲线,通过返回的TPR、FPR和对应的阈值来计算最优阈值
sklearn.metrics.roc_curve的返回值为三个list,分别为TPR、FPR和对应的阈值,即:
sklearn.metrics.roc_curve根据样本原本的标注和模式预测的成绩,使用不同的阈值去计算TPR和FPR,每一个阈值对应一个TPR和FPR,他们被存储在函数返回列表的对应位置:
fpr, tpr, threshold = roc_curve(target_labels, scorce, pos_label=1)
from sklearn.metrics import roc_curve
def get_err_threhold(fpr, tpr, threshold):
differ_tpr_fpr_1=tpr+fpr-1.0
right_index = np.argmin(np.abs(differ_tpr_fpr_1))
best_th = threshold[right_index]
err = fpr[right_index]
return err, best_th, right_index
target_labels = [] # 分类样本的真实标签
scorce = [] # 分类模型预测出的样本成绩
# pos_lable=1 表示正样本是用1标注的
fpr, tpr, threshold = roc_curve(target_labels, scorce, pos_label=1)
# best_threshold就是最好的阈值,err为错误率,index为最优阈值的坐标
err, best_threshold, index = get_err_threhold(fpr, tpr, threshold)
TPR:真正类率,即所有正样本中被分类器预测为正样本的个数。
FPR:假正类率,即所有负样本中被分类器预测为正样本的个数。
在最理想情况下,我们都希望模型能够将所有的正类均正确分类,即TPR=1。所有的负类也正确分类对应FPR=0。
因此,理想情况下ROC曲线越靠拢图像中(0,1)点,表示模型在此阈值对应的模型效果最好。
如何根据返回的fpr, tpr, threshold = roc_curve(target_labels, scorce, pos_label=1)找到最佳阈值?
首先计算:differ_tpr_fpr_1= tpr + fpr -1.0
在最理想的点(1,0)结果为0,其他情况下differ_tpr_fpr_1的值在-1~1之间,我们可以对differ_tpr_fpr求绝对值,来表示该点与理想点的距离,从而距离越小,此点越优
right_index = np.argmin(np.abs(differ_tpr_fpr_1))
right_index为最优点的下表
因此我们可以得到最优阈值,使得AUC值最大