前言
Python 实现的逻辑回归后,不像 SAS 那样会自动给出模型精确度的评价,需要人为操作计算 Python 专属的 AUC (Area Under Curve),ROC 曲线与 X 轴围成的面积大小反映了模型的精度。本文将着重 AUC 值和 ROC 曲线背后的原理和 Python 代码实现。
下图为利用 SAS 进行逻辑回归后的模型评价表,c 为模型精度
上图中左边列的”一致部分,不一致部分,和结值“表示的是评价逻辑回归模型精度的三个很重要的指标,其中,结值又可以称为”相等对“。(三个指标的含义见下文)
- 通常我们希望一致对的占比高,不一致对和相等对的占比低。
- Python 的 AUC 即 SAS 中的 c 统计量,计算方式为”一致对 1/2*结值对“,图中即:86.1% 1/2 * 2.6% = 0.874
评价指标原理
为什么需要引入”对“这个概念?
以逻辑回归常用场景——预测客户是否流失为例,如果你的贷款经历越长,那你应该就越了解贷款的流程和注意事项(在贷款和还贷方面更有经验),那你也就应该越清晰的知道违约的后果,所以你违约的概率就越低。基于此背景,研究人员认为开设贷款账号距今时间越长的,P(履约)的预测值越大。
随机选取 5 条建模预测结果
建模后,我们只知道预测违约的概率与违约情况,如果针对单个用户而言,又怎么知道模型预测对了 TA 的违约情况呢?难道只是简单的认为预测违约概率大于 0.5 且违约情况为 1(是)时,这就算对了吗?
其实为了找到一致对、不一致对以及相等对,要将每一个获得相关结果的人与每一个没有获得相关结果的人进行比较,否则怎么体现”对“字,(这句话轻微拗口,得继续往下看)。
下图表示将数据集划分为 履约 和 违约 两个群体。
什么是一致对?
下图是一个对。小人头上面的文字描述了该客户开设贷款账号距今的时间和 TA 是否违约的情况。
绿衣女士的账号开设时间长于光头男士,所以程序给出的 P(履约) 更大,这一点无需多言,而且也与现实情况相符,P(履约) 大的就是履约,小的就是违约;即实际排序与模型相符(头顶左违右履,脚底左1右0 ),这是一个一致对。
注意:不少朋友可能还以为 P(履约) 超过 0.5 就算履约,低于则表示违约;其实这个并不一定,这个履违约阈值还需要根据实际业务情况考量,比如我要贷款十亿,我的履约率怎么也得满银行它才有信心贷这么一大笔钱给我。
什么是不一致对 ?
先给新的一对客户换套衣服
有了一致对的经验,判断不一致对就容易多了。红发女士比光头男士(为什么男士总是光头)的开户时间长,P(履约) 更高,但结果却是违约。两人相比之下,模型给出的履约概率高的人反倒违约了,即实际排序与模型不符,这是一个不一致对。
什么是相等对(结值) ?
上套艳丽点的衣服吧!
这次我们发现模型给出二者的预测概率相等,均为0.3697,还是分别从履约和违约这两个群体中各抽一个,但巧合的是,两者的开户时长都一样,所以很明显可以看到模型在这个对中预测正确了一半。
综上,二分类逻辑回归的精度 = 1* 一致对 0* 不一致对 1/2* 相等对,按照常识,从履约组和违约组中各抽一个客户,P(履约) 相等的概率是十分小的(下图只有 2.6%),让我们再来看看文章开头的 SAS 模型结果图
混淆矩阵与 ROC 曲线
混淆矩阵这个老概念不必多说,直接看下表即可,但它却是 Python 逻辑回归模型评价指标 ROC 曲线背后的非常重要的一个知识点。
ROC(Receiver Operating Characterstic)曲线一一接收者操作特征曲线。最早应用于雷达信号检测领域,用于区分信号与噪声。信号检测论:在听觉感受性相同的情况下,判断标准不一样。
①冒进:每次出现不会“漏报”,感觉有就报告。 ②保守:每次出现不会“虚报”,没有把握不会报告。
AUC 的值即 ROC 曲线与 X 轴围成的面积。
代码实现
建模结果
- churn:1.0 - 违约;0.0 - 履约
- proba:违约的概率
# sklearn 包绘制 Python 专门用来评估逻辑回归模型精度的 ROC 曲线
import sklearn.metrics as metrics
# 分别对测试集和训练集进行 ROC 曲线的绘制
fpr_test, tpr_test, th_test = metrics.roc_curve(test.churn, test.proba)
# 传入三个变量,一致对,相等对,不一致对,
## 调用 metrics 的 roc_curve 函数,传入两个参数:原本值和预测值
fpr_train, tpr_train, th_train = metrics.roc_curve(train.churn, train.proba)
plt.figure(figsize=[3, 3])
plt.plot(fpr_test, tpr_test, 'b--')
plt.plot(fpr_train, tpr_train, 'r--')
plt.title('ROC curve'); plt.show()
print(f'AUC = {metrics.auc(fpr_test, tpr_test)}')
# metrics 下的 auc 函数
通过 AUC 值,我们可以发现模型精度较高。
至于如何利用逻辑回归完整的实现客户流失预警模型的构建,可参考本公众号的其他文章。