01ROC曲线
ROC曲线是由不同阈值下的模型假警报率(FPR)与命中率(TPR)所组成的,如下图所示,其中FPR是横坐标,TPR是纵坐标。
命中率(TPR)计算公式为:
TPR=TP/(TP+FN)
假警报率(FPR)计算公式为:
FPR=FP/(FP+TN)
其中:
TP:正确肯定的数量
FN:漏报
FP:误报
TN:正确否定的数量
一个好的模型应该让TPR尽可能的高,而FPR尽可能低。从上图,我们可以看到,FPR与TPR之间是正相关,所以ROC曲线越靠近左上角,越陡峭,则这个模型就更完善。
当然,如果用曲线来进行描述,可能有些抽象,我们可以用AUC来判断模型的好坏。AUC指的是ROC曲线下方的面积,该值取值范围一般为0.5~1,越靠近1,则模型越好。
现实数据中,通常存在许多扰动因子,所以模型的AUC值一般达到0.75就可以接受,如果能达到0.85以上,那这个模型就非常好了。
我们来看看如何用Python绘制ROC曲线,首先查看不同阈值下的假警报率和命中率。
代码如下:
from sklearn.metrics import roc_curve fpr,tpr,thres = roc_curve(Y_test,Y_pred_proba[:,1]) data = pd.DataFrame() data['阈值'] = list(thres) data['假警报率'] = list(fpr) data['命中率'] = list(tpr) data.head(10)
接着就是绘制该模型的ROC曲线了。
代码如下:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.plot(fpr,tpr) plt.title('ROC曲线') plt.xlabel('FPR') plt.ylabel('TPR') plt.show()
AUC值为0.798,看来这个模型还是不错的,AUC值计算代码如下:
from sklearn.metrics import roc_auc_score score = roc_auc_score(Y_test,Y_pred_proba[:,1])
02KS曲线
KS曲线本质上与ROC曲线是相同的,它关注的也是假警报率(FPR)与命中率(TPR),但是它的横坐标不再是假警报率(FPR),而是阈值,纵坐标为命中率与假警报率的差值。如下图:
跟ROC曲线一样,KS曲线也有一个量化指标用来衡量模型的预测结果—KS值,其计算公式为:
KS = max(TPR-FPR)
即KS值就是KS曲线的峰值。当KS值小于0.2时,我们认为模型的区分能力较差;
在0.2-0.3之间时,模型具有一定的区分能力;
在0.3-0.5之间时,模型具有较强的区分能力;
当然KS值也不是越大越好,当KS值大于0.75时,往往代表模型有问题。
我们来看看如何用Python绘制KS曲线,首先查看不同阈值下的假警报率和命中率。
代码如下:
from sklearn.metrics import roc_curve fpr,tpr,thres = roc_curve(Y_test,Y_pred_proba[:,1]) data = pd.DataFrame() data['阈值'] = list(thres) data['假警报率'] = list(fpr) data['命中率'] = list(tpr) data.head(10)
接着就是绘制该模型的KS曲线了。
代码如下:
plt.plot(thres[1:],tpr[1:]) plt.plot(thres[1:],fpr[1:]) plt.plot(thres[1:],tpr[1:]-fpr[1:]) plt.title('KS曲线') plt.xlabel('阈值') plt.legend(['tpr','fpr','tpr-fpr']) plt.gca().invert_xaxis() plt.show()
KS值为0.493,看来这个模型有较强的区分能力,KS值计算代码如下:
max(tpr-fpr)
此时阈值为0.284,代码为:
data['TPR-FPR']=data['命中率'] - data['假警报率'] data[data['TPR-FPR']==max(data['TPR-FPR'])]
03小结
1. 本文详细介绍了ROC曲线和KS曲线的原理和代码实现方法,有兴趣的读者可以自己实现一下。
2. 对搭建好的模型进行评估是十分重要的,没有评估过的模型投入使用是不安全的。
3. 通过对模型的评估可以不断优化模型。
4. 代码和数据集可以加志斌微信领取~