风控建模四:逻辑回归评分卡开发
逻辑回归评分卡因其可解释性强、上线便捷、方便管理等特点往往成为传统金融领域风险管控模型的不二选择。本篇文章就来聊一下逻辑回归评分卡的开发流程。
如果选择用python开发评分卡,经常用到的包有两个,一个是sklearn里面的LogisticRegression,一个是statsmodel里面的Logit,不管选择哪个包,我们都需要先对算法原理和拟合过程有一个理解,最好能看过源码或自己实现一下。(关于逻辑回归的python实现,具体可以参看 这篇博客)。
一、变量做WOE转换
1、WOE转换的优势
业务上做评分卡,往往不会直接去拟合变量的原始值,而是先做woe转换。变量做woe转换即把变量先分箱,然后用每箱的woe值替代原始值,然后把woe转换之后的变量拿来拟合逻辑回归。当然,理论上来讲,我们可以直接用变量原始值拟合逻辑回归,但更建议变量先做woe转换,主要因为以下几点优势:
1. 有效处理缺失值
业务数据中很多变量不可避免会有部分缺失,缺失不一定是坏事,很多时候是否缺失本身就是很有区分度的信息,这个时候如果对缺失做均值或中位数填充,则会降低变量区分度。如果做woe转换即可以把缺失单独分一箱,有效保留了是否缺失的有效信息。
2. 对异常值不再敏感
回归算法对异常值还是十分敏感的,有时候一个极异常点会导致整条回归拟合线的趋势反转。分箱并用woe值替代之后,异常值就不会再产生影响。
3. 对类别型变量进行了统一处理
woe转换起到了统一处理类别型和数值型变量的作用,而且,个人认为,相比于独热编码,做woe转换是更好的处理类别变量的方式:独热编码的处理方式一是容易造成信息丢失,尤其是变量类别数过多的时候,一个类别型变量被拆分成多个0-1变量,而最后往往做不到所有0-1变量都入模,造成部分信息丢失;二是独热编码这种处理方式和变量本身的风险区分度也没啥关系。而woe转换则在这两点上具有优势,一不会造成信息丢失,二woe值也能够反映变量本身的风险区分力(区分度越强的变量,woe转换后的方差越大)。
4.起到了标准化的作用
woe转换后的变量取值都会被统一到一个量级下,变量的方差大小只和变量本身的风险区分度有关,不再受变量本身取值的影响,起到了和标准化一样的效果。如此更利于逻辑回归的拟合,在梯度下降的时候下降更快且更易找到全局最优点。
5. 非线性关系转换为线性
最终的评分卡一定是线性的,即要么越大越好,要么越大越坏;但很多变量并不满足这种单调线性的性质,比如很多业务场景下的多头数据,会出现U型的趋势,这种U型的变量直接用来拟合逻辑回归,则很难得到一个合理的参数,而分箱woe转换后就能够将两头比较坏的人群赋予一个高woe值,中间比较好的人群赋予一个低woe值,从而让这个变量转换为线性的。当然,前提是变量本身的非线性趋势是合理的并且业务可以接受的。
6. 跟业务更好地结合
既然我们做了分箱,就可以通过调整分箱分隔点来契合业务需求。
7. 方便评分卡的量化评估和管理
当我们评分卡上线后,难免会遇到客群或变量偏移的情况,如果我们在开发评分卡的时候就做了分箱和woe转换,那么当某个变量发生分布偏移后,我们很容易便可以计算出客群在各个分箱之间的迁徙率,并通过系数乘以woe值量化出这种偏移对最终评分卡打分造成了多大的偏移影响。
相应地,我们也可以通过调整变量的分箱阈值来对这种变量分布偏移进行一个人为的纠偏,至少可以让整体打分保持在一个稳定的状态。
2、为什么是WOE转换?
以上几点是woe转换在实际业务操作过程中的优势,但我们还需要深入思考一下,为什么要做woe这种形式的转换,分箱后直接用每箱的坏账率做替换不也能达到同样的效果吗?
我们知道,逻辑回归可以写成如下形式:
l n ( o d d s ) = l n ( p 1 − p ) = Σ ( w i ∗ x i ) + c o n s t ln(odds) = ln(\cfrac{p}{1-p})=\Sigma(w_{i}*x_{i})+const ln(odds)=ln(1−pp)=Σ(wi∗xi)+const
即逻辑回归是对ln(odds)的线性拟合。而woe转换即是为了和ln(odds)统一格式,让转换后的每个变量和ln(odds)之间呈现出一种单调的、线性的关系。更具体一点,woe转换后,会使得变量每增加一个单位,Odds就增加相同的值。(更详尽的解释可以参考【详解】银行信用评分卡中的WOE在干什么?)
二、相关性与多重共线性
1、相关性
在做逻辑回归拟合之前,我们都会做一步去除相关性过高的变量,为什么要这么做呢?最直观的理解就是同样维度,代表同样信息的变量不需要重复使用。那如果我们不做相关性剔除会怎样呢?
假设我们有两个变量X1和X2,真实模型是Y = X1 + X2。如果X1和X2高度相关,那我们拟合出的模型可能是Y = -2X1 + 3X2或者Y = 20X1 - 19X2,它们最终的效果和真实模型也差不多。当然单纯使用这样的模型也没有问题,但问题是拟合出的系数很病态,我们希望拟合出的每个变量的系数能够一定程度上代表这个变量对最终得分的贡献,或者至少是正贡献或负贡献能够通过系数解读出来,而不做相关性剔除的话,拟合出的系数显然不能满足我们的预期。
2、多重共线性
相关性能找出哪两个变量间高度相似,那如果某个变量和其它几个变量的线性组合高度相似怎么办呢?这种情况的存在同样会导致拟合出的系数比较病态。这个时候就需要做共线性的排查,通常我们会使用方差膨胀系数(VIF)这个指标。
V I F = 1 1 − R k 2 VIF = \cfrac{1}{1-R_{k}^2} VIF=1−Rk21
其中 R k 2 \R_{k}^2 Rk2代表第k个变量和其它剩余变量做回归时的判定系数。VIF这个指标说白了就是量化该变量能够多大程度上被其它变量的线性组合所解释。一般VIF为5就很高了,我们做个换算,VIF为5对应的 R k 2 \R_{k}^2 Rk