在风控模型的构建和评估中,KS值至关重要且被领导高度关注,但很多人只知其然而不知其所以然。今天就来深度挖掘KS值。
KS的基本概念
KS值的全称为“Kolmogorov - Smirnov”。它源于苏联数学家的检验方法,虽不知为何用于风控模型区分度评估,但这并不妨碍我们掌握它。在风控中,KS主要评估模型好坏样本区分度。区分度简单讲就是模型预测结果分桶后,各桶好坏样本占比有顺序,可通过拒绝坏人多的桶防控风险。从业务角度看,箱序靠后的客户质量差,rate呈单调性,便于区分坏人,利于风控策略。
KS值反映模型将好坏样本分开的能力强弱,这能直观展示模型在区分样本方面的有效性。例如在信贷风控中,如果KS值低,可能造成无法准确区分有还款能力和无还款能力的人。
KS的生成逻辑
KS的生成逻辑公式相当简洁,KS = max{|好样本累计占比 - 坏样本累计占比|}。在风控领域计算KS时,一般按“正态分布原则”分箱,通常分为10份然后计算。像将数据可视化后能得出KS曲线图,若看到表格或曲线图中KS为0.43,就表示这一数据下的KS值情况。
实际操作时,分箱这个步骤很关键。比如说在分析企业信贷风险的数据源上进行分箱,如果分箱不合理,得出的KS值就无法准确反映模型的区分情况,会影响后续对于风控模型的判断。
KS的效果应用
KS值域处于0 - 1之间。一般情况是KS值越大区分度越高,但在风控领域并非越大越好。比如KS值过高可能预示模型过度拟合,虽然能很好区分训练数据,在新的数据应用时就可能不准确。不同的KS值与风控模型可用性有关联。当KS在0 - 0.2时,模型基本无鉴别能力;0.2 - 0.3可以视为区分能力弱;0.3 - 0.5通常是有一定区分能力的正常范围;KS大于0.5就要谨慎对待,防止过度拟合风险等。
在消费金融公司做风控时,遇到KS值为0.28的情况,就得考虑这个模型对于风险的区分是否足够,如果业务要求高区分度,这一模型就存在改进空间,要是业务风险容忍度高,那么该模型也许还能使用。
KS的实现
首先以Python代码实现示例中的操作并且可视化数据,能看到和Excel中画出差不多的效果。多数时候不先分桶而是直接计算KS,有两种主要计算方式,采用javascript语言。在代码实现时,数据输入的准确性会影响KS计算结果。如果测量信用风险的数据存在错误或缺失,计算出来的KS值就不靠谱。而且不同的数据类型也要采用合适的处理方式来进行KS计算。
当开发风险评估系统时,如果要嵌入KS值的计算,就要选择合适的计算方式和代码逻辑,以确保得出的KS值能准确反映模型的性能。
KS值的局限性
光看KS值来评判模型效果是不够的。就像评判一个人不能只看外表,评估模型要综合AUC、准确率、稳定性、覆盖率等多方面。比如AUC能全面评估模型区分能力,准确率体现了预测准确程度。一个模型KS值不错,但如果准确率低,在风控实际操作中可能会频繁误判。稳定性关乎在不同数据环境下模型的表现是否波动大,覆盖率反映数据涵盖范围。
在银行的信用卡风控部门,若只依据KS值选择模型,可能会导致忽略其他重要指标而选错模型,从而在风险控制上出现漏洞。
import pandas as pd
import numpy as np
# test data
bin_df = pd.DataFrame([['bin0', 100, 10],
['bin1', 100, 20],
['bin2', 100, 30],
['bin3', 100, 34],
['bin4', 100, 40],
['bin5', 100, 50],
['bin6', 100, 58],
['bin7', 100, 70],
['bin8', 100, 75],
['bin9', 100, 95]]
,columns=['bins', 'bin_nums', 'bad_nums'])
bin_df['good_nums'] = bin_df.bin_nums - bin_df.bad_nums
bin_df['bad_rate'] = bin_df.bad_nums/bin_df.bin_nums
bin_df['good_rate'] = 1 - bin_df.bad_rate
bin_df['bad_cum'] = bin_df.bad_nums.cumsum()
bin_df['good_cum'] = bin_df.good_nums.cumsum()
bin_df['bad_cum_rate'] = bin_df.bad_cum/bin_df.bad_nums.sum()
bin_df['good_cum_rate'] = bin_df.good_cum/bin_df.good_nums.sum()
bin_df['cum_rate_dif'] = abs(bin_df.bad_cum_rate - bin_df.good_cum_rate)
bin_df
不该忽视的综合评估
在风控模型中,不能将KS值作为唯一衡量标准。要把它与其他指标结合起来考量。例如在互联网金融贷款风险评估中,要同时分析KS值、AUC以及模型的泛化能力等。虽然KS值能反映样本区分度,但没有一个指标能单独决定模型是否真的适用于业务风控场景。
综合考量各个指标后,才能构建出更加稳健有效的风控模型。
from matplotlib import pyplot
import matplotlib.pyplot as plt
print("KS:", bin_df.cum_rate_dif.max())
plt.plot(bin_df.bins, bin_df.bad_cum_rate, marker='o', mec='r', mfc='w', label='bad_cum_rate')
plt.plot(bin_df.bins, bin_df.good_cum_rate, marker='*', mec='r', mfc='w', label='good_cum_rate')
plt.plot(bin_df.bins, bin_df.cum_rate_dif, marker='x', mec='r', mfc='w', label='good_cum_rate')
plt.legend()