银行信用卡批准——模型评估ROC&AUC

Dataset

本文的数据集credit.csv提供了关于信用卡信誉信息总共有两列

paid:is the label, whether someone has paid or not paid their credit card in the past. (以前的信用卡是否有还)
model_score:is the probability of being approved.(被奇准贷款的概率)

import matplotlib.pyplot as plt
import pandas
credit = pandas.read_csv("credit.csv") print(credit.head(10)) plt.scatter(credit["model_score"], credit["paid"])
plt.show()
'''
 paid model_score
0     1     0.787062
1     1     0.959871
2     1     0.881820
3     1     0.918720
4     1     0.776411
5     1     0.541068
6     1     1.000000
7     1     0.882755
8     1     0.705474
9     1     0.818945
'''

Predictive Power

观察上面的数据可知,我们最看重的结果就是最后那个被批准的概率,我们得到这个结果之后需要进行判断到底是否批准办理信用卡,那么需要设置一个鉴别阈(discrimination threshold)。比如,我们将其设置为0.6,那么大于0.6的我们就对其接受,其他的就拒绝。

  • 假如将阈值设置为0.5,然后将model_score中大于0.5的表示允许办理行用卡,那么与实际是否换卡的信息paid进行比较即可得到模型的精确度
# Will we approve the credit card based on the probability of paying?
pred = credit["model_score"] > 0.5 # This operation tells us whether the prediction was correct 
print(pred == credit["paid"])
accuracy = sum(pred == credit["paid"]) / len(pred)
'''
accuracy :0.86830015313935682
'''

Sensitivity, Specificity, And Fall-Out

银行想要多盈利,那么必然要尽可能多的放贷,同时也要考虑风险,那么他们会倾向于拒绝有很高的违约概率的客户,但是会允许有适当的违约概率的用户。因此预测的精确度并不是一个很好的度量准则。

  • 下面是二分类中很重要的几个度量值:

    银行信用卡批准——模型评估ROC&AUC_第1张图片

  • Sensitivity or True Postive Rate(灵敏度或真阳性率):可以放贷的用户中,真正放贷的比例(越高越好,带来更多利润)

    这里写图片描述

  • Specificity or True Negative Rate (特异性或真阴性率):不可以放贷的用户中真正拒绝的比例(越高越好,否则漏过很多违约的人)

    这里写图片描述

  • Fall-out or False Positive Rate(影响或假阳性率):真正放贷的人中违约的比例(越小越好)

    这里写图片描述

  • 计算模型的FPR(假阳性率)和TPR(真阳性率)

# Predicted to play tennis
pred = credit["model_score"] > 0.5 # Number of true negatives
TN = sum(((pred == 0) & (credit["paid"] == 0)))

# Number of false positives
FP = sum(((pred == 1) & (credit["paid"] == 0)))

# Compute the false positive rate
FPR = FP / (TN + FP)
TP =  sum(((pred == 1) & (credit["paid"] == 1)))
FP = sum(((pred == 1) & (credit["paid"] == 0)))
TPR = TP / (FP + TP)
'''
FPR:0.168067226891
TPR:0.81818181818181823
'''

ROC Curves

  • 通过将阈值从0到1进行修改,我们可以获得多组TPR,FPR对,将其绘成一条曲线就是ROC曲线。
import numpy
def roc_curve(observed, probs):
    # choose thresholds between 0 and 1 to discriminate prediction
    thresholds = numpy.asarray([(100-j)/100 for j in range(100)])

    # initialize false and true positive rates 
    fprs = numpy.asarray([0. for j in range(100)])
    tprs = numpy.asarray([0. for j in range(100)])

    # Loop through each threshold
    for j, thres in enumerate(thresholds):
        # Using the new threshold compute predictions
        pred = probs > thres
        # Count the Number of False Positives
        FP = sum((observed == 0) & (pred == 1))
        # Count the Number of True Negatives 
        TN = sum((observed == 0) & (pred == 0))
        # Compute the False Postive Rate
        FPR =  float(FP / (FP + TN))
        # Count the number of True Positives
        TP = sum((observed == 1) & (pred == 1))
        # Count the number of False Negatives
        FN = sum((observed == 1) & (pred == 0))
        # Compute the True Positive Rate
        TPR = float(TP / (TP + FN))
        # Store the true and false positive rates
        fprs[j] = FPR
        tprs[j] = TPR

    return fprs, tprs, thresholds

fpr, tpr, thres = roc_curve(credit["paid"], credit["model_score"])
idx = numpy.where(fpr>0.20)[0][0]  #找到fpr>0.2的那个索引:62
print(tpr[idx]) #打印其tpr
print(thres[idx]) #打印该阈值
plt.plot(fpr, tpr)
''' 0.932432432432 0.38 '''

银行信用卡批准——模型评估ROC&AUC_第2张图片

Interpretation Of The ROC Curve

现在要解释下那个ROC曲线的含义:首先在哎最开始的时候,曲线上升的很快,当fpr接近0.2时,它变得平缓。这表示,在此基础上再增加阈值,不会提高tpr(真阳性率)。因此将阈值设置为0.38,此时的tpr为93%,意味着有93%的真正可以贷款的人被我们识别出来了,有20%的不能贷款的人我们贷款了,我们需要的是tpr高,fpr低。

Area Under The Curve

ROC曲线可以很好的反映这个模型的好坏(最大化tpr最小化fpr),但是他无法对比两个模型。因此提出了AUC度量,AUC表示ROC曲线下面的面积。
如果一个模型很好的拟合了数据,那么这个tpr将一直为1,因此AUC的大小为1。同样的,如果一个模型不好,那么tpr一直为0,下面的面积AUC将趋近于0,因此可以比较两个模型的AUC值来衡量模型的好坏。sklearn包里面定义了一个计算AUC的函数,下面试一下:

from sklearn.metrics import roc_auc_score
auc = roc_auc_score(credit["paid"], credit["model_score"])
''' 0.940201756378227 '''

Precision And Recall

  • 再介绍两个度量值查准率 (Precision)和查全率(Recall)

高查准率意味着允许放贷的人当中真正还贷的人更多,这个值越大银行的收益就越大。
低查全率意味着真正可以放贷的人中我们只放了一小部分,这意味着我们流失了很多客户,失去了赚钱的机会。因此较高的查全率意味着我们差不多该放的都放了。

这里写图片描述

pred = credit["model_score"] > 0.5

# True Positives
TP = sum(((pred == 1) & (credit["paid"] == 1)))
print(TP)

# False Positives
FP = sum(((pred == 1) & (credit["paid"] == 0)))
print(FP)

# False Negatives
FN = sum(((pred == 0) & (credit["paid"] == 1)))
print(FN)
precision = TP / (TP + FP)
recall = TP / (TP + FN)
''' 270 60 26 precision :0.81818181818181823 recall :0.91216216216216217 '''

Precision And Recall Curve

  • 查准率和查全率的曲线同ROC曲线一样构造,都是修改阈值,然后计算每个模型的这两个值,绘成一条线。当然sklearn中有专门的函数进行制作:
from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(credit["paid"], credit["model_score"])
plt.plot(recall, precision)
idx = numpy.where(recall<0.8)[0][0] #recall是从1降到0.2,因此要用<
print(precision[idx])
print(thresholds[idx])
''' 0.900763358779 0.689445682369 '''

银行信用卡批准——模型评估ROC&AUC_第3张图片

Interpreting The Precision Recall Curve

  • 观察上述曲线,纵坐标是查准率,当查准率在90%的时候开始急剧下降,表示更多的客户没有还贷,这是很危险的事情。而此时查全率也相当高,因此采用90%查准率和80查全率该处的阈值0.68比较合适。

你可能感兴趣的:(银行信用卡批准——模型评估ROC&AUC)