1. 先理解混淆矩阵
混淆矩阵:表示模型讲样本分类结果的矩阵。
在Roc曲线和PR曲线中有四个重要的度量:精确率(查准率),召回率(查全率),真正例率,假正例率。
精确率(precision):理解为在所有的预测正例中(包括正确预测得出正例和错误预测得出正例),预测正确的比例。
precision = TP / (TP + FP)
召回率(recall): 理解为在所有的真实正例中,被正确预测的占比。
recall = TP / (TP + FN)
2. PR曲线的理解
首先用一个例子说明一下绘制PR曲线的几个步骤:
* 我们将会有真实的标签(例如猫狗大战中,猫为1,狗为0)
* 我们训练模型后会出现一个置信度(正样本的预测概率:这里是猫的概率)
* 将置信度与标签一一对应从高到低排序
* 我们需要设置阈值(与精确度和召回率息息相关),我们将大于阈值的置信度做为正样本(及可以理解为我们预测的正确的数据)
* 然后将每一次阈值所划分出的混淆矩阵计算精确率和召回率
* 绘图
这里我们把标签为1当做实际正确,标签为0当做实际错误
我们取当阈值为0.6时的情况来讲解 ,当阈值为0.6时,我们可以得到的正样本(其余为负样本)应该是置信度大于等于0.6的数据,为:
这里的正样本可以理解为我们预测为正确的样本有3个,但是其中真正正确的只有2个,所以我们的精确率precision=2/3。召回率recall我们可以理解为,在所有真正正确的样本中(这里有5个样本,就是标签为1的样本)我们预测的正样本中预测正确的样本的比例(正样本中标签为1的样本)所以,我们可以计算出recall=2/5。
总结:PR曲线的横坐标为召回率,纵坐标为精确率。曲线与坐标周包围的面积为AP,AP越大,说明算法越好。
3. ROC曲线的理解
我们取阈值为0.46的情况进行分析,置信度大于0.46的样本为正样本(即我们预测为正确的样本),为
真正率我们可以理解为正样本中我们预测正确的样本中(4个)真正正确的有3个(即正样本标签为1的样本)与真正正确的所有样本(所有样本标签为1的样本)的比值,所以TPR=3/5
真假率可以理解为预测正确的样本中(4个)真正错误的有1个(即正样本中标签为0的样本)与真正错误的所有样本(所有样本标签为0的样本)的比值,所以FPR=1/3
总结:ROC曲线的横轴为FPR,纵轴为TPR。AUC(Area Under Curve)即指曲线下面积占总方格的比例,面积越大,表示分类性能越好。
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)
用这些指标去评价你的模型吧!记得是二分类哦!!!