使用Python进行多个机器学习模型、多个评价指标表格绘制(AUC、敏感度、特异度、F1值、约登指数、MCC、Kappa等)

一.常见模型评价指标简要说明

1.混淆矩阵

混淆矩阵是真实值和预测值的交叉表通过混淆矩阵可以构建出其他多个模型评价指标。

Class Positive Prediction Negative Prediction
Positive Class True Positive(TP) False Negative(FN)
Negative Class False Positive(FP) True Negative(TN)

2.AUC(Area Under Curve)

AUC(Area Under Curve), ROC曲线下面积,反映了模型整体的预测性能。越接近1,代表模型预测性能更好。

3.敏感度

敏感度(Sensitivity,Sen)敏感度与少数样本类别有关,它表示了阳性类样本的分类正确率。
S e n = T P T P + F N Sen = \frac {TP} {TP+FN} Sen=TP+FNTP

4.特异度

特异度(Specificity,Spe)与多数样本类别有关,表示了阴性类样本的分类正确率。
S p e = T N F P + T N Spe = \frac {TN}{FP+TN} Spe=FP+TNTN

5.PPV

阳性预测值(positive predict,PPV)指预测出的全部阳性样本中,真阳性所占的比例。表示判定为阳性类样本中,有多大概率预测是正确的。

P P V = T P T P + F P PPV = \frac {TP}{TP+FP} PPV=TP+FPTP

6.NPV

阴性预测值(negative predict,NPV)指预测出的全部阴性样本中,真阴性所占的比例。它表示判定为阴性类样本中,有多大概率预测是正确的。

N P V = T N T N + F N NPV = \frac {TN}{TN+FN} NPV=TN+FNTN

7.PLR

阳性似然比(positive likelihood ratio, PLR)是预测的真阳性率与假阳性率之比,代表预测正确判断阳性的可能性是错误判断阳性可能性的倍数。比值越大,预测结果阳性时为真阳性的概率越大。

8.NLR

阴性似然比(negative likelihood ratio, NLR)是预测的假阴性率与真阴性率之比。代表错误判断阴性的可能性是正确判断阴性可能性的倍数。其比值越小,预测结果阴性时为真阴性的可能性越大。

9.F1

F1值(F1 score)是统计学中用来衡量二分类模型精确度的一种指标,可以看作是模型精确率和召回率的一种调和平均,它的最大值是1,最小值是0。

10.约登指数

约登指数(Youden Index),是评价预测真实性的方法,假设其假阴性和假阳性的危害性同等意义时,即可应用约登指数。 约登指数是敏感度与特异度之和减去1,表示预测发现真正的阳性与阴性样本的总能力。 指数越大说明预测的效果越好,真实性越大。

Y o u d e n ′ s   I n d e x = S e n + S p e − 1 Youden's \ Index = Sen + Spe -1 Youdens Index=Sen+Spe1

11.MCC

MCC(Matthews correlation coefficient)是应用在机器学习中,用以测量二分类的分类性能的指标,该指标考虑了真阳性,真阴性,假阳性和假阴性,通常认为该指标是一个比较均衡的指标,即使是在两类别的样本不均衡时,也可以应用它。它的取值范围为[-1,1],取值为1时表示对受试对象的完美预测,取值为0时表示预测的结果还不如随机预测的结果,-1是指预测分类和实际分类完全不一致。

M C C = T P × T N − F P × F N ( T P + F P ) ( T P + F N ) ( T N + F P ) ( T N + F N ) MCC = \frac {TP\times TN - FP\times FN }{\sqrt {(TP+FP)(TP+FN)(TN+FP)(TN+FN)}} MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN) TP×TNFP×FN

12.Kappa

Kappa是一种基于混淆矩阵计算的衡量分类精度的指标,通常kappa落在 [0-1] 间,可分为五组来表示不同级别的一致性:0-0.2为极低的一致性(slight)、0.21-0.4为一般的一致性(fair)、0.41-0.6为 中等的一致性(moderate)、0.61-0.8 为高度的一致性(substantial)和0.81-1几乎完全一致(almost perfect)

二. 模型评价表格绘制代码

建立模型后,将不同模型的评价指标进行计算,然后绘制成为一张表格,可以方便地进行保存。

1.函数所需加载的包

import pandas as pd
import numpy as np
from sklearn.metrics import roc_auc_score,roc_curve,auc
from sklearn import metrics
from matplotlib import pyplot
from numpy import argmax
from functools import reduce

2.模型评价函数

(1)找到最佳cutoff

为了同时最大化敏感度和特异度,我们需要先找到最优的阈值。

def find_optimal_cutoff(tpr,fpr,threshold):
    optimal_idx = np.argmax(tpr - fpr)
    optimal_threshold = threshold[optimal_idx]
    return optimal_threshold

该函数会在best_confusion_matrix函数中调用。

(2)根据最佳cutoff值计算混淆矩阵

def best_confusion_matrix(y_test, y_test_predprob):
	"""
        根据真实值和预测值(预测概率)的向量来计算混淆矩阵和最优的划分阈值
        
        Args:
            y_test:真实值
            y_test_predprob:预测值
            
        Returns:
            返回最佳划分阈值和混淆矩阵
        """
    fpr, tpr, thresholds = roc_curve(y_test, y_test_predprob, pos_label=1)
    cutoff = find_optimal_cutoff(tpr,fpr,thresholds)
    y_pred = list(map(lambda x:1 if x>=cutoff else 0,y_test_predprob))
    TN,FP,FN,TP = confusion_matrix(y_test,y_pred).ravel()
    return cutoff,TN,FN,FP,TP

(3)单个模型评价指标计算和表格绘制

def evaluation(clf,X_train,y_train,X_test,y_test,modelname,digits):
    """
        计算各个模型评价指标
        
        Args:
            clf:已经fit好的模型
            X_train,y_train,X_test,y_test:	训练和测试数据集
            modelname:模型名称,为了表格的绘制
            digits:各个评价指标需要保留的位数
        Returns:
            返回单个模型评价指标表格
        """
    
    y_train_predprob = clf.predict_proba(X_train)[:, 1]
    train_auc = round(roc_auc_score(y_train, y_train_predprob),digits)

    y_test_predprob = clf.predict_proba(X_test)[:, 1]
    test_auc = round(roc_auc_score(y_test, y_test_predprob),digits)
    
    train_cutoff, TN1,FN1,FP1,TP1 = best_confusion_matrix(y_train,y_train_predprob)
    test_cutoff, TN2,FN2,FP2,TP2 = best_confusion_matrix(y_test,y_test_predprob)

    #Sen Spe
    best_recall,best_prec = round(TP2/(TP2+FN2),digits), round(TN2/(FP2+TN2),digits)
 
    #PPV NPV
    npv,ppv = round(TN2/(FN2+TN2),digits),round(TP2/(TP2+FP2),digits)
    
    #PLR NLR
    plr,nlr = round((TP2/(TP2+FN2))/(FP2/(FP2+TN2)),digits),round((FN2/(TP2+FN2))/(TN2/(FP2+TN2)),digits)
    
    #F1值
    y_test_pred=list(map(lambda x:1 if x>=test_cutoff else 0,y_test_predprob))
    f1 = round(f1_score(y_test, y_test_pred),digits)
    
    #Youden Index
    youden = round(TP2/(TP2+FN2)+TN2/(FP2+TN2)-1,digits)

    #MCC
    mcc = round(sklearn.metrics.matthews_corrcoef(y_test, y_test_pred),digits)
    
    #Kappa
    kappa =round(sklearn.metrics.cohen_kappa_score(y_test_pred, y_test),digits)
  
    eval_df = {'Model': ['train_auc','test_auc','specificity','sensitivity','F1','Youden Index','MCC','Kappa','npv','ppv','plr','nlr'], Name: [train_auc, test_auc, best_prec,best_recall,f1,youden,mcc,kappa,npv,ppv,plr,nlr]}
    eval_df = pd.DataFrame(data=eval_df)

    return eval_df

3.函数调用和多个模型评价表格绘制

根据使用需要,有时需要训练多个模型并对比他们的表现。这个时候就需要多次调用evaluation函数并将这些表格进行合并绘制。

res_lr=evaluation(clf_lr,X_train,y_train,X_test,y_test,"LR",3)
res_rf=evaluation(clf_rf,X_train,y_train,X_test,y_test,"RF",3)
res_xgb=evaluation(clf_xgb,X_train,y_train,X_test,y_test,"XGBoost",3)

frames = [res_lr, res_rf,res_xgb]
res_df = reduce(lambda df1,df2: pd.merge(df1,df2,on='Model'), frames)
#将表格保存为csv格式文件
res_df.to_csv('model_evaluation.csv',encoding = 'utf_8_sig')

注意

评价表格中,除train_auc之外,其余评价指标都是基于测试集进行计算,如需计算训练集的评价(一般情况下应该都不需要哈哈),可以补充修改一下代码哦。

你可能感兴趣的:(数据可视化方法录,小白的机器学习方法录,机器学习,python,数据分析)