用ROC曲线评估客户流失预警模型 | 更文挑战

762 阅读3分钟

“这是我参与更文挑战的第20天,活动详情查看: 更文挑战

在Python中,通过如下代码就可以求出不同阈值下的命中率(TPR)和假警报率(FPR)的值,从而绘制出ROC曲线。

from sklearn.metrics import roc_curve
fpr,tpr,thres = roc_curve(y_test,y_pred_proba[:,1])

第1行代码引入roc_curve()函数。第2行代码为roc_curve()函数传入测试集的目标变量y_test及预测的流失概率y_pred_proba[:,1],计算出不同阈值下的命中率和假警报率。因为roc_curve()函数返回的是一个含有3个元素的元组,其中默认第1个元素为假警报率,第2个元素为命中率,第3个元素为阈值,所以这里将三者分别赋给变量fpr(假警报率)、tpr(命中率)、thres(阈值)。

此时获得的fpr、tpr、thres为3个一维数组,通过如下代码可以将三者合并成一个二维数据表。

a=pd.DataFrame()
a['阈值']=list(thres)
a['假警报率']=list(fpr)
a['命中率']=list(tpr)

通过打印a.head()和a.tail()查看不同阈值下的假警报率和命中率,结果见下表。

image.png

可以看到,随着阈值的下降,命中率和假警报率都在上升。对该表格有几点说明如下。

第一,表格第1行的阈值表示只有当一个客户被预测流失的概率≥193%,才判定其会流失,但因为概率不会超过100%,所以此时所有客户都不会被预测为流失,此时命中率和假警报率都为0。可见这个阈值其实没有什么意义,那么为什么还要设置它呢?这个阈值是roc_curve()函数的默认设置,官方文档中对它的介绍是:“thresholds[0]represents no instances being predicted and is arbitrarilyset to max(y_score)+1.”。这句话的意思是第一个阈值没有含义,其往往设置为最大阈值(本案例中为0.9303)+1,以保证没有任何记录被选中。

第二,表格第2行数据表示只有当一个客户被预测流失的概率≥93.03%,才判定其会流失,这个条件还是比较苛刻的,此时被预测为流失的客户还是很少,命中率为0.0028,即“预测为流失且实际流失的客户/实际流失的客户”这一比率为0.0028,假设此时共有5000组实际流失的客户,那么在该阈值条件下,实际流失的客户中会有5000×0.0028=14人被准确判断为会流失。此时假警报率为0,即“预测为流失但实际未流失的客户/实际未流失的客户”这一比率为0,即实际未流失的客户中不会有人被误判为流失。

现在已知不同阈值下的假警报率和命中率,用Matplotlib库相关知识点绘制ROC曲线,代码如下。

import matplotlib.pyplot as plt
plt.plot(fpr,tpr)
plt.title('ROC')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()

绘制的ROC曲线如下图所示。

image.png

通过如下代码则可以快速求出模型的AUC值。

from sklearn.metrics import roc_auc_score
score = roc_auc_score(y_test,y_pred_proba[:,1])

第1行代码引入roc_auc_score()函数;第2行代码为roc_auc_score()函数传入测试集中目标变量y_test的值及预测的流失概率。获得的AUC值为0.81,可以说预测效果还是不错的。