数学建模学习(2)—— 客户流失预警模型案例评估 ROC曲线与KS曲线(2022.7.19)

        昨天晚上做了个梦,梦到被老师臭骂了一顿,可以说当时把我直接吓醒了,醒过来后,惊叹一声,还好是个梦。在上个笔记中学习了逻辑回归的运用,这节课再来看一看对模型评估的方法。



一、ROC曲线

1.1 ROC曲线介绍

  前已经计算出模型的预测准确度为77.09%,但是这个准确度并不可靠,因为如果预测所有客户都不会流失,由于7000个客户中就有5000个未流失客户,那么准确度也能到 71%(5000/7000),显然这个较高的准确度是没有意义的,在商业实践中,我们更关心下面两个指标:

命中率(真正率)True Positive Rate (TPR)TPR = TP/(TP+FN)
假报警率False Positive Rate(FPR)FPR = FP/(FP+TN)

其中TP、FP、TN、FN的含义如下表,这个表也被称为混淆矩阵:

1(预测流失)0(预测不流失)合计
1(实际流失)TP=0 正确肯定FN=2000 漏报TP+FN=2000
0(实际不流失)FP=0 虚报TN = 5000正确否定FP+TN=5000

总体来说,命中率计算是所有实际流失(分类为1)的客户中被预测为流失客户所占的比例,也成真正率,或召回率;而假警报计算的则是所有实际未流失(分类为0)的客户所占的比例,也称假正率。大家可以通过如下公式加深记忆和理解。

                     

一个优秀的客户流失预警模型,命中率(TPR)应该要尽可能的高,既能尽量揪出潜在的流失客户,而假警报率应该尽可能低。我们可以把假警报率理解为亏损,命中率理解为收益,就是希望假警报率尽可能小的情况下,命中率尽可能大。

1.2 ROC 混淆矩阵python代码实现

from sklearn.metrics import confusion_matrix

# 传入测试集和实际值
m = confusion_matrix(y_test,y_pred)

print(m)
a = pd.DataFrame(m,index = ['0(实际不流失)','1(实际流失)'],
                 columns=['0(预测不流失)','1(预测流失)'])
print(a)

out:

[[927 112]
 [219 139]]

   由上可以看到实际流失为348,其中有139人被准确预测,命中率TPR为39%,实际未流失为1061,其中有112人被误判为流失,假警报率为10%,需要注意的是这里的TPR都是阈值为50%的条件下计算的。

还可以通过下面代码计算命中率,无需手动计算:

from sklearn .metrics import classification_report
print(classification_report(y_test,y_pred))

out:

 可以看到命中率为39%和手动运算的一样。

1.3 用ROC曲线评估客户流失预警模型

在实战中我们希望阈值相同的时候,假警报率尽可能小,命中率尽可能高,该思想反映在曲线上就是ROC曲线非常接近(0,1),然而用曲线AUC值来衡量模型的好坏,即ROC曲线下方的面积,该面积的取值范围通常为0.5-1,0.5表示随机判断,1则表示完美模型,通常在70%左右,勉强可以接受,80%以上算较好的模型python计算如下:

# 求出不同阈值下的命中率
from sklearn.metrics import roc_curve
fpr,tpr,thres = roc_curve(y_test,y_pred_proba[:,1])
#fpr:假警报率 ,tpr:命中率 ,thres:阈值
a = pd.DataFrame()
a['阈值'] = list(thres)
a['假警报率'] = list(fpr)
a['命中率'] = list(tpr)
import matplotlib.pyplot as plt

plt.plot(fpr,tpr)
plt.title('ROC')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.legend(['ROC'])
plt.show()
# 获取模型的auc值
from sklearn.metrics import roc_auc_score

score = roc_auc_score(y_test,y_pred_proba[:,1])
print(score)

out:

0.73

这个数据勉强可以接受,说明模型可以使用。

二、KS曲线

2.1 KS曲线介绍

KS曲线和ROC曲线本质上是相同的,同样关注命中率和假警报率,不同的区别是,KS曲线将阈值作为横坐标将,将命中率与假警报率之差作为纵坐标,KS的计算公式如下:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        KS = max(TPR-FPR)

KS的值就是KS曲线的峰值,具体来说每一个阈值都对应着一个TPR-FPR,那么就一定存在个阈值,使得在该阈值条件下,TPR-FPR的值最大,那么此时的TPR-FPR的值就称为KS值。如下图图。

不同取值的KS具体含义如下:

KS值小于0.2,一般认为模型的区分能力较弱。

KS值在[0.2,0.3]之间,模型具有一定区分能力。

KS值在[0.3,0.5]之间,模型具有较强的区分能力。

但KS值不是越大越好,如果KS值大于0.75,往往模型有异常。

2.2 用KS曲线评估客户流失预警模型

代码如下:

import pandas as pd
from sklearn.metrics import roc_curve
fpr,tpr,thres = roc_curve(y_test,y_pred_proba[:,1])
a = pd.DataFrame()
a['阈值'] = list(thres)
a['假警报率'] = list(fpr)
a['命中率'] = list(tpr)

plt.plot(thres[1:],tpr[1:])
plt.plot(thres[1:],fpr[1:])
plt.plot(thres[1:],tpr[1:]-fpr[1:])
plt.xlabel('threshold')
plt.legend(['tpr','fpr','tpr-fpr'])
plt.gca().invert_xaxis()
plt.show()
print(max(tpr-fpr))
# 在0.3-0.5区间类有较强的区分能力
a['TPR-FPR'] = a['命中率']-a['假警报率']
print(a[a['TPR-FPR']==max(a['TPR-FPR'])])

out:

0.4040197654599125

可以看到KS值为40%,说明有较强的区分能力。

好了今天的整理就是这些,虽然大部分是书上的,但整理完了,还是自己整理过,和看书,就是两回事,收获还是比较大的。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值