催收评分卡实战

  催收评分卡分为滚动率模型、还款率模型和失联模型,市面上介绍C卡的模型较少,本人将收集到的贷后催收评分卡的视频教程整理列举如下:

小象学院金融信贷评分卡中的机器学习模型第七课

https://www.bilibili.com/video/BV1pJ411y7yA?p=7

番茄风控大数据催收评分卡(推荐)
https://www.bilibili.com/video/BV1ZE411V7Mk/

观察期和表现期

  本次催收评分卡是M1滚动率模型,即预测当前处于M1状态的用户在本周期内回收(出催)的概率。

  贷后催收评分卡需要不断积累建模样本,所以前期通常会制定一些贷后缓催策略,后期积累了一定样本之后再用评分卡来实现更精细化的切分。关于催收评分卡的观察期和表现期,大致有以下3种做法(假定观察期为6个月,表现期为2个月):

催收评分卡实战

第一种:锁定观察期   观察期为放款之后的前6个月,表现期为第7、8个月,也就是将mob账龄锁定。这种方法的观察点为第六期期末的时间,会因为放款月的不同在不断移动,但是观察期+观察点为账龄的前6期。 一般C卡要包含完整的年度数据,即观察点至少需要包含3月、6月、9月、12月四个时间节点,因此这种情况下至少要有18个月的样本数据。

第二种:锁定表现期   表现期锁定为某两个月,比如2020年3月和4月。建模样本则为截止2020年3月账龄大于6期的所有样本。放款月越早,观察点所处的mob就越大。观察期可以取最近6期,也可以取2020年3月之前的所有账期。

第三种:观察期和表现期都在移动   这种方法就是将每一个订单6期之后的数据按账单日拆分成多条,比如一个用户的还款表现为"FFFFFF1212",那么入模的样本就会有"FFFFFF12"和"FFFFFF1212"两条。前面一条的观察期为前6期,表现期为第7、8期;后一条观察期为前8期,表现期为第9、10期,以此类推。这种方法可以扩充建模样本数量,但是X变量的衍生会比较复杂。

本文将采用第三种方法进行评分卡制作,第三种方法的难点在于X变量的衍生。

数据集划分

  数据集划分为训练集、测试集、跨时间验证集(5:3:2)。训练集进行模型训练,如果需要进行调参的话还需要对训练集进行切分,划分成训练集和验证集。测试集用于查看模型的泛化能力。跨时间验证集则是监控随着时间变化对模型的预测效果产生的影响。 这里注意一点,分箱的过程应该是基于训练集进行,然后将跨时间验证集的数据根据分箱结果进行映射。之前为了省事直接在数据集上进行分箱,然后再根据放款月份取训练集和跨时间验证集,这样会造成模型过拟合。

变量选取

  贷后催收评分卡常用到的变量有催收行为数据、逾期行为数据、历史还款数据、客户档案数据以及第三方数据。

催收行为数据:

催收评分卡实战

历史还款数据:

催收评分卡实战

客户档案数据:

催收评分卡实战

第三方数据:

催收评分卡实战

  以上是番茄风控老骑士的催收评分卡课程中用到的变量,仅供参考。

  以下是结合公司实际数据情况,用到的评分卡变量,主要用到mob表和还款计划表,基于这两张表进行变量的衍生。

催收评分卡实战

  特征衍生是催收评分卡制作过程中的重中之重了,一般会衍生很多时间切片变量,反映借款人最近一段时间内的还款能力和意愿。相对于前两种观察期和表现期的取法,一种是固定账龄mob,一种是固定表现月,这两种方法取时间切片变量的时候都相对比较容易。如果是观察期和表现期都不固定的这种,特征衍生的过程会复杂一点。

时间切片变量衍生

  首先,会计算出截止每一期的账单日的还款历史状态。大概情况如下:

催收评分卡实战

  对每一行的repayment_history取长度等于mob的位数就可以得到当期的还款历史字段,然后就可以继续衍生当期而言的近3期、近6期的逾期行为变量。这里只能衍生逾期状态的行为变量,如果需要衍生逾期天数的行为变量,需要根据还款计划表进行计算。

  首先,根据还款计划表计算每一期的逾期天数,如果至今未还的话就用当前时间代替。然后衍生一个类似于还款历史的字段,只不过是逾期天数组合成的字段。后面的操作就和逾期状态的处理一样了。

催收评分卡实战

  同理,还款金额的时间切片变量也可以这样衍生。

# 生成逾期天数的List
overdue_dict=(df_all.groupby('app_id')['overdue_days'].apply(lambda x:list(x))).to_dict()
df_all['overdue_days_list']=df_all['app_id'].map(overdue_dict)
# 生成实际还款金额的List
pay_amt_dict=df_all.groupby('app_id')['all_pay_amt'].apply(lambda x:list(x)).to_dict()
df_all['pay_amt_list']=df_all['app_id'].map(pay_amt_dict)

变量穿越

  变量穿越是指X变量的表现时间超过了Y变量,即出现用Y去预测Y的情况,这在贷后评分卡中是很容易犯的。这种变量一旦入模的后果就是变量的IV值极高(一般大于0.5就会有这种情况),而且模型的KS较高。   思考两个变量,首次逾期天数、首逾3天发生期数这两个变量是否可以入模?

首次逾期天数:用户发生首次逾期的天数。   比如一条样本的还款历史为FFFFFF12,Y变量为M1-M2,此时用户的首逾天数一定会大于30天,就会出现用Y去预测Y的情况。因为首逾天数大于30天,就意味着一定从M1迁徙到M2。   但是如果将这个首次逾期天数调整一下,如果该条记录为用户首次逾期,则这个变量为0。这样就会避免变量穿越的问题了。

首逾3天发生期数:首次逾期3天以上发生的期数。   比如样本的还款历史为FFFFFF1112,首次逾期3天以上发生在第9期,即第三个1的地方。这条样本会被拆成FFFFFF11和FFFFFF111和FFFFFF1112三条样本。而对于FFFFFF11这个样本,首逾3天以上发生在第9期,这个字段一共才取到第8期,所以会出现变量穿越。

变量分箱

变量有类别型变量和数值型变量。 类别型变量:

  1. 如果取值<=5且每个类别都包括好坏样本,直接按类别分箱。
  2. 如果取值<=5但某些类别只有好/坏样本,进行合并。
  3. 如果取值>5,则进行降基处理或者bad_rate编码成数值型变量。
    降基处理:将类别占比小于某个阈值的类别划为一箱。
    bad_rate编码:将每一箱按照坏样本比例映射成数值变量。但是变量会失去原有的解释性。

数值型变量: 将数值型变量和bad_rate编码转换过来的变量进行卡方分箱。

  分箱之后需要看每个变量的单调性,一般要求每一箱之间的bad_rate单调。但是如果是年龄这种变量,可能无法保证完全单调,只要业务上能解释得通就可以。

催收评分卡实战

  左图是近3期逾期次数的坏样本率情况,可以发现近3期逾期次数越高,变坏的可能性越低。说明这部分用户是习惯性逾期,每次都会逾期但是经过催收都会回正。   右图是近6期M1-M0的次数,99是将2、3降基处理之后的值,可以发现M1-M0回正次数越多,变坏的概率就会越低。

  个人觉得评分卡的精髓在于如何分箱,因为分箱方法的不同会导致WOE、IV值的不同,进而影响后续建模的一系列动作。如何选择合适的分箱方法和调整分箱,本人还需要更加深入地学习。

变量筛选

主要就是进行IV值(>0.02)、相关性(<0.7)、回归系数(为正)。代码如下:

# 相关性剔除
def forward_delete_corr(df,col_list,threshold=None):
    """
    df:数据集
    col_list:变量list集合
    threshold: 相关性设定的阈值
    
    return:相关性剔除后的变量
    """
    list_corr = col_list[:]
    for col in list_corr:
        corr = df.loc[:,list_corr].corr()[col]
        corr_index= [x for x in corr.index if x!=col]
        # corr_values  = [x for x in corr.values if x!=1]
        corr_values  = list(corr[corr.index.isin(corr_index)])
        for i,j in zip(corr_index,corr_values):
            if abs(j)>=threshold:
                list_corr.remove(i)
    return list_corr

  注意,相关性剔除时col_list的变量要按照IV值从大到小的顺序,这样才能保证剔除的是IV值较小的那个变量。

# 逻辑回归系数符号筛选,在筛选前需要做woe转换
def forward_delete_coef(x_train,y_train):
    """
    x_train -- x训练集
    y_train -- y训练集
    
    return :
    coef_col回归系数符号筛选后的变量
    lr_coe:每个变量的系数值
    """
    col_list = list(x_train.columns)
    coef_col = []
    for col in col_list:
        coef_col.append(col)
        x_train2 = x_train.loc[:,coef_col]
        sk_lr = LogisticRegression(C=0.1,class_weight='balanced').fit(x_train2,y_train)
        coef_df = pd.DataFrame({'col':coef_col,'coef':sk_lr.coef_[0]})
        if coef_df[coef_df.coef<0].shape[0]>0:
            coef_col.remove(col)
    # print(coef_col)
    x_new_train = x_train.loc[:,coef_col]
    lr = LogisticRegression(C=0.1,class_weight='balanced').fit(x_new_train,y_train)
    lr_coe = pd.DataFrame({'col':coef_col,
                           'coef':lr.coef_[0]})
    return coef_col,lr_coe

  这个函数中逻辑回归的系数需要和建模时候的系数一致,不然就会出现剔除完之后的变量建模之后,又出现系数为负的情况。系数为负,说明变量之间仍然存在多重共线性,而且会给单变量得分的解释性造成困扰。关于多重共线性的影响列举如下:

催收评分卡实战

建模

  说一下逻辑回归调参,一般评分卡建模中不调参也是可以的。 调参主要用到网格搜索算法,主要调整C和penalty两个参数。

催收评分卡实战

催收评分卡实战

催收评分卡实战

网格调参的代码如下:

def pm_search(model,pm,scale,X,y):#调参函数
    param_test = {pm:scale}
    gsearch = GridSearchCV(LogisticRegression(class_weight='balanced',penalty='l1'), param_grid = param_test, scoring='roc_auc', cv=5 )
    gsearch.fit(X,y)
    score_gs=gsearch.grid_scores_
    
    #各项参数的auc
    score_pm=[[pm,scale[loc],score_gs[loc][1]] for loc in range(len(score_gs))]
    print(score_pm)
    
    parameter=[str(value[1]) for value in score_pm]
    scores=[value[2] for value in score_pm]
    
    #AUC分数绘图
    sns.set(rc={"figure.figsize":(10,6)})
    sns.set(style='darkgrid',palette='muted',color_codes=True)
    plt.plot(parameter,scores,scaley =False)
    
    #最优参数合并list
    best_para=parameter[scores.index(max(scores))]
    
    return [pm,best_para]

  模型的KS曲线、ROC曲线等评估情况这里就不再详述,有兴趣的可以参看之前评分卡的系列文章。催收评分卡只是提升催收效率的第一步,对催收效果影响最大的因素还是催收人员本身。后续基于模型的分析和策略的制定才是更重要的。这里列出一些催收评分卡课程中提及到的策略:

催收评分卡实战

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

展开阅读全文

页面更新:2024-05-29

标签:评分   期数   天数   切片   建模   字段   系数   样本   变量   实战   模型   情况   时间   数据   用户   历史   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top