项目总结-信用评分卡

本文基于Python软件进行评分卡的制作及使用预测。主要包括确定观察时间窗口、确定表现时间窗口、评分卡的制作、新数据的预测四大部分。内容涉及数据清洗、变量筛选、生成WOE 矩阵、IV值计算、ROC曲线、模型建立、模型评估预测等。

  • 数据来源

  本项目数据来源于kaggle竞赛Give Me Some Credit

  • 流程如下

 1.确定观察时间窗口

使用用户逾期详情表data/CreditSampleWindow.csv:
- CID:用户ID
- STAGE_BEF:本阶段前的逾期阶段
- STAGE_AFT:本阶段进入的逾期阶段
- 其中逾期阶段含义为: M0:逾期0-3天; M1:逾期3-30天; M2:逾期30-60天; M3:逾期60-90天;以此类推
- START_DATE:进入本阶段时间
- CLOSE_DATE:本阶段结束时间
本数据取的是订单审批日从2015年1月1日到2017年10月31日的所有订单号,即这些订单对应的逾期详情,最后的截止日期为2018年5月31日

1.1导包

 

1.2读取数据及描述统计

 根据描述结果可以看出最后一列即本阶段结束时间最小值为0,且包含缺失值,故需要先处理缺失值再处理异常值0

 1.3数据清洗

1.3.1去重

  drop_duplicates是数据框去重的函数,可以根据指定的若干列(subset=)去重

1.3.2缺失值的处理

 后4列缺失值比例相同约为0.08,若缺失值在同一行,则考虑删除。所以验证各列缺失值是否在同一行。

  在同一行,删除

1.3.3异常值的处理

 

 replace:替换数据框中的指定值,输入字典,键是被替换值,值是替换值

1.3.4生成衍生变量

从数据中的进入本阶段时间和本阶段结束时间(4,5列)抽取对应的月份信息 •从本阶段进入的逾期阶段(3列)中抽取逾期指标

 

 1.4构建矩阵

这里的矩阵表示:

  •相继时间内逾期状态的变化情况,相继时间表示从一个月到下一个月

  •每一行表示开始月份时的逾期状态,每一列表示结束月份时的逾期状态

  •开始月份和结束月份是相继的,即间隔一个月

1.4.1逻辑关系

1.每一行数据对应一个本阶段的逾期状态,对应两个月份时间:进入本阶段时间和本阶段结束时间

  • 可以将这两个时间都理解为逾期状态对应的时间,即逾期时间
  • 生成逾期状态数据框,每行对应三列:id,逾期状态,逾期时间(包含进入本阶段时间和本阶段结束时间)

2.将逾期状态数据框内转置,生成时间数据框:行是id,列是逾期时间

  • 转置前事先对数据排序,去重,保留同ID,同时间下逾期状态的最大值

3.使用时间数据框:由于列是已经排序的两列,取前后相继的两列,即相继的两个月,统计逾期状态变化的频数,得到所有相继两列状态变化的频数

  • 根据统计的频数,构建矩阵,行表示相继时间中开始时间对应的逾期状态,列表示结束时间对应的逾期状态

4使用得到的矩阵,生成新列:

  • 每个状态所有可能的变化,即行和
  • 每个状态所有不好的变化,即表示状态的数字变大
  • 每个状态不好的变化的占比,即不好的变化除以所有可能的变化

 1.4.2生成预期状态数据框

 1.4.3生成时间数据框

排序和去重:

  • sort_values:依据值排序,缺失值默认在末尾.依据指定列进行排序,设置by=一列或多列(列表)列名即可
  • drop_duplicates:根据若干列去重, 设置subset指定列,keep表示要保留的数据,可选"first","last",False(表示去掉所有重复的行)

  • set_index:给出若干列,将列作为行索引(每行可以有多个索引)
  • unstack:level=-1, fill_value=None, 第一个参数表示以哪列索引作为列, 默认最后一列, 相当于以选定的索引列作为列名, 其他作为行名

 

 

 1.4.4生成矩阵

 

 最终矩阵

 

 绘图观察

  • 可见M1是一个明显的最低点和拐点,到M2阶段以后坏客户的比例迅速增加,因此这里选定的观察时间窗口为M2,即30-60天,我们就可以定义逾期大于30天的客户为坏客户
  • 可以根据业务需求进一步调整观察时间窗口

 2.确定表现时间窗口

使用用户订单时间表data/CreditFirstUse.csv:

  • CID:用户ID
  • FST_USE_DT:用户订单时间

2.1数据读取及描述

  • 可见没有缺失值,没有重复订单号
  • 用户订单时间从2015年1月1日到2017年10月31日,初步判断没有异常值

 

 2.2数据清洗

 

使用前面生成的时间数据框:

  • 由于选取观察时间窗口为M2,对于每个ID:
    • 取逾期状态大于等于2的首个月作为逾期月
    • 逾期月表示客户开始转向坏客户
  • 使用逾期月生成新列

 

 

统计月份差异的频数,并且排序

  • 发现有的时间差是负的,把排序后前面负的时间差去掉

 

 

 

 2.3定义y的总结

  • 通过之前的数据筛选和汇总,我们定义观察时间窗口为M2(30-60天),表现时间窗口为20
  • 即对于所有客户来说,我们认为在订单生成20个月内
    • 有M2以上的逾期,即逾期天数>=31天,为坏客户
    • 有M1以下的逾期,即逾期天数<=3天,为好客户
    • 中间状态的样本认为是不确定的不进入模型

 3 . 评分卡制作

该数据是信贷数据,来自kaggle2011年的竞赛数据:Give Me Some Credit,评判指标是AUC

  • SeriousDlqin2yrs:出现90天或更长时间的逾期行为(即定义好坏客户)
  • RevolvingUtilizationOfUnsecuredLines:贷款以及信用卡可用额度与总额度比例
  • age:借款人借款年龄
  • NumberOfTime30-59DaysPastDueNotWorse:过去两年内出现35-59天逾期但是没有发展的更坏的次数
  • DebtRatio:每月偿还债务,赡养费,生活费用除以月总收入
  • MonthlyIncome:月收入
  • NumberOfOpenCreditLinesAndLoans:开放式贷款和信贷数量
  • NumberOfTimes90DaysLate:借款者有90天或更高逾期的次数
  • NumberRealEstateLoansOrLines:抵押贷款和房地产贷款数量,包括房屋净值信贷额度
  • NumberOfTime60-89DaysPastDueNotWorse:过去两年内出现60-89天逾期但是没有发展的更坏的次数
  • NumberOfDependents:家庭中不包括自身的家属人数(配偶,子女等)

3.1  读取数据以及描述统计

 

 修改列名:由于一些算法中,列名中的某些符号会带来问题甚至报错,例如这里的"-",会在回归公式中被认为是减号,所以换成"_"

 3.1.1去重

  3.2缺失值处理

缺失值处理方法的选择,主要依据是业务逻辑和缺失值占比,在对预测结果的影响尽可能小的情况下,对缺失值进行处理以满足算法需求,所以要理解每个缺失值处理方法带来的影响,下面的缺失值处理方法没有特殊说明均是对特征(列)的处理:

  1. 占比较多:如80%以上:删除缺失值所在的列
    • 如果某些行缺失值占比较多,或者缺失值所在字段是苛刻的必须有值的,删除行
  2. 占比一般:如30%-80%:将缺失值作为单独的一个分类
    • 如果特征是连续的,则其他已有值分箱
    • 如果特征是分类的,考虑其他分类是否需要重分箱
  3. 占比少:10%-30%:多重插补:认为若干特征之间有相关性,则可以相互预测缺失值
  4. 占比较少:10%以下:单一值替换,如中位数,众数
  5. 在决策树中可以将缺失值处理融合到算法里:按比重分配

这里的占比并不是固定的,例如缺失值占比只有5%,仍可以用第二种方法,主要依据业务逻辑和算法需求

3.2.1查看缺失值分布情况

本数据的缺失值处理逻辑:

  • 对于信用评分卡来说,由于所有变量都需要分箱,故这里缺失值作为单独的箱子即可
  • 对于最后一列NumberOfDependents,缺失值占比只有2.56%,作为单独的箱子信息不够,故做单一值填补,这列表示家庭人口数,有右偏的倾向,且属于计数的数据,故使用中位数填补
  • 这里没必要进行多重插补,下面的多重插补只是为了让读者熟悉此操作

3.2.2多重差补

 

3.2.3单一值替换

 3.3异常值处理

异常值常见的处理方法:

  1. 删除所在的行
  2. 替换成缺失值,与缺失值一起处理
  3. 盖帽法处理

结合业务逻辑和算法需求判断是否需要处理异常值以及如何处理,一般情况下盖帽法即可,即将极端异常的值改成不那么异常的极值,当然一些算法例如决策树中连续变量的异常值也可以不做处理

 3.3.1定义盖帽法函数

   互换y值(0,1互换)

 3.4汇总清洗过程,生成函数

 3.5  对每个x生成分箱对象

 

  • 1.定义y的名字
  • 2.初始化IV值对象

 3.5.1 对“RevolvingUtilizationOfUnsecuredLines”分箱

 

   保存IV值

  对每个变量都进行上边的步骤分箱

3.6查看所有IV值

  IV(information Value):信息值,表示变量的重要性.

  IV<0.02对预测几乎没用,应该删除;0.02≤IV<0.1,有一定的帮助;0.1 ≤ IV < 0.3,对预测较重要;IV ≥ 0.3,对预测十分重要。

 

 3.7  生成WOE数据

  WOE(Weight of Evidence):证据权重,与违约比例同方向变动,可以看到不同分箱的重要性

  之前smbin和smbin_cu得到的对象根据IV值筛选后,放在一个列表中

 3.7.1使用smgen函数根据得到的列表生成新数据

3.7.2要求

  • 抽取WOE列作为预测数据X
  • 加常数项列
  • 抽取响应列作为Y

 3.8建模

建立逻辑回归模型,拟合数据,查看回归结果

 

 可以看出NumberOfOpenCreditLinesAndLoans_woe不显著,应该从模型中剔除

 

 从3.7部分重新运行,模型回归结果如下:

 3.8.1查看多重共线性

  根据VIF值判断,大于10则存在多重共线性,显然不存在。

 3.9生成评分卡

  • 根据逻辑回归模型和之前筛选得到的列表,给定参数,生成评分卡
  • 调整参数,使得评分卡分数范围满足需求

 

          ...

 3.10模型评估

  根据之前的分卡对象得到测试集分数

 

 

  ROC曲线

   由上图可知AUC值0.86,说明该模型的拟合效果较好

4.新数据的预测

4.1读取数据

 4.2清洗数据

 4.3生成WOE矩阵

   抽取WOE数据生成预测用数据 •要加常数项列

 

4.4预测

4.4.1预测每一行数据是好客户的概率

4.4.2预测每行数据的分数,生成总分数和每个特征的分数

4.5标签

  根据分数和训练得到的阈值判断客户的好坏,好客户是1,坏客户是0

 完结。

原文地址:https://www.cnblogs.com/lvzw/p/11613218.html