Python 绘制ROC曲线求解AUC模板代码
# 预测正例的概率 y_pred_prob=model.predict_proba(X_test)[:,1] # y_pred_prob ,返回两列,第一列代表类别0,第二列代表类别1的概率 #https://blog.csdn.net/dream6104/article/details/89218239 fpr, tpr, thresholds = metrics.roc_curve(y_test,y_pred_prob, pos_label=2) #pos_label,代表真阳性标签,就是说是分类里面的好的标签,这个要看你的特征目标标签是0,1,还是1,2 roc_auc = metrics.auc(fpr, tpr) #auc为Roc曲线下的面积 # print(roc_auc) plt.figure(figsize=(8,6)) plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') plt.plot(fpr, tpr, 'r',label='AUC = %0.2f'% roc_auc) plt.legend(loc='lower right') # plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0, 1.1]) plt.ylim([0, 1.1]) plt.xlabel('False Positive Rate') #横坐标是fpr plt.ylabel('True Positive Rate') #纵坐标是tpr plt.title('Receiver operating characteristic example') plt.show()
错误率
错误率(Error Rate):是分类错误的样本数占样本总数的比例。对样例集D,分类错误率计算公式如下所示:
统计分类器预测出来的结果与真实结果不相同的个数,然后除以总的样例集D的个数。
精度
精度(Accuracy):是分类正确的样本数占样本总数的比例。对样例集D,精度计算公式
这里的分类正确的样本数指的不仅是正例分类正确的个数还有反例分类正确的个数。
查准率、查全率
这里的查准率其实就是上面的真正例:TP/TP+FP
查准率,它表示的是预测为正的样例中有多少是真正的正样例,相对于本来有样本有10个,正样本9个,负样本1个,预测出来TP:8.那么FP:0,所以查准率为100%。相对于是有一个本来是1的我们却预测为0,但是对于查准率来说,这是不会影响的。
精确度(Accuracy),缩写表示用A。精确度则是分类正确的样本数占样本总数的比例。Accuracy反应了分类器对整个样本的判定能力(即能将正的判定为正的,负的判定为负的)。
这里需要注意的就是精度和准确率是不一样的,准确率是查准率,这里的准是代表着正(1)的概率
查全率(Recall),又叫召回率,缩写表示用R。查全率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确。
通过上述的介绍,我们发现查准率和查全率是有矛盾的
查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。
为什么这么说呢?因为查准率是考虑的在预测结果为1的样本中,验证真正的为1的数量占比;而查全率是考虑的在本来就是1的样本中,有多少被预测为1的占比。
是不是有点绕了,这里举一个具体的例子,比如还是一共10个样本,其中有9个1,1个0;通过模型预测出来有8个1,2个0,那么它的查准率是100%,但是它的召回率,也就是9个里面只召回了8个。那么需要召回率高也就是说,就需要原本是1的都预测为1,不出现预测为0,但是都预测为1了,那么这个质量又无法保证,会出现本来是0的,却预测为1了。
这里需要仔细的思考一下,不然真的容易混淆!!!!
我们可以这样理解,在一个分类器中,你想要更高的查准率,那么你的阈值要设置的更高,只有这样才能有较高的把握确定我们预测是正例是真正例。
一旦我们把阈值设置高了,那我们预测出正例的样本数就少了,那真正例数就更少了,查不全所有的正样例。
举个例子来理解一下吧!例如,若希望将好瓜尽可能多地挑选出来,则可通过增加选瓜的数量来实现,如果将所有的西瓜都选上,那么所有的好瓜也必然都选上了,但这样查准率就会较低;若希望选出的瓜中好瓜比例尽可能高,则可只挑选最有把握的瓜,但这样就难免会漏掉不少好瓜,使得查全率较低。通常只有在一些简单任务中,才可能使查全率和查准率都很高。
P-R曲线
在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,排在最后的是学习器认为“最不可能”是正例的样本。按此顺序设置不同的阈值,逐个把样本作为正例进行预测,则每次可以计算出当前的查准率、查全率。
以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称“P-R曲线”,显示该曲线的图称为“P-R图”。图1给出了一个示意图。
P-R图直观地显示出学习器在样本总体上的查全率、查准率。在进行比较时,若一个学习器的P-R曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者。
例如图1中学习器A的性能优于学习器C;如果两个学习器的P-R曲线发生了交叉,例如图1中的A和B,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率条件下进行比较。然而,在很多情形下,人们往往仍然希望把学习器A与B比出个高低。
这时,一个比较合理的判断依据是比较P-R曲线下面积的大小,它在一定程度上表征了学习器在查准率和查全率上取得相对“双高”的比例。但这个值不太容易估算,因此,人们设计了一些综合考虑查准率、查全率的性能度量,比如BEP度量、F1度量。
Python绘制P-R曲线模板代码
import matplotlib import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_curve # 预测正例的概率 y_pred_prob=model.predict_proba(X_test)[:,1] plt.figure(1) # 创建图表1 plt.title('Precision/Recall Curve')# give plot a title plt.xlabel('Recall')# make axis labels plt.ylabel('Precision') #y_true和y_scores分别是gt label和predict score y_true = np.array([0, 0, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8]) #fpr, tpr, thresholds = metrics.roc_curve(y_test,y_pred_prob, pos_label=2) precision, recall, thresholds = metrics.roc_curve(y_test,y_pred_prob, pos_label=1) plt.figure(1) plt.plot(precision, recall) plt.show()
平衡点(BEP)
“平衡点”(Break-Even-Point,简称BEP)就是这样一个度量,它是“查准率=查全率”时的取值,例如图1中学习器C的BEP是0.64,而基于BEP的比较,可认为学习器A优于B。
F1度量
越大越好
BEP曲线还是过于简化了些,更常用的是F1度量。我们先来谈谈F1度量的由来是加权调和平均,计算公式如下所示。
import matplotlib import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_curve # 预测正例的概率 y_pred_prob=model.predict_proba(X_test)[:,1] plt.figure(1) # 创建图表1 plt.title('Precision/Recall Curve')# give plot a title plt.xlabel('Recall')# make axis labels plt.ylabel('Precision') #y_true和y_scores分别是gt label和predict score y_true = np.array([0, 0, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8]) #fpr, tpr, thresholds = metrics.roc_curve(y_test,y_pred_prob, pos_label=2) precision, recall, thresholds = metrics.roc_curve(y_test,y_pred_prob, pos_label=1) plt.figure(1) plt.plot(precision, recall) plt.show()
在一些应用中,对查准率和查全率的重视程度有所不同。例如在商品推荐系统中,为了尽可能少打扰用户,更希望推荐内容确实是用户感兴趣的,此时查准率更重要;而在逃犯信息检索系统中,更希望尽可能少漏掉逃犯,此时查全率更重要。F1度量的一般形式是能让我们表达出对查准率/查全率的不同偏好,它定义为公式如下:
其中,β>0度量了查全率对查准率的相对重要性。β=1时,退化为标准的F1;β>1时查全率有更大影响;β<1时,查准率有更大影响
Python求解F1_score代码
from sklearn.metrics import f1_score y_pred = [0, 1, 1, 1, 2, 2] y_true = [0, 1, 0, 2, 1, 1] #这里需要注意,如果是二分类问题则选择参数‘binary’(默认);如果考虑类别的不平衡性,需要计算类别的加权平均,则使用‘weighted’;如果不考虑类别的不平衡性,计算宏平均,则使用‘macro’。 print(f1_score(y_true, y_pred, average='macro')) print(f1_score(y_true, y_pred, average='weighted'))