《三方数据测试之风控字段KS初筛及Python代码实现.docx》由会员分享,可在线阅读,更多相关《三方数据测试之风控字段KS初筛及Python代码实现.docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、三方数据测试之风控字段KS初筛及Python代码实 现大数据时代,有效提炼海量数据中的商业信息,以特定场景的字段输出 作为其商业运作模式,能将沉淀在库里的数据变现。在风控领域,金融公司除了提炼自有的数据用于风控,也会常常接入外 部风控字段用做对现有风控策略架构的补充,从多维度对申请客户的信 用风险和欺诈风险进行识别。外部三方数据公司拥有场景优势,积累有 消费者各个维度的行为数据,能在一定程度上弥补人行征信数据覆盖不 足的劣势。所以,三方数据团队对于三方数据的测试工作是一项持续进行的工程。数据的更新迭代,提炼方法、理论的不断创新,都要求我们的测试工作能够及时响应,并能从成千上万的风控字段中找到符
2、合我们预期的字 段。考虑到工作的持续性及工作效率的提升,在进行策略分析之前可以 设置一道初筛环节,以减轻后续的策略分析工作量。区分度评估指标(KS)在评分卡模型效果评估中,我们通常会采用KS指标来量化模型区分度。 对于贷前申请评分卡(A卡)一般是要求KS=0.3的模型才符合上线的 标准,特殊情况下可以放宽到02KS指标的计算公式是:KS指标反映的是在各分组中,累计好坏占比的差距幅度,如两者的差 距越大,就说明该字段能有效的区分出好坏客户。计算KS值之前,我们需要对目标字段进行变量分箱,分箱的方法可以 是等频、等宽、best_ks分箱、卡方分箱、最优分箱等;完成分箱后, 就能计算出每个箱体的好坏
3、样本量,并得到相应的占比,同时缺失局部 不参与KS计算中;最后按照KS的计算公式,取绝对值最大值作为最 终的KS值。选取区KS作为初筛指标的原因三方数据测试的目的就是寻找有效的风控工具,能有效识别出申请客户 中的坏客户并在审批中将其拒绝。KS指标倾向于量化正负样本分布的 差异,而正负样本之间的是存在一定模糊性和连续性的,恰好KS也是 一条连续的曲线。在一批测试的海量风控字段中,最终能够接入到风控引擎上用作策略的 字段就只有那么几个,所以没有必要将过多的精力耗费在区分度不显著 的字段分析上。那么以KS作为初筛评估指标是一个明智的选择,KS 的阈值可以根据实际情况而定,一般是0.2 ,特殊情况可放
4、宽至0.1.需要特别说明一点,并不是说KS值小于0的字段就不适合做策略, 这种架构设计是基于“优中择优”的理念来的。如果存在足够数量KS 值大于0.1或0.2的字段,就没有必要再在区分度不是特别显著的字段 上纠结了。毕竟引擎上能够容纳的风控字段是有限的,也不可能接入一 家机构的过多字段。综合考虑以上情况,KS初筛是非常折中的方案。当然用其他指标来进行效果评估也是可以的,如IV、GINI等,本篇小 编只说KS指标。风控电子资料免费获取 提取码:那么如何通过Python批量计算目标变量的KS值呢?import pandas as pdimport numpy as npimportosos, ch
5、dir(rC: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_lis
6、t:指定离散变量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
7、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,
8、%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
9、)适用于连续性指标、离散有序型指标、离散无序型指标 (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(datalbad) / sum(datalbad)undef
10、ault_CDF = np.cumsum(datalgood) / sum(datalgood)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(dfflagy,customer_age)#该变量KS值为:0.063 KS值最大时的切割点为:22.00注释:在本代码中,考虑了目标变量为缺失的情况,需要先将缺失剔除后才能计算KSO