KS(Kolmogorov-Smirnov)是用于评估模型风险区分能力的重要指标。它通过衡量好坏样本累计分布之间的最大差异来判断模型的预测性能,差异越大,模型的风险区分能力越强。
KS(Kolmogorov-Smirnov)是一个在数据分析和统计学领域广泛使用的指标,用于评估模型对好、坏样本的区分能力,以下是关于KS的详细解释:
一、定义与计算方法
1、定义:KS指标用于衡量两个概率分布之间的差异程度,特别是在金融风险评估和信用评分模型中,它被用来评估模型对好、坏客户的判别区分能力。
2、计算方法:KS值的计算通常涉及以下几个步骤:
- 将数据按照预测值进行排序并分组。
- 计算每个组中的好样本和坏样本的累计比例。
- 计算每个组中好样本和坏样本累计比例的差值。
- 取这些差值中的最大值作为KS值。
二、意义与应用
1、意义:KS值越大,表示模型对好坏样本的区分能力越强,当KS值接近1时,表示模型几乎可以完美地区分好坏样本;而当KS值接近0时,则表示模型对好坏样本的区分能力较弱。
2、应用:KS指标广泛应用于金融风险评估、信用评分模型等领域,帮助金融机构和信贷机构评估客户的信用风险,制定合理的信贷政策。
三、示例代码与解释
以下是使用Python手动计算KS指标的示例代码及其解释:
import pandas as pd import numpy as np 示例数据 data = {'score': [0.1, 0.4, 0.35, 0.8, 0.6, 0.7, 0.2, 0.9], 'label': [0, 1, 0, 1, 0, 1, 0, 1]} df = pd.DataFrame(data) 参数设置 y_true = 'label' y_pre = 'score' num = 10 good = 0 bad = 1 计算KS指标 def ks(df, y_true, y_pre, num=10, good=0, bad=1): df = df.sort_values(by=y_pre).reset_index(drop=True) df['rank'] = np.floor((df.index / len(df) * num) + 1) df['set_1'] = 1 result_ks = pd.DataFrame() result_ks['group_sum'] = df.groupby('rank')['set_1'].sum() result_ks['group_min'] = df.groupby('rank')[y_pre].min() result_ks['group_max'] = df.groupby('rank')[y_pre].max() result_ks['group_mean'] = df.groupby('rank')[y_pre].mean() result_ks.loc['total', 'group_sum'] = df['set_1'].sum() result_ks.loc['total', 'group_min'] = df[y_pre].min() result_ks.loc['total', 'group_max'] = df[y_pre].max() result_ks.loc['total', 'group_mean'] = df[y_pre].mean() result_ks['good_sum'] = df[df[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'] result_ks['bad_sum'] = df[df[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'] result_ks['diff'] = result_ks['bad_percent_cum'] - result_ks['good_percent_cum'] 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() return result_ks.reset_index() 调用函数计算KS值 result_ks = ks(df, y_true, y_pre, num, good, bad) print(result_ks)
这段代码首先创建了一个包含预测得分和实际标签的示例数据集,然后定义了一个计算KS指标的函数ks
,该函数接受多个参数,包括数据集、真实标签列名、预测值列名、分组数量以及好样本和坏样本的标签值,函数内部首先对数据集按照预测值进行排序并分组,然后计算每个组中的好样本和坏样本的累计比例,最后取这些差值中的最大值作为KS值,函数返回一个包含KS值及其他相关信息的DataFrame对象,通过调用这个函数并打印结果,我们可以直观地看到模型对好坏样本的区分能力。
四、FAQs
1、Q: KS值是否可以用于比较不同模型的性能?
A: 是的,KS值可以用于比较不同模型对好坏样本的区分能力,KS值越大的模型性能越好,但需要注意的是,KS值并不是唯一的评估指标,还需要结合其他指标如AUC等一起使用才能更全面地评估模型性能。
2、Q: 如何选择合适的分组数量(num)来计算KS值?
A: 分组数量的选择会影响KS值的计算结果,分组数量越多,KS值的计算越精确,但计算成本也越高,在选择分组数量时需要权衡精度和计算成本之间的关系,通常可以选择一个适中的分组数量,如10或20等。