数据挖掘实践(金融风控-贷款违约预测)(四):建模与调参
目录
一、引言
构建模型过程包括构建模型的预处理,选择算法与模型优化,而模型优化涉及评估验证和调参。
目标
- 学习在金融分控领域常用的机器学习模型
- 学习机器学习模型的建模过程与调参流程
项目地址:https://github.com/datawhalechina/team-learning-data-mining/tree/master/FinancialRiskControl
比赛地址:https://tianchi.aliyun.com/competition/entrance/531830/introduction
二、模型相关原理介绍
2.1 逻辑回归模型
1. logistic回归模型的含义
我们把分类模型分成两个阶段,推断阶段和决策阶段,推断阶段对联合概率分布建模,然后归一化,得到后验概率。决策阶段确定每个新输入x的类别。
我们用推断阶段的方法来推导logistic回归模型,首先对类条件概率密度
和类先验概率分布
建模,然后通过贝叶斯定理计算后验概率密度。
考虑二分类的情形,类别C1的后验概率密度:
结论:logistic回归值表示所属类的后验概率,无论是二分类还是多分类,分类结果都是后验概率最大所对应的类。
2.logistic的决策边界函数分析
决策边界函数,简而言之,就是函数的两侧是不同的分类结果,首先介绍多元变量高斯分布的概念,然后讨论logistic的决策边界函数。
(1)多元变量高斯分布的协方差解析
多元变量的高斯分布公式:
因此,可定性的分析协方差的三种情况与分布图的关系,(a)图表示正常的协方差矩阵的高斯分布图:(b)图表示协方差矩阵是对角矩阵的高斯分布图;(c)图表示协方差矩阵是对角矩阵且对角元素都相等的高斯分布图。
(2)logistic的决策边界函数分析
logistic曲线如下图,红色直线(a=0)表示决策边界函数:
假设类条件概率密度是高斯分布,即P(x|Ck),然后求解后验概率的表达式,即P(Ck|x)。由第一节可知logistic回归值就是所求的后验概率。
假设类条件概率密度的协方差相同,类条件概率密度为:
由第一节的推导公式可得后验概率为:
其中:
由后验概率
的表达式可知可知,当类条件的协方差矩阵相等时,决策边界函数是随x线性变化的直线。
结论:如下图,若两类的条件概率密度的协方差相同时(如C1和C2的协方差相同),则决策边界函数是直线;若两类的条件概率密度的协方差不相同时(如C1和C3,C2和C3),则决策边界函数是曲线。判断协方差矩阵是否相同可以根据分布图形形状是否相同来判断,如C1和C2的协方差相同,C3和C1、C2的协方差不相同。
假设类条件概率密度符合高斯分布且具有相同的协方差矩阵,则决策边界函数是一条直线;若类条件概率密度符合更一般的指数分布且缩放参数s相同,决策边界函数仍是一条直线。
3.logistic模型的参数最优化
(1)logistic模型损失函数
logistic回归模型的含义是后验概率分布,因此可以从概率的角度去设计损失函数。
(2)logistic模型的参数最优化
损失函数最小化等价于模型参数的最优化,如下图:
具体求法在本文不展开,只给出算法思想。
为了避免过拟合问题,则在原来的损失函数增加正则项,然后利用梯度下降法求最优解,这里也不展开。
4.logistic模型与感知机模型的比较
(1)logistic模型与感知机模型的相同点
由第二节分析可知,假设类条件概率分布的协方差相同,则logistic模型的决策边界函数是随x线性变化的直线,因此,感知机模型与logistic模型的分类策略一样,即决策边界函数是一样的。如下图。
感知机模型:当点落在直线上方,y>0,则分类结果C1;反之为C2。
logistic模型:当点落在直线上方,y>0,则后验概率P(C1|X)>0.5,分类结果C1;反之为C2。
考虑到对输入变量x进行非线性变换
,感知机和logistic模型的分类策略仍一样,决策边界函数相同,如下图:
感知机模型:当点落在圆外,y>0,则分类结果C1;反之为C2。
logistic模型:当点落在圆外,y>0,则后验概率P(C1|X)>0.5,分类结果C1;反之为C2。
(2)logistic模型与感知机模型的异同点
1)logistic回归模型限制值的范围在0~1,感知机模型对值范围没有限制,因此logistic模型相比感知机模型,对异常点有更强的鲁棒性。如下图,当有异常数据时,logistic模型要好于感知机模型。
2)感知机模型用误分类点到超平面的距离衡量损失函数,而logistic模型则从概率角度去衡量损失函数。
5.总结
logistic回归的含义是后验概率分布,用概率的角度去设计似然函数,logistic模型相比于感知机模型对异常数据具有更好的鲁棒性。
2.2 决策树模型
详情见:监督学习(二):决策树模型
1.决策树不确定性的度量方法
(1)不确定性的理解
下图为事件A是否发生的概率分布,事件发生记为1,讨论事件A的不确定性。
1)我们考虑一种极端的情况,若 p=1或 p=0,表示为事件A必定发生或事件A不可能发生,即不确定性为0。
2) 若 p>1/2,即事件A发生的概率大于事件A不发生的概率,我们倾向于预测事件A是发生的;若p<1/2,即事件A不发生的概率小于事件A发生的概率,我们倾向于预测事件A是不发生的。若p=1/2,即事件A发生的概率等于事件A不发生的概率,我们无法作出预测,即事件A的不确定性达到最大,以致于我们无从预测,或者可以理解成事件A太复杂了,复杂的我们只能靠运气去猜测事件A是否发生。
(2)决策树不确定性的度量方法
本文用熵和基尼指数去衡量数据集的不确定性,假设数据集包含了K类,每个类的大小和比例分别为Di 和 pi,i = 1,2,…K。
1)熵的不确定性度量方法
在信息论和概率论统计中,熵是表示随机变量不确定性的度量,令熵为H§,则:
熵越大,数据集的不确定性就越大。
2)基尼指数的不确定度量方法
数据集的基尼指数定义为:
基尼指数越大,数据集的不确定性越大。
2. 决策树的特征筛选准则
假设数据集A共有K个特征,记为xi,i=1,2,…K。数据集A的不确定性越大,则数据集A包含的信息也越多。假设数据集A的信息为H(A),经过特征xi筛选后的信息为H(A|xi),定义信息增益g(A,xi)为两者的差值,即:
g(A,xi) = H(A) - H(A|xi)
选择使数据集A信息增益最大的特征作为筛选特征,数学表示为:
x = max( g(A,xi) ) = max( H(A) - H(A|xi) )
3. 决策函数的损失函数评估
令决策树的叶节点数为T,损失函数为:
其中C(T)为决策树的训练误差,决策树模型用不确定性表示,不确定性越大,则训练误差亦越大。T表示决策树的复杂度惩罚,α参数权衡训练数据的训练误差与模型复杂度的关系,意义相当于正则化参数。
考虑极端情况:当α趋于0的时候,最优决策树模型的训练误差接近 0,模型处于过拟合;当α趋于无穷大的时候,最优决策树模型是由根节点组成的单节点树。
4. 决策树最优模型的构建步骤
将数据集A通过一定的比例划分为训练集和测试集。
决策树的损失函数:
决策树最优模型的构建步骤包括训练阶段和测试阶段:
训练阶段
(1)最小化决策树的不确定性值得到的生成模型,即 决策树生成;
(2)通过决策树剪枝,得到不同的正则化参数α下的最优决策树模型,即 决策树剪枝。
下面重点讨论训练阶段的决策树生成步骤和决策树剪枝步骤。
决策树生成步骤:
(1) 根据决策树的特征筛选准则,选择数据集信息增益最大的特征;
(2) 重复第一个步骤,直到所有叶节点的不确定性为0 。
决策树剪枝步骤:
(1) 将正则化参数α从小到大分成不同的区间
,对决策树的非叶节点进行剪枝,令该节点为T,以该节点为根节点的子树为Tt。
(2) 当α满足如下条件时:
即节点为单节点树的损失函数与子树Tt的损失函数相等,而剪枝后的复杂度降低了,泛化性能较好,因此,对该节点进行剪枝。
(3)遍历所有非叶节点,得到每个剪枝后的最优子树与对应的α参数 。
备注:决策树生成和剪枝步骤只给出大致框架,具体请参考李航《统计学习方法》。
测试阶段:
通过测试集评估不同α参数下的最优决策树模型,选择测试误差最小的最优决策树模型和相应的正则化参数α。
5. 决策树的优缺点分析
优点:
算法简单,模型具有很强的解释性
可以用于分类和回归问题
缺点:
决策树模型很容易出现过拟合现象,即训练数据集的训练误差很小,测试数据集的测试误差很大,且不同的训练数据集构建的模型相差也很大。实际项目中,我们往往不是单独使用决策树模型,为了避免决策树的过拟合,需对决策树结合集成算法使用,如bagging算法和boosting算法。
2.3 GBDT模型
1. 单决策树与提升树算法的不同
决策树是单一学习器,提升树是以CART决策树为基本学习器的提升方法。本节从结果评价角度和损失函数角度去描述两者的不同。假设决策树的学习器模型是 f(x),提升树共有K个弱学习器
,其中 i=1,2,…,K。
(1)结果评价方法:
对某一个输入数据xi
决策树模型的输出结果 yi:
提升树模型的输出结果 yi:
若是回归:
若是分类:
其中,i 表示某一个弱学习器,T代表分类模型(如逻辑线性回归,或sign函数)
(2)模型构建方法
1)决策树模型构建方法
决策树运用基尼指数来计算模型的损失函数,决策树生成阶段是最小化模型的损失函数,最大化决策树的深度;决策树剪枝阶段是采用正则化的损失函数来完成,最后通过交叉验证法选择最佳子树;
2)提升树模型构建方法
提升树是多个决策树组合为强学习器的提升方法,每个决策树的复杂度比单一决策树低得多,因此不能像单一决策树那样最大化决策树深度来最小化损失函数。决策树是boosting族的成员,弱学习器是串行迭代生成的,通过最小化每一步的弱学习器损失函数来构建提升树模型。
2. 提升树算法
提升树算法的基本学习器是决策树,且提升树算法是加法模型,因此,提升树模型可以表示为:
其中,T(x; θ \theta θm)表示决策树, θ \theta θm表示决策树的参数,M为树的个数。
提升树算法:
提升树算法采用前向分布算法,假设初始提升树 fo(x)=0,第m步的模型是:
其中,fm-1(x) 为上一个模型,通过经验风险极小化确定当前模型的参数 θ \theta θm ,
其中L表示损失函数,fm-1(x) 和 yi为常数,由(1)式可知,我们只要知道损失函数L,我们就能得到每一轮的模型参数 θ \theta θm ,也可以理解为用当前模型 T(Xi; θ \theta θm) 去拟合上一轮模型的残差。因此,提升树算法原理是用当前的决策树去拟合上一轮的模型残差,使当前的损失函数值最小。
【例】假如有个人30岁,我们首先用20岁去拟合发现损失有10岁,这时我们用6岁去拟合,这样迭代下去,直到损失函数达到我们的要求,这就是提升树的思想。
大家有没有想过,为什么我们不直接去用30岁去拟合,这么做的步骤相当于最大化该决策树的深度,得到的模型不是一个弱分类器,导致过拟合问题的出现。
3. GBDT算法
我们再次回顾上一节例题,如果我们首先用10岁去拟合发现损失有20岁,然后再用8岁去拟合损失有12岁,这样迭代下去,与上节达到相同的损失函数值则需要更多的迭代次数,这就是GBDT算法思想:用损失函数负梯度近似残差,回归树拟合负梯度得到本轮的最小损失函数。因为提升树是直接拟合残差,所以达到相同的损失函数值时,提升树需要的迭代步骤要小得多。
步骤:
(1)用损失函数的负梯度近似残差,表示为:
(2) 回归树拟合负梯度,得到叶节点区域Rmj,j=1,2,…,J。其中J为叶节点个数,m为第m颗回归树。
(3) 针对每一个叶子节点里的样本,我们求出使损失函数最小,得到拟合叶子节点最好的输出值Cmj,如下:
(4)更新回归树模型:
(5)得到最终的回归树模型:
可能最难理解的是第三步,我们可以理解为在负梯度方向上去求模型最小化。负梯度方向理解成损失函数负梯度的回归树划分规则,用该规则去求损失函数最小化。
假设损失函数曲线如下图:
其中,m表示迭代次数,fm(xi) 表示共迭代m轮后的学习模型,L(yi,fm(xi)) 表示模型的损失函数,由提升树的原理可知,模型的损失函数随着迭代次数的增加而降低。如上图,梯度和负梯度分别为绿色线和红色线,当我们用当前的学习模型 fm(xi) 沿着负梯度方向增加时,损失函数是下降最快的,因此,GBDT算法思想是可行的。
PS:李航老师《统计学习方法》P152的GBDT算法表达式:
个人觉得下式的模型表示法可能会更好:
4. GBDT常用损失函数
由上面两节可知,提升树是用决策树去拟合上一轮的损失函数,GBDT是用决策树去拟合上一轮损失函数的梯度。因此,只要知道模型的损失函数,就能通过前向分布算法计算每轮弱学习器模型的参数,本节总结了GBDT常用的损失函数。
(1)分类算法
a) 指数损失函数:
对应负梯度:
b) 对数损失函数:
对应负梯度:
(2)回归算法
这里不讨论最常用的损失函数,如均方差和绝对损失函数。本节介绍对异常点有较好鲁棒性的Huber损失和分位数损失。
a) Huber损失函数:它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:
对应的负梯度:
b) 分位数损失。它对应的是分位数回归的损失函数,表达式为
其中, 为分位数,需要在回归前设置,对应的负梯度:
5. GBDT的正则化
正则化是为了防止模型处于过拟合,GBDT的正则化主要有三种方式:
(1)GBDT是加法模型,因此,模型可表示为:
加上正则化项v,则有:
v的取值范围为:0< v ≤ 1。达到同样的训练集学习效果,(2)式需要更多的迭代次数,即(2)式模型的复杂度较小。
(2) 对训练集进行无放回抽样,抽样比例为 v(0 < v ≤ 1)。取部分样本去做GBDT决策树的拟合可以降低方差,但是会增加偏差。
(3) 对每轮拟合的损失函数梯度的回归树进行剪枝,剪枝算法参考CART剪枝过程。
6. GBDT与AdaBoost的模型比较
假设初始化
AdaBoost模型表示为:
GBDT模型表示为:
比较这两式,你会发现GBDT模型没有权值 αi,原因是:AdaBoost每次都是对不同分布(权值)的原始数据集进行训练,得到一系列弱学习器,然后结合权值得到最终模型;GBDT模型没有权值是因为弱学习器是拟合上一轮的残差,随着回归树个数的增加,残差越来越小,因此弱学习器不需要权值。
7. 总结
本文介绍了boosting族的提升树算法和GBDT算法,提升树算法的每轮弱学习器是拟合上一轮的残差生成的,GBDT算法的每轮弱学习器是拟合上一轮损失函数的负梯度生成的。提升树算法和GBDT算法都是用CART回归树作为弱学习器,只要确定模型的损失函数,提升树和GBDT就可以通过前向分布算法进行构建。
2.4 XGBoost模型
1. 最优模型的构建方法
构建最优模型的一般方法是最小化训练数据的损失函数,我们用字母 L表示,如下式:
式(1)称为经验风险最小化,训练得到的模型复杂度较高。当训练数据较小时,模型很容易出现过拟合问题。
因此,为了降低模型的复杂度,常采用下式:
其中J(f)为模型的复杂度,式(2)称为结构风险最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测 。
应用:决策树的生成和剪枝分别对应了经验风险最小化和结构风险最小化,XGBoost的决策树生成是结构风险最小化的结果,后续会详细介绍。
2. Boosting的回归思想
Boosting法是结合多个弱学习器给出最终的学习结果,不管任务是分类或回归,我们都用回归任务的思想来构建最优Boosting模型 。
回归思想:把每个弱学习器的输出结果当成连续值,这样做的目的是可以对每个弱学习器的结果进行累加处理,且能更好的利用损失函数来优化模型。
假设 ft(xi) 是第 t 轮弱学习器的输出结果,yit 是模型的输出结果,yi 是实际输出结果,表达式如下:
上面两式就是加法模型,都默认弱学习器的输出结果是连续值。
分类任务的回归思想:
根据2.1式的结果,得到最终的分类器:
分类的损失函数一般选择指数函数或对数函数,这里假设损失函数为对数函数,学习器的损失函数是:
若实际输出结果yi=1,则:
求(2.5)式对 yi(t)的梯度,得:
负梯度方向是损失函数下降最快的方向,(2.6)式取反的值大于0,因此弱学习器是往增大 yi(t) 的方向迭代的,图形表示为:
如上图,当样本的实际标记 yi 是 1 时,模型输出结果 yi(t) 随着迭代次数的增加而增加(红线箭头),模型的损失函数相应的减小;当样本的实际标记 yi 是 -1时,模型输出结果 yi(t) 随着迭代次数的增加而减小(红线箭头),模型的损失函数相应的减小 。这就是加法模型的原理所在,通过多次的迭代达到减小损失函数的目的。
小结:Boosting方法把每个弱学习器的输出看成是连续值,使得损失函数是个连续值,因此可以通过弱学习器的迭代达到优化模型的目的,这也是集成学习法加法模型的原理所在 。
3. XGBoost的目标函数推导
目标函数,即损失函数,通过最小化损失函数来构建最优模型,由第一节可知, 损失函数应加上表示模型复杂度的正则项,且XGBoost对应的模型包含了多个CART树,因此,模型的目标函数为:
(3.1)式是正则化的损失函数,等式右边第一部分是模型的训练误差,第二部分是正则化项,这里的正则化项是K棵树的正则化项相加而来的。
CART树的介绍
上图为第K棵CART树,确定一棵CART树需要确定两部分,第一部分就是树的结构,这个结构将输入样本映射到一个确定的叶子节点上,记为 fk(x) 。第二部分就是各个叶子节点的值,q(x)表示输出的叶子节点序号,Wq(x) 表示对应叶子节点序号的值。由定义得:
树的复杂度定义
XGBoost法对应的模型包含了多棵cart树,定义每棵树的复杂度:
其中T为叶子节点的个数,||w||为叶子节点向量的模 。γ表示节点切分的难度,λ表示L2正则化系数。
如下例树的复杂度表示:
目标函数推导
根据(3.1)式,共进行t次迭代的学习模型的目标函数为:
泰勒公式的二阶导近似表示:
令 ft(xi) 为Δx,则(3.5)式的二阶近似展开:
其中:
l(yi,y(t-1) 表示前t-1棵树组成的学习模型的预测误差,gi和hi分别表示预测误差对当前模型的一阶导和二阶导 ,当前模型往预测误差减小的方向进行迭代。
忽略(3.8)式常数项,并结合(3.4)式,得:
通过(3.2)式简化(3.9)式:
(3.10)式第一部分是对所有训练样本集进行累加,因为所有样本都是映射为树的叶子节点,我们换种思维,从叶子节点出发,对所有的叶子节点进行累加,得:
令
Gj表示映射为叶子节点 j 的所有输入样本的一阶导之和,同理,Hj表示二阶导之和。
得:
对于第 t 棵CART树的某一个确定结构(可用q(x)表示),其叶子节点是相互独立的,Gj和Hj是确定量,因此,(3.12)可以看成是关于叶子节点的一元二次函数 。最小化(3.12)式,得:
得到最终的目标函数:
(3.14)也称为打分函数(scoring function),它是衡量树结构好坏的标准,值越小,代表这样的结构越好 。我们用打分函数选择最佳切分点,从而构建CART树。
4. XGBoost的回归树构建方法
上节推导得到的打分函数是衡量树结构好坏的标准,因此,可用打分函数来选择最佳切分点。首先确定样本特征的所有切分点,对每一个确定的切分点进行切分,切分好坏的标准如下:
Gain表示单节点obj与切分后的两个节点的树obj之差,遍历所有特征的切分点,找到最大Gain的切分点即是最佳分裂点,根据这种方法继续切分节点,得到CART树。若 γ 值设置的过大,则Gain为负,表示不切分该节点,因为切分后的树结构变差了。γ值越大,表示对切分后obj下降幅度要求越严,这个值可以在XGBoost中设定。
5. XGBoost与GDBT的区别
1)XGBoost生成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。
2)XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开,因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。
3)XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。
PS:本节只选取了与本文内容相关的几个区别。
2.5 LightGBM模型
1. 基于直方图的切分点算法
算法流程图如下:
流程解释:LightGBM通过直方图算法把连续的特征值离散化成对应的bin(可以理解成桶),然后累加每个bin对应特征的梯度值并计数,最后遍历所有特征和数据,寻找最优切分点 。下面详细解释这一过程 。
1) 直方图算法:
直方图通过分段函数把连续值离散化成对应的bin。
如分段函数为:
那么,对于连续值≥0的特征分成四个桶,特征的所有可能切分点个数降为4,即bin的个数 ,因此大大加快了训练速度。
直方图每个bin包含了两类信息,分别是每个bin样本中的梯度之和与每个bin中的样本数量,对应于流程图的表达式:
每个bin累加的梯度包含了 一阶梯度与二阶梯度 ,如下代码(LightGBM/src/io/sparse_bin.hpp):
void ConstructHistogram(int leaf, const score_t* gradient, const score_t* hessian,
HistogramBinEntry* out) const override {
// get current leaf boundary
const data_size_t start = leaf_start_[leaf];
const data_size_t end = start + leaf_cnt_[leaf];
const int rest = (end - start) % 4;
data_size_t i = start;
// use data on current leaf to construct histogram
for (; i < end - rest; i += 4) {
const VAL_T bin0 = ordered_pair_[i].bin;
const VAL_T bin1 = ordered_pair_[i + 1].