评价一个机器学习模型的性能有很多指标,如准确率、查准率、查全率(=召回率=敏感度)、F1值等。这篇博客整理了一些评价指标,并使用python封装了一个方法类,作为日常整理,也希望能对别人提供帮助。
对于二分类问题,分类的结果会出现以下4中情况
其中,TP表示原本是正向的且被分类器正确地分到正向那一类中(即,真阳性)的样本数,FP表示原本是负向但被分类器错误的分到正向那一类中(即,假阳性)的样本数,FN表示原本是正向但却被分类器错误的分到负向那一类中(即,假阴性)的样本数,TN表示本来是负向且被分类器正确的分到负向那一类中(即,真阴性)的样本数。
准确率又可被称为正确率(Accuracy),是常用来衡量一个分类模型的预测效果优劣的指标。正确率的计算公式如下:
准确率是衡量分类模型预测效果优劣的指标,但是在实际的应用中,准确率却不能够全面的判断一个模型的优劣。
也称为精度,表示被分类为正样本的样本中真正的正样本有多少,计算公式如下:
又称为召回率,或是敏感度,是指真阳性样本数量与样本集中全部阳性样本的数量的比值,表示所有正样本中有多少正样本被找出来,计算公式如下:
由于精度与召回率是一对相互矛盾的度量指标,所以为了综合评定分类器的表现,引入了F1-测度值这一指标,F1-测度值(F1-Score)是基于精度与召回率的调和平均定义的,即:
但,由于在有的应用中,对精度和召回率的重视程度不太相同,因此,F1有了更为一般的形式:
其中β>0时,度量了召回率对精度的相对重要性;当β=1时,退化为F1;当β>1时,表示召回率更为重要;当β<1时,表示查准率更重要。
Kappa 系数(CK)是一种衡量分类精度的指标,为1960年Cohen 等提出作为评价判断的一致性程度的指标。其计算公式为:
其中,
马修斯相关系数(MCC)是马修斯在1975年由生物化学引入,它考虑到真假阳性和真假阴性,并且通常是被视为一种平衡的措施,即使这些类别的规模大小不同也可以使用。MCC 实质上是观察到的类别和预测的二分类之间的相关系数,其计算公式如下:
使用python衡量模型的性能主要使用到sklearn.metrics工具包,提前导入的包包括:
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc ###计算roc和auc
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
下面是一个常用的指标实现方法。
输入:
name:模型名称
y_true:真实标签
y_pred:预测标签
输出:
将计算好的指标直接存储到文件results.txt中。
def modelPerformance(name,y_true,y_pred):
results2file('-------------------------------------------------------------')
#准确率
from sklearn.metrics import accuracy_score
#查准率
from sklearn.metrics import precision_score
#查全率=召回率=敏感度
from sklearn.metrics import recall_score
#特异性:1-FPR
from sklearn.metrics import roc_curve
fpr,_,_ = roc_curve(y_pred, y_true)
#f1值
from sklearn.metrics import f1_score
#Kappa系数
from sklearn.metrics import cohen_kappa_score
#Matthews相关系数
from sklearn.metrics import matthews_corrcoef
#写入文件
results2file(name)
results2file('准确率: '+str(accuracy_score(y_true,y_pred)))
results2file('查准率: '+str(precision_score(y_true,y_pred)))
results2file('敏感度(SE): '+str(recall_score(y_true,y_pred)))
results2file('特异性(SP): '+str(1-fpr[1]))
results2file("F1值: "+str(f1_score(y_true,y_pred)))
results2file("Kappa系数: "+str(cohen_kappa_score(y_true,y_pred)))
results2file("Matthews相关系数: "+str(matthews_corrcoef(y_true,y_pred)))
接下来是ROC曲线的绘制,需要先通过roc_curve计算fpr和tpr,然后画图。
def getRUC(y_true,y_pred):
fpr,tpr,threshold = roc_curve(y_pred, y_true) ###计算真正率和假正率
roc_auc = auc(fpr,tpr) ###计算auc的值
return fpr,tpr,roc_auc
def rocCurve(y_true,y_pred,color='darkorange',name="ROC curve", fsize=21):
fpr,tpr,roc_auc=getRUC(y_true,y_pred)
#plt.figure(figsize=(10,10))
lw = 2
plt.plot(fpr, tpr, color,
lw=lw, label=name+'(area = %0.4f)' % roc_auc) ###假正率为横坐标,真正率为纵坐标做曲线
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate', fontsize=fsize)
plt.ylabel('True Positive Rate', fontsize=fsize)
plt.title('Receiver Operating Characteristic', fontsize=fsize)
plt.legend(loc="lower right", fontsize=fsize)
#plt.show()
调用主函数进行测试:
if __name__=="__main__":
import pandas as pd
true_test=pd.read_excel('test.xlsx')['label1']
true_train=pd.read_excel('train.xlsx')['label1']
pred_test=pd.read_excel('pred_value_test.xlsx')
pred_train=pd.read_excel('pred_value_train.xlsx')
#基本性能指标
modelPerformance("训练",true_train,pred_train)
modelPerformance("测试",true_test,pred_test)
#ROC曲线
plt.figure(figsize=(10,10))
rocCurve(true_train,pred_train,color='darkorange',name='训练')
rocCurve(true_test,pred_test,color='green',name='测试')
savename='./'+'训练和测试的ROC曲线对比'+'.jpg'
plt.savefig(savename)
plt.show()