knitr::opts_chunk$set(echo = TRUE,eval=FALSE)
- 1
1. KS值
1.1 概念
KS值越大,表示模型能够将正、负客户区分开的程度越大。
通常来讲,KS>0.2即表示模型有较好的预测准确性。
柯尔莫哥洛夫-斯米尔诺夫检验(Колмогоров-Смирнов检验)基于累计分布函数,用以检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同。
绘制方式与ROC曲线略有相同,都要计算TPR和FPR。但是TPR和FPR都要做纵轴,横轴为把样本分成多少份。
步骤:
1. 按照分类模型返回的概率降序排列
2. 把0-1之间等分N份,等分点为阈值,计算TPR、FPR
3. 对TPR、FPR描点画图即可
KS值即为Max(TPR-FPR)
1.2 代码
提供R
代码一份,仅供参考。
# 获取数据 --------------------------------------------------------------------
#以ROCR包里自带数据为例
# 获取数据 --------------------------------------------------------------------
#以ROCR包里自带数据为例
library(ROCR)
data(ROCR.simple)
result <- data.frame(pre_prob=ROCR.simple$predictions,true_label=ROCR.simple$labels)
#概率大于0.5为正类,小于0.5负类
result <- within(result,{
pre_label <- NULL
pre_label[pre_prob>0.5] <- 1
pre_label[pre_prob<=0.5] <- 0
})
head(result)
#install.packages("gmodels")
library(gmodels)
CrossTable(x=result$true_label,y=result$pre_label,prop.chisq=FALSE)
#画PRC曲线:横轴TPR纵轴Precision.Threshold
TPR <- NULL
FPR <- NULL
for(i in seq(from=1,to=0,by=-0.1)){
#判为正类实际也为正类
TP <- sum((result$pre_prob >= i) * (result$true_label == 1))
#判为正类实际为负类
FP <- sum((result$pre_prob >= i) * (result$true_label == 0))
#判为负类实际为负类
TN <- sum((result$pre_prob < i) * (result$true_label == 0))
#判为负类实际为正类
FN <- sum((result$pre_prob < i) * (result$true_label == 1))
TPR <- c(TPR,TP/(TP+FN))
FPR <- c(FPR,FP/(FP+TN))
}
library(ggplot2)
ggplot(data=NULL,mapping = aes(x=seq(0,1,0.1),y=TPR))+
geom_point()+
geom_smooth(se=FALSE,formula = y ~ splines::ns(x,10), method ='lm')+
geom_line(mapping = aes(x=seq(0,1,0.1),y=FPR),linetype=6)
max(TPR-FPR)#KS值为0.69
knitr::include_graphics("../Picture/Pic09-KS.png",dpi = 600)
- 1
PS:并没有觉得这个KS值有什么用啊~
2. Lift值
以一个例子计算:
对于某二分类模型,针对1000
名顾客打分。如果实际数据中有90名顾客产生购买行为。那么,Random Rate=9%
。按照概率降序排序,取前10%
。如果其中60
个人产生购买行为,那么排名前10%
的用户其实际购买率的Lift=(60/100)/9%=6.67
。
3. 捕获率及响应率
- 按照概率降序排序,0-1等分,等分点为阈值
- 响应率为各个等分区间内的属于正1的占该区间或者累计区间总体观察数量的百分比
- 捕获率为各个等分区间内的属于正1的占该区间或者累计区间总体观察属于正1数量的百分比
转载自:https://blog.csdn.net/wendaomudong_l2d4/article/details/72872206