ROC曲线与KS曲线 | 更文挑战

971 阅读3分钟

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

对于二分类模型来说,主流的评估方法有ROC曲线和KS曲线两种。

ROC曲线的基本原理

image.png

一个优秀的客户流失预警模型,命中率(TPR)应尽可能高,即能尽量揪出潜在流失客户,同时假警报率(FPR)应尽可能低,即不要把未流失客户误判为流失客户。然而这两者往往成正相关,因为如果调高阈值,例如认为流失概率超过90%才认定为流失,那么会导致假警报率很低,但是命中率也很低;而如果调低阈值,例如认为流失概率超过10%就认定为流失,那么命中率就会很高,但是假警报率也会很高。因此,为了衡量一个模型的优劣,数据科学家根据不同阈值下的命中率和假警报率绘制了ROC曲线,如下图所示,其中横坐标为假警报率(FPR),纵坐标为命中率(TPR)。

image.png

在不同阈值条件下,都希望命中率尽可能高,假警报率尽可能低。举例来说,某一检测样本总量为100,其中流失客户为20人,未流失客户为80人。当阈值为20%时,也就是说当流失概率超过20%就认为客户会流失时,模型A和模型B预测出来的流失客户都是15人。如果模型A预测流失的15人中有10人的确流失,有5人属于误判,那么命中率为10/20=50%,此时假警报率为5/80=6.25%;如果模型B预测流失的15人中只有5人的确流失,有10人属于误判,那么其命中率为5/20=25%,假警报率为10/80=12.5%。此时模型A的命中率是模型B的2倍,假警报率是模型B的一半,因此可以认为模型A是一个较优的模型。

混淆矩阵的Python代码实现

通过Python查看混淆矩阵,代码如下。

from sklearn.metrics import confusion_matrix
m = confusion_matrix(y_test,y_pred)

m的打印结果如下,它是一个2行2列的二维数组。

[[968 93]
 [192 156]]

其中第1行为实际分类为0的数量,第2行为实际分类为1的数量;第1列为预测分类为0的数量,第2列为预测分类为1的数量。可以通过如下代码为表格添加行列索引。

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

将a打印输出,结果见下表。需要注意的是,通过Python获得的表格和本小节前面讲解原理时使用的表格在结构上略有不同,这里是先展示分类为0的情况,而讲解原理时使用的表格是先展示分类为1的情况。

image.png

可以看到,实际流失的348(192+156)人中有156人被准确预测,命中率(TPR)为45%;实际未流失的1061(968+93)人中有93人被误判为流失,假警报率(FPR)为8.8%。需要注意的是,这里的TPR和FPR都是在阈值为50%的条件下计算的。