模型视角下的风控策略规则发现

风控业务背景

模型构建固然重要,但最终是为了将模型应用于实际业务中,创造价值。从这个角度而言,完全不懂策略的风控建模师是不合格的。在交付模型时,建议与策略同学多加沟通,不仅是给出模型的技术指标,说明正确的使用方法(应用不当就会产生模型风险),更需要学一点策略知识。这不仅让你拥有更宏观的业务视野,也会更明确自身价值。☀️

本文从模型视角介绍一些策略规则发现的常见做法,希望能对初学者有所启迪。

Part 1. 模型与策略之间的边界和联系

在平时工作中,我们会发现策略组类似模型组的“甲方“,向模型组提需求。而模型组则在开发完模型后,交付相应的模型分和开发文档。这是因为:

模型是策略的工具,策略往往包含了模型,是模型的延伸。(摘自参考资料1)

如图1所示,策略规则生成中需要综合多种来源的变量,大致可分为3个来源:

  1. 模型分数:对于一些弱(金融属性)数据源,难以提取有效的强单变量,此时就需要借助模型来提取合成一个强变量分数。模型的好处很明显,一是可以提高单变量排序性,二是变量降维,三是综合多个维度。
  2. 客群标签:风控策略决策对象归根结底是人,那就可以利用用户画像标签,比如性别、收入、学历、地域、年龄、职业等。这些标签的业务可解释性非常强,适合对人群不断细分,分而治之。
  3. 其他变量:指一些区分度本身就比较强的变量,如多头借贷变量、征信、黑白名单等。这些变量可能本身就很强,可以挑选一些直接用于规则,而不需要再通过模型来融合。

图 1 - 策略规则生成的多维度变量来源

广义上来说,策略也是一种模型。但仍存在一些侧重点差异,体现在:

  1. 复杂度:模型常采用一些机器学习/深度学习算法(如NLP、Graph Embedding),挖掘各类数据来构造特征。同时,利用一些回归、分类算法(如逻辑回归、XGBoost)学习输入(特征X)与输出(目标Y)之间的统计规律;策略则需要结合具体业务场景,主要依赖于人工业务经验对客群细分,一般用简单的多变量交叉切分(画格子)或使用决策树分群,这是为了保证足够的解释性,便于感知业务影响。
  2. 迭代周期:模型重,策略轻。模型往往会经过长时间窗的稳定性验证,保证上线后持续较长时间都保持稳定,只有当模型出现明显衰减(排序性变弱)时才会迭代;而策略则可以根据近期样本快速调整,上线下线都更为灵活。例如,若近期发现某个地区发现大面积欺诈行为,那就直接上线地域拦截规则。
  3. 业务影响:模型退居二线,如违约预测(PD)模型可输出人群的违约概率,但这并不能直接产生业务贡献;策略站在业务第一线,更为关注对不同细分人群的决策结果,比如:是否准入?授信额度多少?利率定价多少?

Part 2. 基于画格子的规则生成方法

风控策略本质是若干变量通过AND、 OR等逻辑运算组成的规则集,目标是为了降低坏账率、提高通过率、提升利润率等。典型的风控策略格式如下所示:

如果:
    AND 最近1个月多头申请机构数 >= 5
    AND 模型信用分 < 500
    OR  历史最大逾期天数 > 10
那么:
    选项 予以拒绝(RJ)

很多时候,我们都在思考如何自动从大量变量(高维空间)里找到较少变量(低维空间)组成的规则集合,即规则发现

一种常见策略规则的做法,即笛卡尔积法,俗称“格子大法”。可分为以下几个步骤:

  1. 获取变量: 定义bad,取最近完全进入表现期的样本,关联潜在可用的特征变量集X。
  2. 变量筛选:通过IV快速筛选。对IV靠前的一些变量,记录相应的分箱边界供后续使用。
  3. 指标统计:对多个单变量分箱后分组,统计申请量、放款量、坏账量等数量指标。
  4. 透视呈现:分多个维度,统计每个格子内的申请率、放款率、坏账率等比率指标。
  5. 规则提取:结合坏账率目标和样本量,圈出满足要求的格子,提取相应的规则逻辑。
  6. 规则评估:评估跨期稳定性,分析在不同时间窗圈定订单的通过率、逾期率等指标。
  7. 策略上线:在决策引擎(如SMG3)上配置规则,设置作用的订单尾号和其他参数。

图 2 - 策略生成逻辑与验证

在明确上述基本步骤后,我们以 x1 和 x2 两个变量来制定规则,统计代码如下:

select apply_month, x1_bin, x2_bin
,count(1) as appl_cnt  -- 申请量
,count(case when is_loan = 1 then order_id else null end) as loan_cnt -- 放贷量
,count(case when is_del  = 1 then order_id else null end) as del_cnt  -- 逾期量
from (
    select order_id
          ,apply_month  -- 申请月份
          ,apply_time   -- 申请时间
          ,is_loan      -- 是否放贷
          ,is_del       -- 是否逾期
          ,case when x1 <  600 then '0.(-inf,600)'
                when x1 >= 600 and x1 < 620 then '1.[600,620)'
                when x1 >= 620 and x1 < 660 then '2.[620,660)'
                when x1 >= 660 and x1 < 700 then '3.[660,700)'
                when x1 >= 700 then '4.[700,inf)'
           else 'null' end as x1_bin
          ,case when x2 >= 0 and x2 < 3 then '0.[0,3)'
                when x2 >= 3 and x2 < 5 then '1.[3,5)'
                when x2 >= 5 and x2 < 7 then '2.[5,7)'
                when x2 >= 7 and x2 < 9 then '3.[7,9)'
                when x2 >= 9 then '4.[9,inf)'
           else 'null' end as x2_bin
    from vdm_risk.fhj_sample
) a
group by apply_month, x1_bin, x2_bin;

为了便于后续分析策略规则的跨期稳定性,我们加入时间维度进行统计。固定时间点,可统计x1 和 x2 两个变量组成的二维格子里的(订单口径)申请量、放贷量、坏账量、放贷率、坏账率等,如图3所示。

图 3 - 双变量交叉组成的决策矩阵

风控策略中常遇到的两个问题是:

  1. 降低坏账率,此时就需要将高于目标坏账率的格子里的客户拒绝。
  2. 提升通过率,即拒绝回捞。这就需要推断被拒绝的人群的贷后表现,将部分误拒人群捞回。

在图3中,我们希望拒绝回捞,那就可以考虑将黄色部分的格子(坏账率均低于2%)予以回捞。如果继续增加更多维度,我们发现格子数量会增加。相应地,落到每个格子里的样本量也就会减少,此时可能会失去统计意义。尤其在计算比例类指标时,对样本量有基本要求(1K+)。因此,我们可以考虑:先看大格子,再看小格子

如图2所示,按此方法,从放贷样本中提取满足要求的规则后,我们需要在近期申请样本上评估规则的稳定性,包括:

  1. 对通过率的影响:若通过率持续升高,这就可能引起我们的担忧,毕竟通过率与坏账率是正相关的;若通过率持续走低,那么就可能引起客户的不满,毕竟交易一直被拒可能导致客户流失。因此,通过率要保持一定的稳定,才是我们乐于见到的现象。
  2. 对坏账率的影响:由于逾期风险总是滞后的,我们无法预料,一般只能在最近放贷进入表现期的样本上分析,但可以用早期表现(early performance)来估算。例如,生成规则时参考FPD30+风险,在评估稳定性时可以用FPD7+,以此获得更长的评估窗口。

同时,考虑到与线上策略的重合度,我们还需要评估新策略与旧策略之间的效果差异。如果新策略的增量很小,可能就不考虑上线替换。可参考《利用Swap Set分析风控模型更替的影响》一文。

Part 3. 基于决策树的规则生成方法

格子大法是策略同学平时用到最多的方法,其易于解释、控制调整;但缺点在于,当变量维度增加时,难以从大量小格子里筛选满足业务目标的规则,这会给策略同学带来极大的工作量。

此时,我们可借助一种常见算法——决策树 ,例如CART回归树。

from sklearn import tree 
# 初始化树结构参数
dtree = tree.DecisionTreeRegressor(
            ccp_alpha=0.0, criterion='mse', max_depth=3,
            max_features=None, max_leaf_nodes=6,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=20, min_samples_split=100,
            min_weight_fraction_leaf=0.0, presort='deprecated',
            random_state=None, splitter='best')

决策树的好处在于,其可根据信息增益、信息增益率等指标,自动进行人群细分。通常,我们可以利用下列几个参数来控制分群数量:

  • max_depth:最大树深。树深越大,模型越复杂,分裂产生的叶子节点(子客群)也越多。
  • min_samples_leaf:叶子节点最小样本量。
  • min_samples_split:父节点在分裂前需要的最少的样本量。
# 拟合数据
dtree.fit(X=df[feat_cols].fillna(-999999), 
          y=df['del_30'], 
          sample_weight=None, check_input=True, X_idx_sorted=None)

为了便于观察各子客群的样本量、坏账率等指标,我们将其可视化:

from sklearn.externals.six import StringIO
dot_data = StringIO()
tree.export_graphviz(
    decision_tree=dtree,              # 拟合完毕的CART树
    out_file=dot_data,                # 输出数据
    max_depth=None,       
    feature_names=feat_cols,          # 入模特征列表
    class_names=['del_30'],           # y变量
    label='all',
    filled=False,
    leaves_parallel=False,
    impurity=True,
    node_ids=False,
    proportion=False,
    rotate=False,
    rounded=False,
    special_characters=False,
    precision=3,
)
# 读取树结构数据
import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
# 可视化展示树
from IPython.display import Image
Image(graph.create_png())

图 4 - 二叉决策树可视化

如图4所示,决策树共分支产生6个叶子节点客群。根节点(大盘)的坏账率为8.6%,而客群6的坏账率达到92.6%,远高于大盘,可考虑作为欺诈规则予以拒绝。从决策路径上看,这个客群的多头指数在7以上,符合业务sense。

值得指出的是,决策树存在以下缺点:

  1. 业务合理性:分裂时完全依赖于Gini系数等指标,有时缺乏业务意义。例如,在图4中,决策分界点都非整数,结合变量含义,需要人工调整为整数相对更为合理。
  2. 过拟合现象:需要跨期验证稳定性,避免只是在当前数据集上效果明显,但跨期并不稳定。
  3. 不容易控制:与格子大法有所差异的是,决策树是有监督自动学习,无需人工介入,这就不容易调整。

Part 4. 总结

本文较为系统地探讨了模型与策略之间的关系,以及介绍了两种常见的策略规则生成方法。当然,一个合格的策略需要接受各类业务场景的锤炼,基本方法论仍不足以覆盖一切。我们需要多加实践,培养宏观的业务视野。

笔者认为,先从风控模型做起,打好基础(包括对底层数据源的熟悉程度、算法工具的掌握、模型设计分析的思维全面性等)后,再转去做策略是比较合适的发展路线。理由是,要想让你的模型真正产生价值,你就需要不满足模型的边界,勇于站到业务第一线,推动业务的前进。

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页