KS 学习笔记
2020-01-15
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)
library(tidyverse)
library(rawKS)
data("two_class_example_edited")
ks_table(two_class_example_edited$yhat, two_class_example_edited$y) %>% summarise(ks = max(ks))
5 AUC 计算
library(yardstick)
data("two_class_example_edited")
two_class_example_edited %>%
roc_auc(as.factor(y),yhat)
6 KS 使用的样本数量级
library(tidyverse)
library(magrittr)
set.seed(123)
get_ks <- function(n = 100) {
rawKS::ks_table(runif(n), sample(0:1, n, replace = TRUE)) %>%
summarise(max(ks)) %>%
pull %>%
scales::percent()
}
get_ks(100) # 1000 random samples to get 0.17
## [1] "7.09%"
get_ks(1000)
## [1] "4.46%"
get_ks(10000)
## [1] "0.927%"
get_ks(100000)
## [1] "0.714%"
get_ks(1000000)
## [1] "0.107%"
When samples > 10000, KS < 10% makes some sense. 随机数本身不应该有 KS。 并且也说明样本量很少时,KS 没有意义。
7 KS 和 AUC 的异常情况
12.问:在ks上训练集和测试集相差不大,但在auc上却相差较大,这是为啥? (梅子行 2020) 答:下图是KS的差距,两者差不多,曲面面积可以理解成是AUC的差距,差的就很多了 (梅子行 2020)
KS 是 TPR 和 FPR 差异最大的情况,如下图,是ROC曲线和45度线差异最大的情况,显然 KS 差异不大,但是 AUC 面积在训练集和测试集相差很大。
8 总结
总结下来, KS 的结果,最好要展示
- KS 图片,平滑程度
- Lift 图,单调性
- ks = max(tpr-fpr),是在最优的阈值上算出来的,因此有一些缺陷,再给下 AUC,交叉验证。
附录
8.1 如何提取pROC
包的"acc"
参数选项?
关键是定义好measure
和x.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.