前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文完全理解模型ks指标含义并画出ks曲线(包含代码和详细解释)「建议收藏」

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

作者头像
全栈程序员站长
发布于 2022-07-22 03:08:57
发布于 2022-07-22 03:08:57
7.9K01
代码可运行
举报
运行总次数:1
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

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含义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 结果,如下图,代码和结果结合起来看更容易理解:

讲解之前先说一下函数中各个参数的含义。

df 是pandas的DataFrame表,表中必须包含两列:预测值真实值。 预测值即模型预测的结果,一般为范围在0~1之间的概率值; 真实值是实际的好坏用户的label,一般为0或1,代表着好用户或者坏用户。 本文中使用的df前几列如下图。

y_true是真实值在df表中的列名,此处为“label”; y_pre是预测值在df表中的列名,此处为“score”; num是需要分组的数量,具体含义后面会说; goodbad是真实值中0和1代表的含义,如果好用户用0表示,那么good=0bad=1,反之亦然。

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

  1. 先将df按照score列从小到大进行排序。排序完成后,如果num=10,则将所有的样本划分为10个区间,新增rank列,此列对每个区间从上到下使用1~10个数字标记。为了方便之后求和统计,新增set_1列,此列所有值均为1;
  2. score列进行统计,group_sum为每个区间的个数,相应的maxminmean为区间的最大值、最小值和平均值;
  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_cumbad_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曲线绘制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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曲线图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
result_ks = ks(df, 'label', 'score')
ks_curve(result_ks)

roc_curve函数实现

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

最后,讲另外一种画法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

X轴的含义

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

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125470.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月5,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
模型评价指标—KS
对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、KS曲线、ROC曲线、AUC面积等。也可以自己定义函数,把模型结果分割成n(100)份,计算top1的准确率、覆盖率。
阿黎逸阳
2020/09/08
8.3K0
风控ML[4] | 风控建模的KS
我们这做风控模型的时候,经常是会用KS值来衡量模型的效果,这个指标也是很多领导会直接关注的指标。今天写一篇文章来全面地剖析一下这个指标,了解当中的原理以及实现,因为这些知识是必备的基本功。我将会从下面几个方面来展开讲解一下KS:
Sam Gor
2022/02/25
4.9K0
风控ML[4] | 风控建模的KS
标准化SMOTE采样框架实现与应用
SMOTE(Synthetic Minority Oversampling Technique)是一种常用于缓解数据不均衡的算法。但是很多小伙伴表示在实际应用中有强烈的过拟合倾向。大多是因为使用流程不规范导致的。本文详细的介绍了一个梅老师自己写的SMOTE过采样流程,并通过一个案例,帮助大家理解其使用。
BBBlue
2019/09/25
1.4K0
标准化SMOTE采样框架实现与应用
新人赛《金融风控贷款违约》避坑指南!
本文以天池的金融风控赛为背景,梳理了金融风控的整个实践流程,帮助大家避坑学习。赛事的场景是个人信贷,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这个问题在现实的风控场景中很常见,属于典型的分类问题。另外,准入模型,评分卡模型皆是属于这个范畴。
Datawhale
2020/10/23
3K0
新人赛《金融风控贷款违约》避坑指南!
【干货】手把手教你搭建评分卡模型
【前方高能】本篇文章是从零开始构造评分卡模型,各个环节都比较详细,故内容比较长,可能会占用你较长的时间,谢谢谅解。
1480
2019/06/19
10.4K0
【干货】手把手教你搭建评分卡模型
数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)xgboots/lightgbm/Catboost等模型--模型融合:stacking、blend
赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题。通过这道赛题来引导大家了解金融风控中的一些业务背景,解决实际问题,帮助竞赛新人进行自我练习、自我提高。
汀丶人工智能
2023/05/17
5.3K0
数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)xgboots/lightgbm/Catboost等模型--模型融合:stacking、blend
评分卡模型(一)评分卡建模实战
由于评分卡是基于LR模型训练的,虽然在特征处理过程较为严格,但本身模型准确性较低。因此可以考虑通过其他准确率高的模型进行训练,例如XGBoost。只需将odd的计算换为(1-p)/p即可,这里的p为模型输出的概率值。
HsuHeinrich
2023/05/25
3.3K0
评分卡模型(一)评分卡建模实战
使用逻辑回归模型预测用户购买会员意向
会员付费模式是互联网中常用的变现方式,并具有高用户忠诚度和粘性,帮助电商应用增加收入的优点。会员的销售模式,依赖于线下会销+线上直播+代理商电话销售的模式。为使用户有良好的用户体验,以及满足精细化运营的需求,如何在海量用户中筛选出有价值的用户成为会员转化运营工作的重点。 因此,本文采用了逻辑回归的算法,使用用户在平台上的行为数据特征(登录、协议、商品、交易等),通过模型预测出用户购买会员的概率,对于预测结果有较大概率购买会员的用户,进行重点触达,提高交易转化。
政采云前端团队
2023/10/16
1.1K0
使用逻辑回归模型预测用户购买会员意向
python︱大规模数据存储与读取、并行计算:Dask库简述
本文介绍了利用Dask和Kaleido库进行大数据处理和分析的应用案例,包括处理40TB数据集、进行特征工程、建立机器学习模型和评估模型性能。同时,本文还介绍了如何使用Dask进行分布式计算和并行计算,以及使用Kaleido进行特征选择和降维。
悟乙己
2018/01/02
6.4K0
python︱大规模数据存储与读取、并行计算:Dask库简述
【机器学习】--模型评估指标之混淆矩阵,ROC曲线和AUC面积
实际上非常简单,精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),也就是
LhWorld哥陪你聊算法
2018/09/13
2.1K0
【机器学习】--模型评估指标之混淆矩阵,ROC曲线和AUC面积
机器学习-ROC曲线:技术解析与实战应用
机器学习和数据科学在解决复杂问题时,经常需要评估模型的性能。其中,ROC(Receiver Operating Characteristic)曲线是一种非常有用的工具,被广泛应用于分类问题中。该工具不仅在医学检测、信号处理中有着悠久的历史,而且在近年来的机器学习应用中也显得尤为关键。
TechLead
2023/10/21
1.2K0
机器学习-ROC曲线:技术解析与实战应用
基于随机森林的化合物活性二分类模型
基于随机森林算法的化合物二分类机器学习模型 ---- 代码示例 #导入依赖包 import pandas as pd import numpy as np from rdkit import Chem, DataStructs from rdkit.Chem import AllChem from rdkit.ML.Descriptors import MoleculeDescriptors from rdkit.Chem import Descriptors from rdkit.Chem.EState
DrugAI
2021/01/28
1.3K0
一文概览NLP算法(Python)
NLP是人工智能领域历史较为悠久的领域,但由于语言的复杂性(语言表达多样性/歧义/模糊等等),如今的发展及收效相对缓慢。比尔·盖茨曾说过,"NLP是 AI 皇冠上的明珠。" 在光鲜绚丽的同时,却可望而不可及(...)。
算法进阶
2022/06/02
2.3K0
一文概览NLP算法(Python)
python对随机森林分类结果绘制roc曲线
【注意!!!!! 以下代码用到的roc_curve函数(只能用于二分类),如果多分类会报错,不适用于多分类!!!!!】
全栈程序员站长
2022/08/29
1.5K0
python对随机森林分类结果绘制roc曲线
模型评价指标—ROC曲线
对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、F1值、KS曲线、ROC曲线、AUC面积等。
阿黎逸阳
2023/08/21
2.9K0
模型评价指标—ROC曲线
【机器学习】几种常用的机器学习调参方法
在机器学习中,模型的性能往往受到模型的超参数、数据的质量、特征选择等因素影响。其中,模型的超参数调整是模型优化中最重要的环节之一。超参数(Hyperparameters)在机器学习算法中需要人为设定,它们不能直接从训练数据中学习得出。与之对应的是模型参数(Model Parameters),它们是模型内部学习得来的参数。 以支持向量机(SVM)为例,其中C、kernel 和 gamma 就是超参数,而通过数据学习到的权重 w 和偏置 b则 是模型参数。实际应用中,我们往往需要选择合适的超参数才能得到一个好的模型。搜索超参数的方法有很多种,如网格搜索、随机搜索、对半网格搜索、贝叶斯优化、遗传算法、模拟退火等方法,具体内容如下。
Twcat_tree
2023/11/03
1.2K0
【机器学习】几种常用的机器学习调参方法
算法金 | 一文彻底理解机器学习 ROC-AUC 指标
在机器学习和数据科学的江湖中,评估模型的好坏是非常关键的一环。而 ROC(Receiver Operating Characteristic)曲线和 AUC(Area Under Curve)正是评估分类模型性能的重要工具。
算法金
2024/06/11
1.5K0
算法金 | 一文彻底理解机器学习 ROC-AUC 指标
评分卡模型(二)基于评分卡模型的用户付费预测
只需要定义好什么是好人,什么是坏人,就可以按照标准流程构建评分卡了,是不是很方便~
HsuHeinrich
2023/05/25
1.3K0
评分卡模型(二)基于评分卡模型的用户付费预测
数学建模~~~预测方法--决策树模型
第一维度:介绍基本的概念,以及这个决策树的分类和相关的这个算法和基尼系数的计算方法,通过给定这个用户的数据预测这个用户是否会离职;
阑梦清川
2025/02/24
960
数学建模~~~预测方法--决策树模型
推荐阅读
相关推荐
模型评价指标—KS
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验