一文完全理解模型ks指标含义并画出ks曲线(包含代码和详细解释)

ks(洛伦兹曲线)指标理解 KS(Kolmogorov-Smirnov)值越大,表示模型能够将正、负客户区分开的程度越大。KS值的取值范围是[0,1] 通常来讲,KS>0.2即表示模型有较好的预测准确性。 ks求解方法: ks需要TPR和FPR两个值:真正类率(true positive rate ,TPR), 计算公式为TPR=TP/ (TP+FN),刻画的是分类器所识别出的 正实例占所有正实例的比例... 阅读详情
AI摘要

本文详细介绍了KS指标的计算过程、ks曲线的绘制以及使用sklearn的roc_curve函数。KS指标用于评估模型风险区分能力,值越大表明模型区分好坏样本的能力越强。文中提供两种计算方法,包括手动实现和使用库函数,并通过实例解释了每个步骤和参数含义。

KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估, 指标衡量的是好坏样本累计分部之间的差值。
好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。

k s = m a x ( C u m . B i B a d t o t a l − C u m . G i G o o d t o t a l ) ks = max(\frac{Cum. B_i}{Bad_{total}} - \frac{Cum.G_i}{Good_{total}}) ks=max(Badtotal​Cum.Bi​​−Goodtotal​Cum.Gi​​)

上面是ks的简单介绍,相信大家看了这几句话和一个公式,肯定还是不懂ks到底是个什么。我也是研究了一下,终于搞清楚了ks的具体计算方式。搞清楚了计算方式后,ks的含义自然就清楚了。
下面我会详细讲解实现方法,相信如果你看完本文章,肯定可以理解ks。以下内容均为个人纯手打,难免有些疏漏,如有错误,请大家指出。

本文会介绍两种计算ks的方法:
第一种是我自己手动写代码实现的,可以帮助你理解ks含义;
第二种是sklearn模块里面的roc_curve函数计算,通过第一种方法理解了ks后,实际应用中使用第二种方法,更方便。

ks的计算流程

话不多说,先看代码,后面会解释代码,顺便解释清楚ks含义。

import numpy as np
import pandas as pd


def ks(df, y_true, y_pre, num=10, good=0, bad=1):
    # 1.将数据从小到大平均分成num组
    df_ks = df.sort_values(y_pre).reset_index(drop=True)
    df_ks['rank'] = np.floor((df_ks.index / len(df_ks) * num) + 1)
    df_ks['set_1'] = 1
    # 2.统计结果
    result_ks = pd.DataFrame()
    result_ks['group_sum'] = df_ks.groupby('rank')['set_1'].sum()
    result_ks['group_min'] = df_ks.groupby('rank')[y_pre].min()
    result_ks['group_max'] = df_ks.groupby('rank')[y_pre].max()
    result_ks['group_mean'] = df_ks.groupby('rank')[y_pre].mean()
    # 3.最后一行添加total汇总数据
    result_ks.loc['total', 'group_sum'] = df_ks['set_1'].sum()
    result_ks.loc['total', 'group_min'] = df_ks[y_pre].min()
    result_ks.loc['total', 'group_max'] = df_ks[y_pre].max()
    result_ks.loc['total', 'group_mean'] = df_ks[y_pre].mean()
    # 4.好用户统计
    result_ks['good_sum'] = df_ks[df_ks[y_true] == good].groupby('rank')['set_1'].sum()
    result_ks.good_sum.replace(np.nan, 0, inplace=True)
    result_ks.loc['total', 'good_sum'] = result_ks['good_sum'].sum()
    result_ks['good_percent'] = result_ks['good_sum'] / result_ks.loc['total', 'good_sum']
    result_ks['good_percent_cum'] = result_ks['good_sum'].cumsum() / result_ks.loc['total', 'good_sum']
    # 5.坏用户统计
    result_ks['bad_sum'] = df_ks[df_ks[y_true] == bad].groupby('rank')['set_1'].sum()
    result_ks.bad_sum.replace(np.nan, 0, inplace=True)
    result_ks.loc['total', 'bad_sum'] = result_ks['bad_sum'].sum()
    result_ks['bad_percent'] = result_ks['bad_sum'] / result_ks.loc['total', 'bad_sum']
    result_ks['bad_percent_cum'] = result_ks['bad_sum'].cumsum() / result_ks.loc['total', 'bad_sum']
    # 6.计算ks值
    result_ks['diff'] = result_ks['bad_percent_cum'] - result_ks['good_percent_cum']
    # 7.更新最后一行total的数据
    result_ks.loc['total', 'bad_percent_cum'] = np.nan
    result_ks.loc['total', 'good_percent_cum'] = np.nan
    result_ks.loc['total', 'diff'] = result_ks['diff'].max()
    
    result_ks = result_ks.reset_index()
    
    return result_ks

接下来看一下生成的 result_ks 结果,如下图,代码和结果结合起来看更容易理解:
result_ks
讲解之前先说一下函数中各个参数的含义。

df 是pandas的DataFrame表,表中必须包含两列:预测值和真实值。
预测值即模型预测的结果,一般为范围在0~1之间的概率值;
真实值是实际的好坏用户的label,一般为0或1,代表着好用户或者坏用户。
本文中使用的df前几列如下图。
df
y_true是真实值在df表中的列名,此处为“label”;
y_pre是预测值在df表中的列名,此处为“score”;
num是需要分组的数量,具体含义后面会说;
good和bad是真实值中0和1代表的含义,如果好用户用0表示,那么good=0、bad=1,反之亦然。

下面按照代码中的注释分步讲解。

  1. 先将df按照score列从小到大进行排序。排序完成后,如果num=10,则将所有的样本划分为10个区间,新增rank列,此列对每个区间从上到下使用1~10个数字标记。为了方便之后求和统计,新增set_1列,此列所有值均为1;
  2. 对score列进行统计,group_sum为每个区间的个数,相应的max、min、mean为区间的最大值、最小值和平均值;
  3. 在最后新增一行total,进行整列数据的统计;
  4. 好用户统计,good_sum列中计算了每个区间的好用户数量,good_percent列中则是每个区间的好用户数占全部好用户数的比例。最重要的是计算good_percent_cum,计算各行的累加值占好用户数量的比例,不理解的话建议搜索cumsum好好看看。其实这里计算的good_percent_cum就是就是在不同阈值下的TPR,true positive rate;
  5. 坏用户统计,与好用户计算方法一致,bad_percent_cum计算的是不同阈值下的FPR,false positive rate;
  6. diff列中保存bad_percent_cum - good_percent_cum的结果, 两列的差值的最大值即为ks;
  7. 最后更新一下total中的内容。

以上就是ks的全部计算步骤,其实结果生成那么多列,大部分都是帮助理解数据结构,真正用于计算的也就是good_percent_cum、bad_percent_cum这两列,ks其实也是max(df['good_percent_cum'] - df['bad_percent_cum'])。ks越大,表示计算预测值的模型区分好坏用户的能力越强。

ks值含义
> 0.3模型预测性较好
0,2~0.3模型可用
0~0.2模型预测能力较差
< 0模型错误

ks曲线绘制

import matlibplot.pyplot as plt
import seaborn as sns
sns.set()

def ks_curve(df, num=10):
    # 防止中文乱码
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus']=False
	
	ks_value = df['diff'].max()
    # 获取绘制曲线所需要的数据
    x_curve = range(num + 1)
    y_curve1 = [0] + list(df['bad_percent_cum'].values[:-1])
    y_curve2 = [0] + list(df['good_percent_cum'].values[:-1])
    y_curve3 = [0] + list(df['diff'].values[:-1])
    # 获取绘制ks点所需要的数据
    df_ks_max = df[df['diff'] == ks_value]
    x_point = [df_ks_max['rank'].values[0], df_ks_max['rank'].values[0]]
    y_point = [df_ks_max['bad_percent_cum'].values[0], df_ks_max['good_percent_cum'].values[0]]
    # 绘制曲线
    plt.plot(x_curve, y_curve1, label='bad', linewidth=2)
    plt.plot(x_curve, y_curve2, label='good', linewidth=2)
    plt.plot(x_curve, y_curve3, label='diff', linewidth=2)
    # 标记ks
    plt.plot(x_point, y_point, label='ks - {:.2f}'.format(ks_value), color='r', marker='o', markerfacecolor='r', markersize=5)
    plt.scatter(x_point, y_point, color='r')
    plt.legend()
    plt.show()
    
    return ks_value

运行下面代码,得到ks曲线图

result_ks = ks(df, 'label', 'score')
ks_curve(result_ks)

ks curve

roc_curve函数实现

上面说了计算ks其实只用得到关键的两列,而这两列可以通过sklearn.metrics中函数roc_curve直接获取。
下面代码中,ks_value即为ks值。

from sklearn.metrics import roc_curve

fpr, tpr, thresholds= roc_curve(df.label, df.score)
ks_value = max(abs(fpr-tpr))

# 画图,画出曲线
plt.plot(fpr, label='bad')
plt.plot(tpr, label='good')
plt.plot(abs(fpr-tpr), label='diff')
# 标记ks
x = np.argwhere(abs(fpr-tpr) == ks_value)[0, 0]
plt.plot((x, x), (0, ks_value), label='ks - {:.2f}'.format(ks_value), color='r', marker='o', markerfacecolor='r', markersize=5)
plt.scatter((x, x), (0, ks_value), color='r')
plt.legend()
plt.show()

ks curve
最后,讲另外一种画法。

ks_value = max(abs(fpr-tpr))
# 画图,画出曲线
plt.plot(fpr, tpr)
plt.plot([0,1], [0,1], linestyle='--')
# 标记ks
x = np.argwhere(abs(fpr-tpr) == ks_value)[0, 0]
plt.plot([fpr[x], fpr[x]], [fpr[x], tpr[x]], linewidth=4, color='r')
# plt.scatter((x, x), (0, ks_value), color='r')
plt.xlabel('False positive', fontsize=20)
plt.ylabel('True positive', fontsize=20)
plt.show()

ks_curve2

X轴的含义

看两张ks图,X轴的含义其实是区间序号,第一张图划分了10个区间,所以X轴是0~10。
第二个sklearn会根据你的数据大小进行划分区间,这里我使用的数据量比较大,划分了600个区间计算的,所以X轴范围是0~600。

本文引用:
神秘的KS值和GINI系数

快手ksjsb普通版cookies提取每日低保 右手就行的快手普通版cookies提取 参考: https://blog.youkuaiyun.com/qq_44633541/article/details/123513724 都能看懂的快手极速版cookies提取 CK里的api_st跟快手极速版的通用,但是需要额外一个did(设备号),同一台设备捉包的话可以把did复制一遍粘贴到每个账号的api_st后面,建议用不同设备捉包! 青龙把任意包里的kuaishou.api_st=xxxxxxxxxxxx;和did=yyyyyyyyyyy;这两段连在一起放到变量ksC 阅读详情

相关推荐

AUC、KS评价指标、洛伦兹曲线、Gini系数、Lift曲线和Gain曲线

文章目录1.AUC1.1.混淆矩阵1.2.ROC曲线2.KS评价指标3.洛伦兹曲线4.Gini系数5.Lift曲线和Gain曲线6.总结 关于AUC、KS评价指标、洛伦兹曲线、Gini系数、Lift曲线和Gain曲线。在别人的博客里看到下面的一个小故事: 故事是这样的: ​ 首先,混淆矩阵是个元老,年龄最大也资历最老。创建了两个帮派,一个夫妻帮,一个阶级帮。 ​ 之后,夫妻帮里面是夫妻两个,...

some_apples的博客 7956

ks 曲线_模型算法基础——KS曲线

原创: 栗老师 金科应用研院关于判断逻辑回归模型的分别能力,我们前面已经介绍了基尼系数和ROC曲线,今天我们来介绍一下KS曲线。KS曲线主要体现了模型对违约对象的区分能力,通常是在模型预测全体样本的评分后,将全体样本按好客户(未逾期)和坏客户(逾期)分为两部分,然后用KS统计量来检验这两组样本评分的分布是否有显著差异。KS曲线的横坐标是将所有样本的评分结果从小到大排序后等分为10组,纵坐标是好客户...

weixin_27037521的博客 1076

[机器学习]模型评估指标:ROC/AUC,KS,GINI,Lift/Gain, PSI 总结

目录 背景介绍 一 ROC曲线和AUC值 二 KS曲线 三 GINI系数 四 Lift , Gain 五 模型稳定度指标PSI 背景介绍 在模型建立之后,必须对模型的效果进行评估,因为数据挖掘是一个探索的过程,评估-优化是一个永恒的过程。在分类模型评估中,最常用的两种评估标准就是KS值和GINI, AUC值.可能有人会问了,为什么不直接看正确率呢?你可以这么想,如果一批样本中,正样本占到90%,负样本只占10%,那么我即使模型什么也不做,把样本全部判定为正,也能有90%的正确率咯?所以,用AUC值够保证你在

qq_41111337的博客 1万+

KS曲线

KS曲线是两条线,其横轴是“阈值”(区间序号,按概率排序的等份),纵轴是TPR(上面那条)与FPR(下面那条)的值,值范围[0,1] 。两条曲线之间之间相距最远的地方对应的阈值,就是最能划分模型的阈值。 通常来讲,KS>0.2即表示模型有较好的预测准确性。 求解方法等于:KS=max(TPR-FPR)。 在上图中就是红色竖直线。ks等于(260,0.46)。 ...

lisenpy的博客 1890

4.4.2分类模型评判指标(四) - ROC,AUC,GINI,KS,Lift,Gain,MSE总结

简介 分类模型的评判指标光是图就有好多,ROC,AUC,GINI,KS,Lift,Gain,MSE,这些有些是图有些是指标,放在一起乱七八糟搞得人分不清东南西北。所以这里我先整体给大家一个直观的介绍。省的以后再遇上这么多图的时候完全分不清是谁是谁。 三句话概括版本: Confusion Matrix -&gt; Lift,Gain,ROC。 ROC -&gt; AUC,KS -&gt; G...

Orange_Spotty_Cat的博客 1万+

python计算ks值 代码_风控领域常用评估指标:ROC/AUC、KS、Gain、Lift等

混淆矩阵KS曲线与ROC曲线KS曲线KS检验:比较频率分布\(f(x)\)与理论分布\(g(x)\)或两个观测值分布的是否一致检验方法,原假设两个数据分布一致或数据符合理论分布,统计量\(D=max|f(x)-g(x)|\)KS值计算步骤:对变量进行分箱binning,可以选择等频、等距或自定义距离;计算每个分箱区间的好账户数Goods与坏账户数Bads;计算每个分箱区间: (累计好账户数/总好账...

weixin_42500477的博客 4651

4.4.2分类模型评判指标(三) - KS曲线与KS值

简介 KS曲线是用来衡量分类型模型准确度的工具。KS曲线与ROC曲线非常的类似。其指标的计算方法与混淆矩阵、ROC基本一致。它只是用另一种方式呈现分类模型的准确性。KS值是KS图中两条线之间最大的距离,其能反映出分类器的划分能力。 一句话概括版本: KS曲线是两条线,其横轴是阈值,纵轴是TPR与FPR。两条曲线之间之间相距最远的地方对应的阈值,就是最能划分模型的阈值。 KS值是MAX(TP...

Orange_Spotty_Cat的博客 3万+

机器篇——决策树(五) 细说 评估指标的相关曲线(ROC、KS、PR)

返回主目录 返回决策树目录 上一章:机器篇——决策树(四) 下一章:机器篇——决策树(六) 本小节,细说评估指标的相关曲线(ROC、KS、PR),下一小节开始细说 评估指标的交叉验证。 三. 评估指标 1. 混淆矩阵 混淆矩阵(confusion matrix) 也称为误差矩阵,是表示精度评价的一种标准格式,用行列的矩阵形式来表示。可以理解为就是...

天下所弃,不过其纪。世间事,在人,在志。 6729

分类模型的评价指标--混淆矩阵,ROC,AUC,KS,Lift,Gain

对于分类模型,常用的指标有混淆矩阵、ROC曲线,AUC值,KS曲线以及KS值、Lift图,Gain图等,查阅了很多的资料,加入自己的理解整理了一下他们的计算方法和意义,希望对大家有帮助。1. 混淆矩阵---确定截断点后,评价学习器性能假设训练之初以及预测后,一个样本是正例还是反例是已经确定的,这个时候,样本应该有两个类别值,一个是真实的0/1,一个是预测的0/1 ...

shy19890510的博客 4万+

【模型指标】ks,gini值,auc的关系

做风控也很久了,一直没有整理ks,gini,auc的关系,下边简单谈一下自己的理解,立下flag,以后每两天更新一篇,谈谈自己对指数的理解。 先说一下ks ks值和ks曲线: 将所有样本根据分数值从低到高排序(即坏账率从高到低)均分成10组,分别计算这10组的实际好样本数、坏样本数、累积好样本数、累积坏样本数、累积好样本数占比、累积坏样本数占比,差值。其中实际好坏样本数分别为该组内的好坏样本数,累...

changzoe的博客 1760

模型评价指标—KS

模型效果评价——KS

阿黎逸阳的博客 9465

模型评估方法:ROC曲线与KS曲线

本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》 对于二分类模型来说,主流的评估方法有ROC曲线和KS曲线两种。 一、ROC曲线 如果把假警报率理解为代价的话,那么命中率就是收益,所以也可以说在阈值相同的情况下,希望假警报率(代价)尽可能小,命中率(收益)尽可能高,该思想反映在图形上就是ROC曲线尽可能地陡峭。曲线越靠近左上角,说明在相同的阈值条件下,命中率越高,假警报率越低,模型越完善。 #混淆矩阵的Python代码实现 from sklearn.metrics import c.

m0_46388544的博客 5135

利用Python计算KS的实例详解

主要介绍了利用Python计算KS的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

python 画ks曲线_风控模型—区分度评估指标(KS)深入理解应用

风控业务背景在风控中,我们常用KS指标来评估模型的区分度(discrimination)。这也是风控模型同学最为追求的指标之一。那么,有多少人真正理解KS背后的内涵?本文将从区分度的概念、KS的计算方法、业务指导意义、几何解释、数学思想等多个维度展开分析,以期对KS指标有更为深入的理解认知。目录Part 1. 直观理解区分度的概念Part 2. KS统计量的定义Part 3. KS的计算过程及业务...

weixin_39568083的博客 1337

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 466

别再为OpenBCI_GUI安装发愁了!保姆级教程带你从Processing配置到成功运行(附常见错误解决)

本文提供了一份详细的OpenBCI_GUI安装教程,涵盖从Processing配置到成功运行的全过程,特别针对常见错误提供了解决方案。通过环境搭建、软件依赖安装、源码处理及首次运行实战,帮助用户高效完成数据可视化工具的部署与使用。

weixin_28366475的博客 267

ks 曲线_模型评价指标—KS

对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、KS曲线、ROC曲线、AUC面积等。也可以自己定义函数,把模型结果分割成n(100)份,计算top1的准确率、覆盖率。之前阐述了混淆矩阵,本文阐述KS的原理和Python实现实例,其它指标会在后续文章中详尽阐述,敬请期待。本文目录详细介绍KS1.1 什么是KS1.2 理解KS的一个小例子用Python如何计算KS值...

weixin_34778803的博客 1226

LMX2820即时校准实战:从失锁到稳定锁频的完整指南

本文详细解析了LMX2820锁相芯片在高频段(11.3-22.6GHz)易出现随机失锁问题的根源,并提供了即时校准(InstCal)的完整实战指南。通过寄存器编程、Index例程和校准配置的关键步骤,确保从失锁到稳定锁频的高可靠性,大幅提升射频合成器在通信与测试测量应用中的性能。

bert9linguist的博客 958

ks 曲线_一文读懂评分卡的IV、KS、AUC、GINI指标

前言:当一张评分卡构建完成时,筛选出一组特征生成了分数,我们会想要知道这个分数是否靠谱,即是否可以依赖这个分数将好坏客户区分开来,这个时候就需要评判评分卡有效性的指标。测量评分卡好坏区分能力的指标有许多,本文就为大家介绍几个常用的定量指标: 散度(分数为连续函数)与信息比率(IV);KS值在这篇文章当中,花了极大的笔墨从数学的角度证明了KS值的存在性和函数性质问题:KS分布为什么F(s|B)为凹函...

weixin_30982943的博客 3767

基于DPABI和SPM12的任务态fMRI分析笔记1——预处理

前言 原理简介 预处理

Sophia2023的博客 1万+

ks 曲线_分类模型的评价指标的图像记忆及auc与ks的关系分析

最近在复习机器学习相关的知识,发现分类模型的评价指标--混淆矩阵,ROC,AUC的记忆比较复杂,主要是TP(实际为正预测为正),FP(实际为负但预测为正),TN(实际为负预测为负),FN(实际为正但预测为负),以及roc矩阵的坐标计算,纵轴:TPR=正例分对的概率 = TP/(TP+FN),横轴:FPR=负例分错的概率 = FP/(FP+TN),采取死记硬背的方式总是记不了几天,因此...

weixin_35869861的博客 1999

数字IC后端笔记-libcell命名规则与标准单元库介绍

ND3D1BWP13T40P140HVTND3D1BWP13T40P140HVTTSMC两种工艺,Metalization Stack的截面示意图:还有一层AP用来走RDL,RDL这层是最厚的一层,一般用于连接IO的bump,信号线基本上不会用这层绕线。

sinat_41774721的博客 2464

KS和AUC解释

1.遇到KS=0.32,AUC=0.54问题:KS值只能反映出哪个分段是区分度最大的,不能反映出所有分段的效果。 2.输出预测值在[0.002,0.04]之间,KS阈值切分问题和KS横坐标表示含义。 其中最常用的是TPR和FPR。最理想的模型,当然是TPR尽量高而FPR尽量低啦,然而任何模型在提高正确预测概率的同时,也会难以避免地增加误判率。听起来有点抽象,好在有ROC曲线非常形象地表达了二者之间的关系。 对于一个二分类模型,输出的最初结果是连续的;假设已经确定一个阀值,那么最初结果大于阀值时,则输出最终结

sinat_37333675的博客 3945

黑猫带你学eMMC协议第2篇:eMMC部分相关名词释义

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 本文背景 本文关键词不包括emmc jedec5.1协议第3章节:《Terms and definitions》内容。关于emmc协议层的关键词,直接查阅spec相关章节即可,清晰明了,此处没必要再列出。 本文为本人工作学习中常听到或常用到关乎于emmc/flash的一些关键词合集,没有固定分类,不需要强行记忆,供查询使用。 1.

黑猫奥利奥的博客 7432

Jetson nano 系列之2—板载摄像头IMX219启动

我选用的是亚博科技jetson nano的开发板。

驽马十驾,功在不舍;锲而不舍,金石可镂。 4274
上一篇: ubuntu 18.04 安装NVIDIA驱动 cuda/cudnn + tensorflow-gpu + pytorch
下一篇: 【facenet项目】人脸识别相关数据下载(包括 CASIA/LFW/训练模型)
scxyz_
博客等级 码龄10年 304粉丝 61原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值