三方数据测试之风控字段KS初筛及Python代码实现.docx
三方数据测试之风控字段KS初筛及Python代码实 现大数据时代,有效提炼海量数据中的商业信息,以特定场景的字段输出 作为其商业运作模式,能将沉淀在库里的数据变现。在风控领域,金融公司除了提炼自有的数据用于风控,也会常常接入外 部风控字段用做对现有风控策略架构的补充,从多维度对申请客户的信 用风险和欺诈风险进行识别。外部三方数据公司拥有场景优势,积累有 消费者各个维度的行为数据,能在一定程度上弥补人行征信数据覆盖不 足的劣势。所以,三方数据团队对于三方数据的测试工作是一项持续进行的工程。数据的更新迭代,提炼方法、理论的不断创新,都要求我们的测试工作能够及时响应,并能从成千上万的风控字段中找到符合我们预期的字 段。考虑到工作的持续性及工作效率的提升,在进行策略分析之前可以 设置一道初筛环节,以减轻后续的策略分析工作量。区分度评估指标(KS)在评分卡模型效果评估中,我们通常会采用KS指标来量化模型区分度。 对于贷前申请评分卡(A卡)一般是要求KS>=0.3的模型才符合上线的 标准,特殊情况下可以放宽到02KS指标的计算公式是:KS指标反映的是在各分组中,累计好坏占比的差距幅度,如两者的差 距越大,就说明该字段能有效的区分出好坏客户。计算KS值之前,我们需要对目标字段进行变量分箱,分箱的方法可以 是等频、等宽、best_ks分箱、卡方分箱、最优分箱等;完成分箱后, 就能计算出每个箱体的好坏样本量,并得到相应的占比,同时缺失局部 不参与KS计算中;最后按照KS的计算公式,取绝对值最大值作为最 终的KS值。选取区KS作为初筛指标的原因三方数据测试的目的就是寻找有效的风控工具,能有效识别出申请客户 中的坏客户并在审批中将其拒绝。KS指标倾向于量化正负样本分布的 差异,而正负样本之间的是存在一定模糊性和连续性的,恰好KS也是 一条连续的曲线。在一批测试的海量风控字段中,最终能够接入到风控引擎上用作策略的 字段就只有那么几个,所以没有必要将过多的精力耗费在区分度不显著 的字段分析上。那么以KS作为初筛评估指标是一个明智的选择,KS 的阈值可以根据实际情况而定,一般是0.2 ,特殊情况可放宽至0.1.需要特别说明一点,并不是说KS值小于0的字段就不适合做策略, 这种架构设计是基于“优中择优”的理念来的。如果存在足够数量KS 值大于0.1或0.2的字段,就没有必要再在区分度不是特别显著的字段 上纠结了。毕竟引擎上能够容纳的风控字段是有限的,也不可能接入一 家机构的过多字段。综合考虑以上情况,KS初筛是非常折中的方案。当然用其他指标来进行效果评估也是可以的,如IV、GINI等,本篇小 编只说KS指标。风控电子资料免费获取 提取码:那么如何通过Python批量计算目标变量的KS值呢?import pandas as pdimport numpy as npimportosos, chdir(r'C:UsersAdministratorDesktop')#-#df=pd read_excel(' sample.xlsx' )# sampLe.xLsx 数据获取见文尾df .head()#def group_by_df (dataflag_name, factor_name,bad_name, goodame discrete_list=):''按连续变量和离散变量分别进行分组Explanation 计算KS,以及KS对应的指标取值flag_name:好坏标签名;factor_name:待计算KS值的目标变量bad_name:坏客户名good_name:好客户名 discrete_list:指定离散变量1 , 1if len(data)=0:return pd.DataFrame()regroupl = data.groupby(factor_name)flag_name.count()regroup2 = data.groupby(factor_name)flag_name.sum()datal = pd.DataFname(good_name: regroupl-regroupZ bad_name: regroup2).reset_index()datal'%Bad_Rate' = datalbad_name/(datalbad_name+datalgood_name)if factor_name not in discreteJAst:#连续型变量datalfactor_name = datalfactor_name.astype(float)datal = datal.sort_values(by=factor_namerue)#按连续变量值升序排 列datal 'Char_Type'、=' vwwertc' 井数值型数据else:#处理离散datal = datal.sort_values(by= '%Bad_Rate' , ascending=True)#离废呸缘按 bad_rate 升序排歹U, bad_encodingdicts=datalfactor_name,'%Bad_Rate'.to_dict()dict_re=dict(zip(dietsfactor_name.values().,dicts,%Bad_Rate'.values()datal 'ChaType' = ' coc-cu林eric,#非数值型数据datal = datal.reset_index(drop=True)return dataldef KS(dataJflag_nameJfactor_name):Explanation 计算KS,以及KS对应的指标取值 data: FrameData数据 flag_name:好坏标签; factor_name:待计算KS值的目标变量Remark (1)适用于连续性指标、离散有序型指标、离散无序型指标 (2)如果指标中存在缺失值,剔除缺失值计算II II IIdatal = dataflag_nameJ factor_nameif len(datal)=0:return None,Nonedatal=dataldatalfactor_name .notnull() #datal=group_by_df (datalflagamefactoname., 1 bad ' J good ')if len(datal)=0:return ONonedefault_CDF = np.cumsum(datal'bad') / sum(datal'bad')undefault_CDF = np.cumsum(datal'good') / sum(datal'good')ks_CDF=abs(default_CDF - undefault_CDF)ks = max(ks_CDF)if np.isnan(ks):return None,Noneindex=list(filter(lambda x: ks_CDF. locx=ks.> ks_CDF.index) 0value=datalfactor_nameindexprint ('该变量 KS 值为:%s'%format(ks,1.2,)JKS 值最大时的切割点为:%.2f'%value)#井调用上面定义的函数,即可计算K5值KS(df'flagy','customer_age')#该变量KS值为:0.063 KS值最大时的切割点为:22.00注释:在本代码中,考虑了目标变量为缺失的情况,需要先将缺失剔除后才能计算KSO