当前位置: 首页 > 工具软件 > k0s > 使用案例 >

模型评估:K-S值和AUC的区别

伏子辰
2023-12-01

进大厂,身价翻倍的法宝来了!

主讲内容:docker/kubernetes 云原生技术,大数据架构,分布式微服务,自动化测试、运维。

腾讯课堂:点击进入
网易课堂:点击进入

7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!

课程简介:

第一章 熟悉Linux环境
1、Win10安装Ubuntu18.04双系统
2、熟悉Linux常用工具和命令
第二章 熟悉Docker
3、安装配置Docker
4、Docker命令实践
5、Dockerfile文件编写
​​​​​​​ 6、常用镜像部署
​​​​​​​ 第三章 熟悉Kubernetes
​​​​​​​ 7、kubernetes架构和部署
​​​​​​​ 8、熟悉kubectl命令使用
​​​​​​​ 9、k8s应用部署实践(上)
​​​​​​​ 10、k8s应用部署实践(下)
​​​​​​​ 第四章 熟悉Helm
​​​​​​​ 11、Helm安装配置
​​​​​​​ 12、熟悉Helm应用书写规则
​​​​​​​ 13、编写自己的Helm应用

(原创作者:陈玓玏)

在模型建立之后,必须对模型的效果进行评估,因为数据挖掘是一个探索的过程,评估-优化是一个永恒的过程。在分类模型评估中,最常用的两种评估标准就是K-S值和AUC值

可能有人会问了,为什么不直接看正确率呢?你可以这么想,如果一批样本中,正样本占到90%,负样本只占10%,那么我即使模型什么也不做,把样本全部判定为正,也能有90%的正确率咯?所以,用AUC值够保证你在样本不均衡的情况下也能准确评估模型的好坏,而K-S值不仅能告诉你准确与否,还能告诉你模型对好坏客户是否有足够的区分度。

下面分别看两种评估指标的概念。

一、ROC曲线和AUC值

在逻辑回归、随机森林、GBDT、XGBoost这些模型中,模型训练完成之后,每个样本都会获得对应的两个概率值,一个是样本为正样本的概率,一个是样本为负样本的概率。把每个样本为正样本的概率取出来,进行排序,然后选定一个阈值,将大于这个阈值的样本判定为正样本,小于阈值的样本判定为负样本,然后可以得到两个值,一个是真正率,一个是假正率

真正率即判定为正样本且实际为正样本的样本数/所有的正样本数,假正率为判定为正样本实际为负样本的样本数/所有的负样本数。每选定一个阈值,就能得到一对真正率和假正率,由于判定为正样本的概率值区间为[0,1],那么阈值必然在这个区间内选择,因此在此区间内不停地选择不同的阈值,重复这个过程,就能得到一系列的真正率和假正率,以这两个序列作为横纵坐标,即可得到ROC曲线了。而ROC曲线下方的面积,即为AUC值

对于AUC值,也许有一个更直观的理解,那就是,在按照正样本概率值对所有样本排序后,任意选取一对正负样本,正样本排在负样本之前的概率值,即为AUC值。也就是说,当所有的正样本在排序后都能排在负样本之前时,就证明所有的样本都被正确分类了,此时的AUC值也会为1。那么AUC值也就很好算了,如果有N个负样本,其中正样本有M个,那么可取的所有带正样本的样本对数对于排在第一位的正样本来说,有M+N-1个,但其中包含M-1对(正,正)的样本,而对于后面所有的正样本而言,能够取到的正样本概率大于负样本对数肯定小于其位置-1。

二、K-S曲线

K-S曲线其实数据来源和本质和ROC曲线是一致的,只是ROC曲线是把真正率和假正率当作横纵轴,而K-S曲线是把真正率和假正率都当作是纵轴,横轴则由选定的阈值来充当。

下面这一段解释得更详细的K-S和AUC的区别是参考的这篇博客:

https://blog.csdn.net/sinat_30316741/article/details/80018932

由于ks值能找出模型中差异最大的一个分段,因此适合用于cut_off,像评分卡这种就很适合用ks值来评估。但是ks值只能反映出哪个分段是区分最大的,而不能总体反映出所有分段的效果,因果AUC值更能胜任。
ROC值一般在0.5-1.0之间。值越大表示模型判断准确性越高,即越接近1越好。ROC=0.5表示模型的预测能力与随机结果没有差别。
KS值表示了模型将+和-区分开来的能力。值越大,模型的预测准确性越好。一般,KS>0.2即可认为模型有比较好的预测准确性。

好了,引用结束。
K-S值一般是很难达到0.6的,在0.2~0.6之间都不错。一般如果是如果负样本对业务影响极大,那么区分度肯定就很重要,此时K-S比AUC更合适用作模型评估,如果没什么特别的影响,那么用AUC就很好了。

三、KS的计算和曲线绘制

代码如果要用,最好自己改改,因为这个数据格式是我自己用的,计算方式也是跟数据格式有关系的,工作中用的可能不一样,所以最好是自己根据自己的写一个,这个也只是我根据自己的数据格式来写的,重要的是思路,不是代码本身。而且我画的曲线是折线,最好是自己考虑写一个平滑曲线的。

import matplotlib.pyplot as plt
#第一个参数是模型的预测值,第二个参数是模型的真实值
def draw_ks_curve(predict_result,true_result):
    tpr_list = []  #存放真正率数据
    fpr_list = []  #存放假正率数据
    dif_list = []  #存放真假正率差值
    max_ks_dot = []
    
    for i in np.arange(0,1.1,0.1):
        tpr = 0
        fpr = 0
        for j in range(len(predict_result)):
            if list(predict_result[j])[0]>i and true_result[j]==1:
               tpr = tpr+1
               tpr_list.append(tpr)
            if list(predict_result[j])[0]>i and true_result[j]==0:
               fpr = fpr+1
               fpr_list.append(fpr)
        tpr = tpr/sum(true_result)
        fpr = fpr/(len(true_result)-sum(true_result))
    fig = plt.figure(num=1, figsize=(15, 8),dpi=80)     #开启一个窗口,同时设置大小,分辨率
    plt.plot(np.arange(0,1,0.1),tpr_list)
    plt.plot(np.arange(0,1,0.1),fpr_list)
 类似资料: