作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用。知乎专栏:R语言数据挖掘 邮箱:[email protected].欢迎合作交流。

相关连接:

HopeR:R语言信用评分卡:拒绝推断(1) 问题定义

HopeR:R语言信用评分卡:拒绝推断(2) 特征筛选A

HopeR:R语言信用评分卡:拒绝推断(3) 特征筛选B

HopeR:R语言信用评分卡:拒绝推断(4) 特征工程A

HopeR:R语言信用评分卡:拒绝推断(5) 特征工程B

HopeR:R语言信用评分卡:拒绝推断(6) 重抽样

HopeR:R语言信用评分卡:拒绝推断(7) 最小样本量确定

HopeR:R语言信用评分卡:拒绝推断(8) 动态建模A

提要:

Hope现在作为金融风控分析师就职于A金融公司,之前的风控模型在1月份违约率为6.5%,2月份调整之后达到了4.7%,可喜可贺。目前假设模型是相对稳定的,但是模型参数的权重却会随著时间发生变化,因此需要设置滑动窗口建立动态模型。也就是说,如果实时能够获得新的用户数据,这些数据会马上被用于创建新的模型,而很久以前的数据会被排除,不再用于建模。先来观察数据表:

loan_dt为借出的时间,label为实际是否违约(1为违约),tag为是否允许放款(1为未允许)。我们不知道违约的时间,因此我们假设还款时间due date与借款时间loan date成正比例,因此直接用借款时间作为还款时间来建模(没有数据,也是没办法...)。我们先来进行探索性数据分析。

我们在不同的时间,有多少用户申请贷款呢?

raw_win %>%
count(loan_dt) %>%
ggplot(aes(loan_dt,n)) +
geom_line()

这个波动性感觉有点意思,不过先不深究了。那我们有多少有效数据(能够最后知道用户是否违约的)呢?有效数据中违约和不违约的数量相对多少是如何的呢?

raw_win %>%
filter(!is.na(label)) %>%
count(loan_dt,label) %>%
ggplot(aes(loan_dt,n,colour = as.factor(label))) +
geom_line()

上图中,蓝色线条是违约用户的数量,红色是没有违约的用户数量。我们看到蓝色的用户数量非常地少,因为模型是奏效的,所以违约的用户被控制到一定范围以内。

要建立动态模型,模型中的数据样本一定要合理。这个合理性体现在两方面:1、样本量足够大,能够建立稳健的模型;2、响应变数的比例要合理,如果在一定时间内违约用户数量太少,这样建模明显会有严重的类失衡问题,也不利于建模。

从策略上来讲,如果滑动窗口检测的违约样本比例较少,说明这段时间内在上一期模型奏效,没有必要继续建立新的模型。如果违约样本较多,则说明上一期模型失效,是时候建立新的模型。需要明确一点,新的模型不一定就好,旧的模型不一定就差,主要是看是否满足这么一个假设:随著时间的改变,LR模型中每一个特征所占的权重已经改变,而且严重地影响了预测的准确性。而时间临近的数据,更能够表征近期的用户违约状况,老的数据则「过时」了,会误导模型的学习。

从极端的角度来说,如果我们认为模型没有时效性,能够得到永恒的真理,那么我们就可以用全样本来做,然后得到一个非常稳健的模型。另一个极端就是,我们认为模型一直在变,甚至天天变,那么有新的数据进来,我们就用当天的数据做模型,然后来预测第二天的违约情况。一般不会走极端,而是在两个极端之间找到一个平衡点,从而我们得到更新模型的最佳时机,以及每次建模应该用多长的时间窗口作为数据来源。

现在,我们需要得到两个东西:1、模型更新的时机选择:如果违约率突然升高(可以是每天的违约率,也可以是累计近n天的违约率),那么把新的违约样本纳入模型,进行模型更新;2、模型时间窗口长度的确定:上一个项目中的n如何确定?这取决于样本量是否够大,已经违约样本是否够多。还有一个有意思的想法就是,近n天的违约率是否能够作为一个新的特征,来预测未来的违约率?

这个规则已经比较复杂,迟些有时间再试。


推荐阅读:
相关文章