r语言交叉验证法 交叉验证的roc曲线_r语言交叉验证法


在建立逻辑回归模型后,判断它的对数据的分别能力是非常重要的一部。在前面的文章中我们提到过基尼系数的计算,今天我们来讲一下另一种判断方法的计算:ROC曲线。ROC曲线描述了在一定累计好客户比例下的累计坏客户的比例,模型的分别能力越强,ROC曲线越往左上角靠近。

相信大家对ROC曲线都不陌生,我们经常跑一段程序然后生成这么样一个图:


r语言交叉验证法 交叉验证的roc曲线_roc曲线怎么绘制_02


再看看AUC的大小,越大说明模型越好。但是,ROC曲线上的每一个点是怎么计算得到的呢?

首先,先介绍一下混淆矩阵,对于逻辑回归等二分类问题它长这样:


r语言交叉验证法 交叉验证的roc曲线_r语言交叉验证法_03


第一行说明实际为1的样本中有TP个被正确分类,FN个被错分为0;第二行说明实际为0的样本中有FP被错分为1,TN个分类正确。

那么一个模型的特异度(specificity)可以定义为TNR(TrueNegative Rate)=TN/(FP+TN),灵敏度(sensitivity)可以定义为TPR(TruePositive Rate)=TP/(TP+FN)。而ROC曲线的横坐标是1-特异度=1-TNR=FP/(FP+TN)=FPR(FalsePositive Rate),纵坐标是灵敏度即TPR

要画出ROC曲线,首先我们要把所有的样本按照逻辑回归的结果(Predictor)从大到小排序,然后设定一个阈值,比如说70%。那么前70%的样本被预测为1,其余30%被预测为0。这个时候我们可以得到该阈值下的FPR和TPR作为横纵坐标,这就是ROC曲线上的一个点。取不同的阈值,就可以得到一系列的点,连起来就是ROC曲线了。

举个栗子。

假设我们已经使用44062个样本(41670个1、2392个0)建立了一个逻辑回归模型,把目标变量(response)和模型的结果(predictor)放在一个数据集result中:


r语言交叉验证法 交叉验证的roc曲线_数据集_04


对predictor从大到小排序:


r语言交叉验证法 交叉验证的roc曲线_风控_05


首先,我们先设定阈值为10%,一共有4882个样本被预测为1(由于逻辑回归的结果有重复值,这里选取了所有值大于等于第44062/10≈4406个样本的样本,所以样本数并不严格等于4406),其中有4829个样本对应的目标变量(实际值)为1,此时混淆矩阵为:


r语言交叉验证法 交叉验证的roc曲线_正例_06


再分别设置阈值为20%、30%、40%......我们可以得到:


r语言交叉验证法 交叉验证的roc曲线_数据集_07


其中,TP=正例数,FN=41670-TP,FP=样本数-正例数,TN=2392-FP。

以FPR为横坐标,TPR为纵坐标,可以得到ROC曲线:


r语言交叉验证法 交叉验证的roc曲线_风控_08


附上R代码(result为上文中提到的由response和predictor组成的数据集):


r语言交叉验证法 交叉验证的roc曲线_正例_09