python模型性能评估的一个小工具类

评价一个机器学习模型的性能有很多指标,如准确率、查准率、查全率(=召回率=敏感度)、F1值等。这篇博客整理了一些评价指标,并使用python封装了一个方法类,作为日常整理,也希望能对别人提供帮助。

一、相关原理

对于二分类问题,分类的结果会出现以下4中情况
在这里插入图片描述
其中,TP表示原本是正向的且被分类器正确地分到正向那一类中(即,真阳性)的样本数,FP表示原本是负向但被分类器错误的分到正向那一类中(即,假阳性)的样本数,FN表示原本是正向但却被分类器错误的分到负向那一类中(即,假阴性)的样本数,TN表示本来是负向且被分类器正确的分到负向那一类中(即,真阴性)的样本数。

ACC

准确率又可被称为正确率(Accuracy),是常用来衡量一个分类模型的预测效果优劣的指标。正确率的计算公式如下:
在这里插入图片描述
准确率是衡量分类模型预测效果优劣的指标,但是在实际的应用中,准确率却不能够全面的判断一个模型的优劣。

查准率

也称为精度,表示被分类为正样本的样本中真正的正样本有多少,计算公式如下:
在这里插入图片描述

查全率

又称为召回率,或是敏感度,是指真阳性样本数量与样本集中全部阳性样本的数量的比值,表示所有正样本中有多少正样本被找出来,计算公式如下:
在这里插入图片描述

特异性

特异性是在医学领域使用比较多的指标,其计算公式为:
在这里插入图片描述

F1值

由于精度与召回率是一对相互矛盾的度量指标,所以为了综合评定分类器的表现,引入了F1-测度值这一指标,F1-测度值(F1-Score)是基于精度与召回率的调和平均定义的,即:
在这里插入图片描述
但,由于在有的应用中,对精度和召回率的重视程度不太相同,因此,F1有了更为一般的形式:
在这里插入图片描述
其中β>0时,度量了召回率对精度的相对重要性;当β=1时,退化为F1;当β>1时,表示召回率更为重要;当β<1时,表示查准率更重要。

Kappa 系数

Kappa 系数(CK)是一种衡量分类精度的指标,为1960年Cohen 等提出作为评价判断的一致性程度的指标。其计算公式为:
在这里插入图片描述
其中,
在这里插入图片描述

马修斯相关系数(MCC)

马修斯相关系数(MCC)是马修斯在1975年由生物化学引入,它考虑到真假阳性和真假阴性,并且通常是被视为一种平衡的措施,即使这些类别的规模大小不同也可以使用。MCC 实质上是观察到的类别和预测的二分类之间的相关系数,其计算公式如下:在这里插入图片描述

二、python工具类

使用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()
    

最终模型效果:
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页