评分卡建模常用逻辑回归模型,将逻辑回归输出的概率值映射成分数,最后得到标准评分卡。关于评分卡映射的逻辑,可以看之前的文章逻辑回归评分卡映射逻辑。
  下面接着分箱之后的数据开始建模。首先将每个变量分箱的结果进行转换,得到每个变量对应的woe结果表。

# 变量woe结果表
def woe_df_concat(bin_df):"""bin_df:list形式,里面存储每个变量的分箱结果return :woe结果表"""woe_df_list =[]for df in bin_df:woe_df = df.reset_index().assign(col=df.index.name).rename(columns={df.index.name:'bin'})woe_df_list.append(woe_df)woe_result = pd.concat(woe_df_list,axis=0)# 为了便于查看,将字段名列移到第一列的位置上woe_result1 = woe_result['col']woe_result2 = woe_result.iloc[:,:-1]woe_result_df = pd.concat([woe_result1,woe_result2],axis=1)woe_result_df = woe_result_df.reset_index(drop=True)return woe_result_df
df_woe_cat=woe_df_concat(bin_df_cat)
df_woe_num=woe_df_concat(bin_df_num)
df_woe=pd.concat([df_woe_cat,df_woe_num],axis=0)

  这一步的目的是将变量分箱之后的结果进行整理汇总,看一下变量分箱之后的大致情况。

  整理之后可以看到每个变量的分箱情况、每一箱的好坏占比、WOE、IV值。注意,最好每一箱的WOE值不要超过1。附上检验WOE值是否大于1的代码。

# 检查某个区间的woe是否大于1
def woe_large(bin_df):"""bin_df:list形式,里面存储每个变量的分箱结果return:woe_large_col: 某个区间woe大于1的变量,list集合woe_judge_df :df形式,每个变量的检验结果"""woe_large_col=[]col_list =[]woe_judge =[]for woe_df in bin_df:col_name = woe_df.index.namewoe_list = list(woe_df.woe)woe_large = list(filter(lambda x:x>=1,woe_list))if len(woe_large)>0:col_list.append(col_name)woe_judge.append('True')woe_large_col.append(col_name)else:col_list.append(col_name)woe_judge.append('False')woe_judge_df = pd.DataFrame({'col':col_list,'judge_large':woe_judge})return woe_large_col,woe_judge_df

  接着就是将变量的值映射为变量的WOE值准备入模。

# woe转换
def woe_transform(df,target,df_woe):"""df:数据集target:目标变量的字段名df_woe:woe结果表return:woe转化之后的数据集"""df2 = df.copy()for col in df2.drop([target],axis=1).columns:x = df2[col]bin_map = df_woe[df_woe.col==col]bin_res = np.array([0]*x.shape[0],dtype=float)for i in bin_map.index:lower = bin_map['min_bin'][i]upper = bin_map['max_bin'][i]if lower == upper:x1 = x[np.where(x == lower)[0]]else:x1 = x[np.where((x>=lower)&(x<=upper))[0]]mask = np.in1d(x,x1)bin_res[mask] = bin_map['woe'][i]bin_res = pd.Series(bin_res,index=x.index)bin_res.name = x.namedf2[col] = bin_resreturn df2

  以上是转化后的数据,所有变量的值都转化成了对应的WOE值,后面就是进行建模。

feature_list=num_features+cat_features
x = df_train[feature_list]
y = df_train['y']lr_model = LogisticRegression(C=0.1)
lr_model.fit(x,y)
df_train['prob'] = lr_model.predict_proba(x)[:,1]

  建模的代码很简单,以上几行就完成逻辑回归建模的过程了。然后进行评分映射。以下代码需要理解评分卡分数映射的逻辑。

# 评分卡刻度
def cal_scale(score,odds,PDO,model):"""odds:设定的坏好比score:在这个odds下的分数PDO: 好坏翻倍比model:逻辑回归模型return :A,B,base_score"""B = PDO/np.log(2)A = score+B*np.log(odds)# base_score = A+B*model.intercept_[0]print('B: {:.2f}'.format(B))print('A: {:.2f}'.format(A))# print('基础分为:{:.2f}'.format(base_score))return A,B
cal_scale(50,0.05,10,lr_model)

  假定在5%的好坏比之下的分值为50分,PDO为10分,计算A和B两个参数。A为14.43,B为6.78。

def Prob2Score(prob, A,B):#将概率转化成分数且为正整数y = np.log(prob/(1-prob))return float(A-B*y)
df_train['score'] = df_train['prob'].map(lambda x:Prob2Score(x,6.78,14.43))

  分数的计算公式即A-B*log(odds)。到此评分卡就建立完成了,后续还需要对模型进行评估、对评分卡的分数进行监控,在之前的文章中已经写过。

  1. 风控模型评估
  2. 评分卡实现和评估

  评分卡系列是我自己从网上找的代码和数据集,一点点实现了一遍,记录一下自己学习的过程。后续会找一份机器学习模型的代码练习。作为初学者,本文理解尚有不到位之处,欢迎大家多多指正。量化成长轨迹,共同交流与成长。

【作者】:Labryant
【原创公众号】:风控猎人
【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。
【转载说明】:转载请说明出处,谢谢合作!~

从0到1建立一张评分卡之模型建立相关推荐

  1. 从0到1建立一张评分卡之数据预处理

    从 0 到 1 建立一张评分卡   之前看了很多评分卡建模方面的课程和文章,对评分卡的建立大致有一些了解.但是由于实际工作中没有接触过,也没有看到过比较舒服的代码,所以对评分卡这块一直有点不踏实.所幸 ...

  2. 从0到1建立一张评分卡之变量分箱

      变量分箱是评分卡建模流程中的关键环节,可以说是评分卡的核心环节.合理的分箱可以消除变量的量纲影响,而且能减少异常值等噪声数据的影响,有效避免模型过拟合.此外,分箱可以给模型实现业务上的可解释性,可 ...

  3. 从0到1建立一张评分卡之可视化分析

      上一篇文章介绍了如何进行数据预处理,接下来介绍如何进行探索性数据分析.探索性数据分析又叫EDA,即Exploratory Data Analysis.其实数据预处理也属于EDA的一部分,EDA的目 ...

  4. 山东大学暑期项目实训-基于信用评分卡算法模型的个人信用评级系统的设计与实现-第一周-1(6月28日)

    实训题目名称 基于信用评分卡算法模型的个人信用评级系统的设计与实现 项目流程 本项目核心信用风险评级模型的主要的研发及设计实现策略及流程如下: (1) 数据获取,包括获取存量客户及潜在客户的数据.存量 ...

  5. (信贷风控十一)随机森林在催收评分卡还款率模型的应用(python代码实现)

    (十一)随机森林在催收评分卡还款率模型的应用(python代码实现) 催收评分卡和申请评分卡和行为评分卡不太一样,一般申请评分卡和行为评分卡使用一个模型就可以了,但是催收评分卡由三个模型构成:(不同的 ...

  6. 山东大学暑期项目实训-基于信用评分卡算法模型的个人信用评级系统的设计与实现-第四周-11(7月21日)

    模型建立后开始计算分数,先找到前面由逻辑回归输出结果里面的逻辑回归系数.然后计算评分卡分值,由查阅资料得知score=offset+factor*log(odds),这里设置基础分值为500,PDO和 ...

  7. 山东大学暑期项目实训-基于信用评分卡算法模型的个人信用评级系统的设计与实现-第四周-10(7月19日)

    得出woe值和IV值后,通过柱状图对数据进行可视化输出.再自定义函数replace_woe,读取训练集,并将得到的woe值进行替换输出到新的文件WoeData里面.去除掉对因变量影响不明显的变量'Se ...

  8. 山东大学暑期项目实训-基于信用评分卡算法模型的个人信用评级系统的设计与实现-第三周-9(7月16日)

    日总结 进行完分箱的工作后,我们开始进行WOE值和IV值的计算以为后面模型转变做好准备,在通过了解和学习相关知识后,我们通过创建函数bin_self,在里面算出好坏样本数,然后再将分箱结果引入,通过公 ...

  9. 山东大学暑期项目实训-基于信用评分卡算法模型的个人信用评级系统的设计与实现-第四周-12(7月23日)

    在得出基础分和各部分得分后,两者相加即可得出个人总评分,自定义compute_score函数来找到每一行数据根据分箱得出的分数段的得分,最想通过各评分相加得出最终评分,并对最终结果进行输出. comp ...

最新文章

  1. 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?
  2. 《Apache Common CLI官方文档
  3. [Swift][OC]tableView去掉顶部空白
  4. 基于Jquery+Ajax+Json+高效分页
  5. [算法学习] 线段树,树状数组,数堆,笛卡尔树
  6. JBoss was unable to start within 50 seconds-JBoss启动超时
  7. hdu 4857 逃生 拓扑排序
  8. 21个强大漂亮Ajax/CSS表格设计
  9. java事件处理的题目_介绍一下java的事件机制
  10. 编译OpenJDK12:Could not find any dlls in /cygdrive/c/progra~2/wi3cf2~1/10/Redist/ucrt/DLLs/x64
  11. 计算机维修5级,什么是计算机硬件的一级维修二级维修三级维修
  12. 【附源码】计算机毕业设计JAVA家庭记账系统
  13. Java 2实用教程(第5版)实验指导与习题解答 第4章-类与对象
  14. 智能家居的应用研究现状
  15. https证书错误或者过期
  16. 澤山咸 (易經大意 韓長庚)
  17. perror和strerror的使用和区别
  18. G - Gluttonous Goop
  19. securecrt8注册码
  20. 如何使用git上传本地代码到码云上(超详细的呦)

热门文章

  1. android 之ListView总结(一个综合实例)
  2. debug疯了_作业没疯,我先疯了 益智解谜《作业疯了》试玩
  3. vue 登录模板_不用自己搭建后台模板,使用这个就够了
  4. 简单的全连接神经网络(tensorflow实现)
  5. pytorch 笔记:torch.distributions 概率分布相关(更新中)
  6. Tableau实战系列Tableau基础概念全解析 (三)-维度和度量
  7. 数据科学家们,请补齐你的短板,如何提升R语言编程能力
  8. MATLAB实战系列(十七)-大学生数学建模赛题解析-水塔中水流量估计(附MATLAB源码)
  9. Linux疑难杂症解决方案100篇(八)-文本处理工具与bash的特性
  10. 非常值得收藏的 IBM SPSS Modeler 算法简介