1. 使用 RMarkdown 的 child 参数,进行文档拼接。
  2. 这样拼接以后的笔记方便复习。
  3. 相关问题提交到 Issue
  4. KS的计算,R 可以参考 rawKS,Python 可以参考 pyks

1 KS值介绍

Pred Actual=1 Actual=0
0 1
Pred=1 TP FP
Pred=0 FN TF

\[\begin{alignat}{2} \text{Acc} = \frac{TP+TN}{TP+FN+TN+FP} \sim \frac{TP}{TP+FN}+\frac{TN}{TN+FP} &= \frac{TP}{TP+FN}-\frac{FP}{TN+FP}+1\\ \mathrm{KS} &= \max{(\frac{TP}{TP+FN}-\frac{FP}{TN+FP})} = \max{(\mathrm{tpr} - \mathrm{fpr})}\\ \mathrm{KS} &\sim \max{(\text{Acc})} \\ \end{alignat}\]

那么我们认为选择KS点,就是选择 max acc,其实就是选择模型准确率最高的情况,进行和其他模型的比较而已,没啥特别的。

2 KS值和ROC曲线的联系

由上可知,KS的状态就是ROC曲线跟45度线的切点。

\[\begin{alignat}{2} \mathrm{KS} &= \max{(\mathrm{tpr} - \mathrm{fpr})} \\ \frac{d\mathrm{KS}}{d\mathrm{cutoff}} &= \frac{d\mathrm{tpr}}{d\mathrm{cutoff}} - \frac{d\mathrm{fpr}}{d\mathrm{cutoff}} = 0 \\ \frac{d\mathrm{tpr}}{d\mathrm{cutoff}} &= \frac{d\mathrm{fpr}}{d\mathrm{cutoff}} \\ \frac{d\mathrm{tpr}}{d\mathrm{fpr}} & = 1 \\ \max{\mathrm{ROC}} &= \frac{\pi}{4} \end{alignat}\]

3 ROC值是最远点的性质

\[\begin{alignat}{2} L&=\max{[(x-1)^2+(y-0)^2]} \\ &=\max{[(\mathrm{fpr}-1)^2+(\mathrm{tpr}-0)^2]} \\ &=\max{[(\frac{TN}{TN+FP})^2+(\frac{TP}{TP+FN})^2]} \\ &\sim \max{(\text{Acc})} \end{alignat}\]

4 R code 函数

参考 李家翔 (2020)

5 AUC 计算

7 KS 和 AUC 的异常情况

12.问:在ks上训练集和测试集相差不大,但在auc上却相差较大,这是为啥? (梅子行 2020) 答:下图是KS的差距,两者差不多,曲面面积可以理解成是AUC的差距,差的就很多了 (梅子行 2020)

KS 是 TPR 和 FPR 差异最大的情况,如下图,是ROC曲线和45度线差异最大的情况,显然 KS 差异不大,但是 AUC 面积在训练集和测试集相差很大。

AUC_KS_diff

AUC_KS_diff

8 总结

总结下来, KS 的结果,最好要展示

  1. KS 图片,平滑程度
  2. Lift 图,单调性
  3. ks = max(tpr-fpr),是在最优的阈值上算出来的,因此有一些缺陷,再给下 AUC,交叉验证。

附录

8.1 如何提取pROC包的"acc"参数选项?

关键是定义好measurex.measure。例如,

plot(performance(ROCRpred, measure = 'tpr', x.measure = 'fpr')) 正确写法, 第一个是\(y\),第二个是\(x\)。 这样方便记忆,后面是measure.x = "fpr"

library(pROC)
n <- 100
a1 <- pROC::prediction(rnorm(n),rbinom(n,1,0.5))
# rnorm(100) 看起来像预测值
a2 <- performance(a1,measure = "acc")
data_frame(
  acc = attr(a2,"y.values")[[1]],
  cut = attr(a2,"x.values")[[1]]
) %>% 
  ggplot(aes(x = cut, y = acc)) + 
  geom_line()

所以准确率也可以提取了。

就是要注意attr(a2,"x.values")[[1]]这种写法。

pROC::prediction报错, Error: 'prediction' is not an exported object from 'namespace:pROC'。 不知道为什么。

参考文献

李家翔. 2020. “R语言Logistic回归建模后如何计算KS值?.” 知乎. 2020. https://www.zhihu.com/question/31818886/answer/501606399.

梅子行. 2020. “偷偷潜入了风控大佬的技术交流群,曝光最硬核的聊天记录.” 大数据风控与机器学习. 2020. https://mp.weixin.qq.com/s/F7jbT2hNvOolBd4yIh-GVA.