这段时间在进行一个贷款审批准入规则的评估工作,对各类规则的分类效果进行评估。目前经常用到相关的分类模型性能评估指标有如ROC、AUC、KS、LIFT、GAIN等等。但是这些指标各自评估的重点是什么,在什么情况下适用,结合我的工作经验,和大家分享一下:
一、混淆矩阵及其相关指标
要弄懂上面的那些指标,最关键的是要了解混淆矩阵,对于一个二分类问题,混淆矩阵是如下这种结构:
基础指标
TP : 实际为正例预测为正值的个数
FN:实际为正例预测为负值的个数
FP:实际为负例预测为正值的个数
TN:实际为负例预测为负值的个数
一级衍生指标:
覆盖率(sensitivity或TPR) : TP / (TP + FN)
准确率(PV+): TP/ (TP + FP)
这两个指标是模型分类能力评估最核心的指标,上面所有的性能评价指标都是有这两个的体现或衍生而来。写到这不由的想到电视里一个情节:反动份子一手拿着枪,一手拿着皮鞭,嘴里不停的嚷嚷着一句话”宁可错杀一千,不可放过一个”。这就话其实包含了分类模型评判的标准:按照他们的要求,模型的覆盖率要达到100%,也就是不可放过一个,为此他们放低了模型的准确率,准确率降到千分之一,也就是错杀一千。同时这句话同时也告诉我们覆盖率和准确率对模型来讲往往是“鱼与熊掌不可兼得”。
二级衍生指标:
假正率(FPR):FP / (FP + TN) 可以解释为实际是负值却被预测是正值的个数 / 所有负值个数
正例的比率 : (TP + FN) / (TP + FN + FP +TN) 就是正例占所有样本的比率
正确预测成正值的正例个数占总样本数的比率PTP: TP / (TP +FN +FP +TN)
把负例预测成正值个数占总样本数的比率 PFP: FP / (TP+FN +FP +TN)
预测成正值个数占总样本数的比率 DEPTH: PTP+PFP
三级衍生指标:
LIFT : 准确率 / 正例的比率 = {TP / (TP+FP)} / {(TP + FN) / (TP + FN + FP +TN)}
有了这三级指标,我们就可以构造相关的模型性能测试指标了
有图有真相,在介绍这些性能测试指标前,我们先准备测试数据:
有了测试数据我们就可以正式了解相关的性能评估指标了
1 ROC和AUC
直接上图:
全套代码奉上
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
## 读入测试数据
test_df = pd.read_excel(r'E:pythontest性能指标测试数据.xlsx')
##数据映射
dict_map = {'正':1,'负':0}
test_df['flag'] = test_df['结果'].map(dict_map)
##计算FPR 和 TPR 以及AUC
fpr,tpr,threshold = roc_curve(y_test, y_score)
roc_auc = auc(fpr,tpr)
#画图
plt.figure()
lw = 2
plt.figure(figsize=(8,8))
###假正率为横坐标,覆盖率为纵坐标做曲线
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % 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(u'假真率(FPR)')
plt.ylabel(u'覆盖率(TPR)')
plt.title(u'ROC 测试图')
plt.legend(loc="lower right")
plt.show()
重点说明:
1、 ROC图计算的是TPR和FPR两个指标及覆盖率和假正率的关系,AUC是ROC图形围成的面积,在此例中为0.74;
2、 ROC图形形成的方法大致为,把计算的概率值从大到小排列(如测试案例所示),把这些概率值 依次作为阀值,计算在此阀值下的TPR和FPR,然后作为纵坐标点和横坐标点描点在坐标轴上。举个栗子:如果我们选序13号样本,概率0.43作为阀值,则 概率值>=0.43的都认为是正,则排在前面的13个样本都被预测为正。此时覆盖率为 TPR = 9/11 =0.82(前面13个样本中有9个样本预测准确,所有真实结果为正的样本为11),FPR = 4/11=0.37(前面13个样本中有4个样本预测错误,所有真实结果为负的样本为11),把(0.82,0.37)描点到坐标轴(如图),其他的点依此类推,就画出了ROC图;
3、 那条斜率为1的蓝虚线又是什么?这条蓝虚线叫做随机选择线也称为基线。就是在没有分类器的情况下,我们根据原始数据的分布来随机指定样本分类,此时TPR/FPR 恒等于1;
4、 不同模型分类能力可以通过ROC和AUC来进行比较,ROC图形越靠近左上角或是AUC的值越大,则模型的分类能力越强。AUC>0.9 表示模型的分类能力很好,0.7 < AUC < 0.9 表示模型的分类能力可以接受,小于0.7 就和随机选择没什么区别了。
5、ROC 和AUC 针对的是覆盖率这个指标,对模型的分类的准确率没有涉及,这个由后续的性能评估指标来覆盖。