二、信贷风控常用的算法简介
上篇信贷风控模型要点介绍了信贷模型的基本要点,本篇介绍信贷风控常用的算法,主要就是LR 和GBDT类
一、逻辑回归
1.1 算法基本公式
在Y∈{0, 1}的二分类场景下,假设在X=x条件下,y=1的概率为下面这个公式:
几率(odds):y=1的概率与y=0的概率的比值,即
对数几率(ln(odds)):几率取对数
1.2 算法的优点
1. 当特征做了WOE转换,且频率的确反应概率时,该算法的结果反应的是概率值(即是回归值而不仅是排序值);
2. 几率函数任意阶可导,有利于数值问题的使用。
1.3 代价函数和求解方式
(1)极大似然估计推导代价函数
当样本集为独立同分布时,当前Y值的取值概率为
做ln转换以便后续求解
参数W应该使得上述估计值取得极大值,也就是取负后取得极小值,得到代价函数
极大似然估计推导出并取对数的这种损失函数,称为交叉熵损失函数。
(2)求解方式
主要有梯度下降法和牛顿法两种。暂略。
1.4 正则化
(1)L1正则:把权重W的一阶范数(也就是绝对值的和)加入代价函数。
原理:假设了w服从均值为零的拉普拉斯分布,L1正则也被称为LASSO 回归。(代价函数可以从拉普拉斯分布的概率密度函数和极大似然估计开始推导,即一个独立同分布的参数系列构成的product)
效果:会把很多特征的权重系数搞成0.
(2)L2正则:把权重W的二阶范数(也就是平方和)加入代价函数
原理:假设了w服从均值为0的正态分布。
效果:会把很多参数拉到0附近。
1.5 算法的使用
1. 特征的初筛:LR需要对特征进行较细致的前期初筛。L1正则是个筛选特征的好办法。
2. 特征的WOE转换:为了真实反应概率、防止极端值影响等,应该把特征做WOE映射。
二、GBDT系
2.1 GBDT
GBDT全称gradient boosting decision tree,即梯度提升树,可以拆分成梯度、提升、树三个子知识点。
2.1.1 集成学习-关于boosting
把若干个弱学习器(基学习器)通过某种方式组合起来使用,达到比所有弱学习器都好的效果,这个算法框架叫集成学习。分为bagging、boosting、stacking三种。
(1)bagging
bagging就是把基学习器通过投票表决或加权平均组合。bagging最简单了,理论上不要求基学习器使用同样的算法。而且基学习器的训练是各自独立的,所以很好并行。
基学习器使用决策树,且加上属性扰动(即训练决策树时进行列采样)的bagging,就是随机森林算法。
(2)stacking
即子模型-主模型框架。构建若干个子模型(使用不同的特征 或 使用不同的算法),然后使用这些子模型再训练个模型。
(3)boosting
boosting的组合方式是把若干个基学习器加起来,因此也被称为加法模型。boosting的训练过程是串联的,即首先训练一个基学习器,然后使用该基学习器的预测值和真实Y的差异(一般是残差)作为新的Y训练第二个基学习器,再以前两个预测值的和 与 真是Y的差异 来训练第三个基学习器,以此步骤不断迭代。
显然boosting的复杂度要高一些:bagging和stacking的基学习器本质上互相没啥关系的,在实现上可以并行训练;而boosting是第n个基学习器依赖前n-1个基学习器的情况,因此只能串行训练。当然,整体上是串行,内部细节仍可以进行一些并行处理。
2.1.2 代价函数和优化方式-关于gradient
(1)从均方差损失函数 和 残差 切入
前k棵树的预测值是:
残差是:
均方差损失函数是:
任意一个样本带来的损失是
可以看出,残差其实是均方差损失函数对当前预测值的负一阶导数(负梯度)。此时梯度提升和我们的直观理解的残差拟合是一致的。但是,如果第k+1棵树的学习目标只有残差这一种方式,好像就没有损失函数什么事,或者只有损失函数是均方差时的梯度提升这样一种形式。而实际肯定有很多值得尝试的办法。
(2)一般的损失函数 和 下一棵树的学习目标
损失函数的一般形式是:
损失函数对前k棵数预测值的导数(一阶梯度)是:
根据梯度下降优化的理论,如果下一步迭代成以下形式,J一定是减小的。
因此,第k+1棵树的学习目标就可以设置为这个负梯度。这就是梯度提升的基本原理。
2.1.3 决策树简介
(1)分类树
分类树应该很少用到了。最经典的两个算法,ID3是1986年提出的,C4.5是1993年,都是些老算法,关键是看原理就觉得不咋好用。分类树主要涉及信息熵、信息增益、信息增益率、GINI系数等几个关于分裂的指标。
a. 信息熵
在本语境下,信息熵指一个样本集的Y标签的混乱程度。一个样本集一共有K个类别,第i个类别的样本数占比为pi,则信息熵为
假设一个样本集只有一个类别,显然信息熵为0。如果有两个类别且各占一半,则信息熵为1,如果是2:8,则信息熵小一点。总之类别数越多、类别分布越均匀,信息熵就会越大。
b. 信息增益
当使用某个特征把样本划分为V个子集,划分后的信息熵是各个子集的信息熵 以子集样本数占比为权重进行求和。即
信息增益为
当决策树进行节点分裂时,应该选择信息增益最大的特征。当依赖这个指标进行决策树生成时,对应的算法就叫ID3算法。
c. 信息增益率
信息增益指标会偏好取值比较分散的特征,因此引入信息增益率指标。首先引入评估特征取值分散程度的指标:当特征一共有V个取值,对应的每个子集的样本占比为pi,则
(IV就是以该特征对样本集计算的信息熵。)
信息增益率即
使用信息增益率进行决策树生成的算法就是C4.5
d. GINI系数
同信息熵类似,当一个样本集一共有K个类别,第i个类别的样本数占比为pi,则
分裂时使用分裂后GINI最小进行特征选择,也是一个办法。对应的算法可能没有姓名。
可以看到上面的这几个指标,是把Y完全当作类别来看的,不会有任何回归值、平均值的概念。而上面这几个指标,作用和损失函数类似。
(2)回归树
回归树主要就是CART(classify and regression tree),顾名思义又能分类又能回归的树。对应的损失函数可以使用均方差损失。其他的应该也行。
2.2 XGB
XGB可以认为是一个GBDT的具体实现,其中又做了算法和工程层面的优化工作。XGBoost于2016年问世后,基本快速席卷了当时也正发展正旺的“互联网金融”,主要有两个原因:1)使用XGB比LR更简单明了,不用像银行信用卡建模那样死抠特征;2)互金搞得都是短平快产品,对性能要求高于稳定性,XGB的表现比LR强很多。
2.2.1 算法原理推导
(1)代价函数一般形式
学习第k+1棵树后的代价函数
第一项是普通损失项;第二项是正则项,后面再针对决策树进行展开。
(2)二阶泰勒展开
以,,对损失函数进行二阶泰勒展开。即:
就泰勒展开部分而言,需要最小化的就是这一项。这是一个关于TK+1的二阶多项式而已
(3)细化决策树正则项
添加第K+1棵树的正则项。即
第二项权重正则项,即第K+1棵树叶子节点的权重(就是取值)的二阶范数;直观理解,不希望任何一棵树的任何一个叶子节点的权重过大。
第三个是叶子节点数正则项,即第K+1棵树的叶子节点数。直观理解:不希望任何一棵树的结构过于复杂。
(4)表达成样本求和形式
(5)进一步表达成叶子节点的形式
TK+1本身就是一个树,每个样本都会属于其中的一个叶子节点假设为j,对应的值是wj,假设一共就是T个节点,则
(6)叶子节点的最优取值和优化目标重写
叶子节点的最优取值就是
然后,
至此推导完成。那么在生成第K+1棵树时,通过用不同的特征的不同的分割点,把样本分到不同的叶子节点里面,对应的形成了不同的Gj和Hj,在此里面找到其中的最优值,就完成了第K+1棵树的构造。
2.2.2 实现层面的优化
实际找到这个最优解的过程,最暴力的是:无脑遍历所有的特征的所有可能的分割点,找出最优解。这也被称为贪心算法。这样找到的肯定是最优的,但速度肯定不过关。因此除了原理,在实现层面也做了诸多优化。
(1)分位数遍历
不遍历所有可能的分割点,只遍历设定好的分位数,比如1/2/.../99分位数,显然能减少计算次数。
分位数有全局分位数和局部分位数两种方案。所谓全局分位数,就是针对一个特征,直接使用全量样本统计出各分位点,后续只把这些分位点作为分割点进行计算。所谓局部分位数,就是每次分裂后,使用进入分支的样本重新计算某特征的分位点,并作为分割点进行计算。只要设置的细一点,全局分位数就能接近贪心算法的效果,计算量相对也小一点。
(2)加权分位数
仔细研究优化目标可以看出,每个样本发挥的作用会和其二阶导hi有关系,所以把每个样本的权重设置成hi,并进一步算分位点和后续步骤。
(3)稀疏感知
主要指两点:1)根据某特征进行分裂时,该特征缺失的样本是往左放还是往右放。计算一下往哪边放更优就放那边。2)遍历分位点计算时,只需要考察特征覆盖的样本,减少了一定运算量。
(4)其它
此外还有一些纯工程层面的优化,包括i. 特征预排序和块存储;ii. 内存缓冲区;iii. 读写相关的。都不太懂,对建模人员也不需要太懂。
2.2.3 XGB额外的一些优点
1. 第k+1棵树的学习目标,由一阶导推算改成二阶导推算,可以更快速收敛;
2. 很好用的正则化项;
3. 其实可以支持各种基学习器;
4. 引入了学习率概念,即给每棵树加上整体的权重;
5. 引入了列采样概念
2.3 LGB
LGB(LightGBM)是2017年提出的,私认为其创新型是不如XGBoost的。但因为其是进一步做了优化,所以使用起来更加方便,目前应用比XGBoost还要广泛一些。LightGBM基本没有理论和算法层面的优化,而主要是速度、内存占用等方面的优化。
2.3.1 LightGBM优化点
(1)梯度权重抽样
根据GBDT算法,负梯度是当前学习的目标。那么这个负梯度越大,也代表对应的样本的学习还很不到位。那就直接根据这个梯度的大小进行分权重抽样,把还需要进一步优化的样本的权重搞大一点,已经没啥损失的样本的权重搞小一点。这样本来全体样本集是10W,抽样完可能就1W了,就可以提高速度。
(2)所谓直方图算法
说白了就是对特征做了个分箱映射。默认的分箱数是256。
i. 分箱映射可以减少内存占用。比如原始特征是个六位小数的浮点数,映射成0-255的取值,那么原始特征就可以直接删掉了,只要记录下映射关系及每个样本所在的箱即可。
ii. 分箱映射可以加速计算。因为本来是要遍历所有可能的分割点了,现在本质上是只需要遍历若干个分位点。但其实xgb也有这个。
iii. 分箱映射可以发挥正则化的作用。遍历所有分位点虽然是找到最优的解,但也有可能是过拟合的。先分个箱,可以有效抑制。
iii. 可以使用“右子=父-左子”进行加速计算。
iv. 数值型特征可以搞等频分箱,类别特征可以每个类别一箱。具体细节上可以再细优化一些,比如占比很小的类别直接扔掉。
(3)互斥特征捆绑算法
有的特征的覆盖度是互斥的。比如样本的key是手机号,然后中国移动/联通/电信分别提供了特征,特征名还没对齐。三个特征分别是feat1_yd, feat2_lt, feat3_dx。然后一个样本在这三个特征上只会有一个特征是有值的,那这仨特征就是完全互斥的,lightGBM内部可能会把它们合成一个特征(但做了前后映射)
i. 这个捆绑可能还是为了减少内存占用、加速计算。
ii. 如何快速发现特征的互斥 或 评估任意两个特征的互斥度,也是一个很复杂的问题,但这个是计算机的算法问题,不是统计学习的算法问题。LightGBM提供了想法和解决方案,具体不懂。
(4)深度优先的生长策略★
LightGBM生成一棵决策树时,会按照深度优先策略。举个例子:当前指分裂一次,则共有父、左子、右子三个节点。接下来会对左子和右子进行考察,各自都找一个最优特征最优分割点,找完再比对一下哪边的增益更大,最后只保留增益大的这边的分裂,小的那边就终止了。因为这个策略,LightGBM里面的树的叶子节点树就严格等于深度+1。
这样的好处是i. 会快一点,ii.会有防止过拟合作用。
LightGBM是深度优先策略,XGBoost是宽度优先策略。这是两个算法最常说起来的区别。
(5)类别特征最优分组
使用类别型变量把样本分成左右两支,理论上有2^k-1种分法(k是类别特征的去重取值个数)。LightGBM会从中找到增益最大的分法进行分裂。并且在实现上做了优化。
但仍可以盲猜类别特征过多的话,会影响训练速度。
2.3.2 LGB与XGB的对比
1. LGB比XGB速度快、内存占用小;
2. 效果差不多;
3. 都能自动处理缺失值(放左边或放右边);
4. LGB能处理类别变量,XGB不能(需要one-hot编码处理)
5. LGB 深度优先,XGB宽度优先。(面试必答)
一言以蔽之,算是没有什么本质区别吧
2.3.3 泛GBDT类算法常用参数
不管是LGB还是XGB,他们在算法层面的原理是差不多的,也因此有着类似的参数(调参侠调的那个参数)。枚举如下:
(1)结构类
i. 树的棵树
ii. 树的最大深度
iii. 树的最大叶子树
不管是深度优先还是宽度优先,后两个参数有点耦合。
(2)采样类
i. 列采样比例,即每棵树随机使用其中多少特征进行训练;
ii. 行采样比例:即每棵树随机使用多少样本进行训练
(3)正则类
i. L1正则系数,即每增加一个叶子节点带来的损失;
ii. L2正则系数,即叶子权重的二阶范数前面的系数;
iii. 学习率,即每棵树前面整体乘的系数,也叫shrinkage;
(4)其它控过拟合的项
i. 叶子节点最小样本数。还会衍生一个参数:叶子节点海森矩阵之和最小值,如前面提到的会使用hi作为样本权重,这个之和最小值指的就是权重之和。
ii. 最大分箱数(其实有两个,一个是针对数值型变量,一个是针对类别型变量)
iii. 可供分裂的最小样本数
iv. 最小增益值
(5)工程类参数,并行数、随机种子数之类的,略。