1. 概念
PR曲线实则是以precision(精准率)和recall(召回率)这两个为变量而做出的曲线,其中recall为横坐标,precision为纵坐标。一条PR曲线要对应一个阈值。通过选择合适的阈值,比如50%,对样本进行划分,概率大于50%的就认为是正例,小于50%的就是负例,从而计算相应的精准率和召回率。如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言后者的性能优于前者。我们还可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点或者是F1值。平衡点(BEP)是P=R时的取值,如果这个值较大,则说明学习器的性能较好。而F1=2×P×R/(P+R),同样,F1值越大,我们可以认为该学习器的性能较好。
2.度量
四个重要的度量:精确率(查准率),召回率(查全率),真正例率,假正例率。
①精确率(P): P=TP/(TP+FP)
②召回率(R): R=TP/(TP+FN)
③真正例率(TPR): TPR=TP/(TP+FN)
④假正例率(FPR): FPR=FP/(TN+FP)
P(查准率):即预测结果中真正的正例的比例。
R(查全率):即所有正例中被正确预测出来的比例。
3.混淆矩阵
表示模型讲样本分类结果的矩阵。
| 真实结果为正例 | 真实结果为负例 | |
| 预测结果为正例 | TP | FP |
| 预测结果为负例 | FN | TN |
4.代码实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve,roc_curve
def draw_pr(confidence_scores, data_labels):
plt.figure()
plt.title('PR Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.grid()
#精确率,召回率,阈值
precision,recall,thresholds = precision_recall_curve(data_labels,confidence_scores)
from sklearn.metrics import average_precision_score
AP = average_precision_score(data_labels, confidence_scores) # 计算AP
plt.plot(recall, precision, label = 'pr_curve(AP=%0.2f)' % AP)
plt.legend()
plt.show()
def draw_roc(confidence_scores, data_labels):
#真正率,假正率
fpr, tpr, thresholds = roc_curve(data_labels, confidence_scores)
plt.figure()
plt.grid()
plt.title('Roc Curve')
plt.xlabel('FPR')
plt.ylabel('TPR')
from sklearn.metrics import auc
auc=auc(fpr, tpr) #AUC计算
plt.plot(fpr,tpr,label = 'roc_curve(AUC=%0.2f)' % auc)
plt.legend()
plt.show()
if __name__ == '__main__':
# 正样本的置信度,即模型识别成1的概率
confidence_scores = np.array([0.9, 0.78, 0.6, 0.46, 0.4, 0.37, 0.2, 0.16])
# 真实标签
data_labels = np.array([1,1,0,1,0,0 ,1,1])
draw_pr(confidence_scores, data_labels)
draw_roc(confidence_scores, data_labels)
参考来源:
浙公网安备 33010602011771号