金融风控训练营Task4学习笔记
本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为: https://tianchi.aliyun.com/specials/activity/promotion/aicampfr.
一、学习知识点概要
逻辑回归模型;树模型;集成模型;
基于bagging思想的集成模型;
随机森林模型;
基于boosting思想的集成模型;
XGBoost模型;
LightGBM模型;
CatBoost模型;
模型对比与性能评估;
模型调参;
二、学习内容
(一)逻辑回归模型
1.sigmoid函数
如果线性回归的结果输出是一个连续值,而值的范围是无法限定的,那有没有办法把这个结果值映射为可以帮助我们判断的结果呢。
找到sigmoid函数:
从函数图上可以看出,函数y=g(z)在z=0的时候取值为1/2,而随着z逐渐变小,函数值趋于0,z逐渐变大的同时函数值逐渐趋于1,而这正是一个概率的范围。所以定义线性回归的预测函数为Y=WTX,那么逻辑回归的输出Y= g(WTX),其中y=g(z)函数正是上述sigmoid函数(或者简单叫做S形函数)。
2.判定边界
逻辑回归能够解决分类问题,首先就需定义判定边界,简单来说就是用以对不同类别的数据分割的边界,边界的两旁应该是不同类别的数据。不管是直线、圆或者是曲线,都能比较好地将图中的两类样本分割开来,这就是我们的判定边界。
看回sigmoid函数:
当 g(z)≥0.5 时, z≥0 ;
对于 hθ (x)=g(θTX)≥0.5, 则 θTX≥0, 此时意味着预估y=1;
反之,当预测y = 0时, θTX<0;
所以我们认为θTX =0是一个决策边界,当它大于0或小于0时,逻辑回归模型分别预测不同的分类结果。
理论上说,只要我们的 hθ (x)设计足够合理,准确的说是g(θTx)中θTx足够复杂,我们能在不同的情形下,拟合出不同的判定边界,从而把不同的样本点分隔开来。(hθ (x)表示y为1时的概率)
接下来看一个例子:
当x12+x22≥1时,我们判定y=1,这时的决策边界是一个圆形
3.代价函数
合适的参数θ使得θTx=0成为很好的分类判定边界,那么合适的参数θ使得θTx=0成为很好的分类判定边界呢?
代价函数(Cost Function),是一种衡量我们在这组参数下预估的结果和实际结果差距的函数。代价函数是一个如下图所示,碗状结构的凸函数,这样我们算法求解到局部最低点,就一定是全局最小值点。
找到合适的代价函数:
当y=1的时:
如果我们的类别y = 1, 而判定的 hθ (x)=1,则Cost = 0,此时预测的值和真实的值完全相等,代价本该为0;而如果判断hθ(x)→0,代价->∞,这很好地惩罚了最后的结果。
对于y=0的情况也同样合理。
4.梯度下降
梯度下降算法:调整参数θ使得代价函数J(θ)取得最小值。
从直观上说,就是我们在凸函数上取一个初始值,然后移动这个值一步步靠近最低点的过程。
用迭代公式表示出来的最小化 J(θ ) 的梯度下降算法如下:
5.代码实现的部分函数
(具体代码可在学习链接中查看)
1.shape():查看数据有多少行多少列
import numpy as np
a = np.array([0,1,2,3,4,5,6,7,8,9]) #一维数组
print(a.shape[0]) #值为10,因为有10个数据
print(a.shape[1]) #错误,超出数据范围
a = np.array([[0,1,2,3,4],[5,6,7,8,9]]) #二维数组
print(a.shape[0]) #值为2,最外层矩阵有2个元素,2个元素还是矩阵(二维)。
print(a.shape[1]) #值为5,内层矩阵有5个元素。
print(a.shape[2]) #错误,超出数据范围
2.reshape():数组array中的方法,作用是将数据重新组织
import numpy as np
a=np.array([0,1,2,3,4,5,6,7,8,9])#创建一维数组
print(a)
b=a.reshape((2,5))
print(b)
#新生成数组和原数组公用一个内存,不管改变哪个都会互相影响
a[0]=111
print(a)
print(b)
#运行结果
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4]
[5 6 7 8 9]]
[111 1 2 3 4 5 6 7 8 9]
[[111 1 2 3 4]
[ 5 6 7 8 9]]
3.transpose():原理根据数组的维度决定的
二维:调换数组的行列值的索引值,相当于矩阵的转置,转置就是把行与列相互调换位置
arr = np.arange(15).reshape((3, 5))
arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>> arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
三维:相当于有X轴,Y轴,Z轴,三个轴之间的相互转换
arr = np.arange(24).reshape((2, 3, 4))
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
4.scatter():画图工具
5.zeros():生成零矩阵
使用方法:(引用自- https://www.cnblogs.com/kunyuanjushi/p/6124280.html.
B=zeros(n):生成n×n全零阵。
B=zeros(m,n):生成m×n全零阵。
B=zeros([m n]):生成m×n全零阵。
B=zeros(d1,d2,d3……):生成d1×d2×d3×……全零阵或数组。
B=zeros([d1 d2 d3……]):生成d1×d2×d3×……全零阵或数组。
B=zeros(size(A)):生成与矩阵A相同大小的全零阵。
ones():生成1 矩阵
6.append(): 在被选元素的结尾(仍然在内部)插入指定内容或在列表末尾添加新的对象
def func(ls=[0]):
ls.append(1)
return ls
a=func()
b=func()
print(a,b)
#运行结果
[0, 1, 1] [0, 1, 1]
(二)决策树模型
1.决策树构建:ID3算法
2.决策树可视化
3.使用决策树进行分类预测
4.决策树的存储和读取
这里只给出大纲,具体内容点击链接: https://blog.csdn.net/c406495762/article/details/76262487.
(三)GBDT模型
(学习链接: https://zhuanlan.zhihu.com/p/4514589
1.CART树
CART树是一个决策树模型,是一棵二分树,每个节点特征取值为“是”或“不是”。这样的决策树递归的划分每个特征,并且在输入空间的每个划分单元中确定唯一的输出。
1.1 回归树生成
输入:训练数据集D={(x1,y1),(x2,y2),…,(xn,yn)}
输出:一颗回归树
一个回归树对应的输入空间的一个划分,假设已经将输入空间划分为M个单元R1,R2,R3…Rm,并且每个单元都有固定的输出值cm,其中I为判别函数。
当输入空间确定时,可以用平方误差来表示回归树在训练数据上的预测误差:
则知道单元Rm上的最优输出值就是Rm内所有样本xi对应yi的均值。(可以自己求导推一推)
问题是如何对输入空间进行划分?这里和决策树一样,选择的是遍历所有特征,选择最优的特征作为划分,具体的方法是选择第j个变量x^j和它的取值s作为切分变量与切分点,并定义两个区域
R1 = {x|x^j<=s} and R2 = {x|x^j > s}
如果特征是连续变量,那么方法可以是
R1 = {x|x^j==s} and R2 = {x|x^j != s}
然后寻找最优的变量j和最优切分点s,具体的求解
遍历所有j,s找到本次的最佳划分区域,然后对每个区域递归这个划分过程,直到满足条件为止。
如果是分类树的话,一般定义目标函数为基尼指数或者交叉信息熵。
1.2 回归树剪枝
根据奥卡姆剃刀原理,为了使模型有更准确的预测,我们要让模型变得尽量简单,对于决策树来说就是要做剪枝处理。
剪枝的损失函数可以如下表示:
2. GBDT模型
GBDT模型是一个集成模型,是很多CART树的线性相加。
GBDT模型可以表示为以下形式,约定ft(x)表示第t轮的模型,ht(x)表示第t颗决策树,模型定义如下:
提升树采用前向分步算法,第t步的模型由第t-1步的模型加上一棵树形成,可以写成:
怎么确定第t步该加上一颗什么样的树,Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。即每次需要拟合的是模型的负梯度。
损失函数:
第t轮的第i个样本的损失函数的负梯度表示为:
从而可以得到:
利用(xi, rti) (i=1,2,…m),我们可以拟合一颗CART回归树,得到了第t颗回归树,其对应的叶节点区域Rtj, j=1,2,…,J。其中J为叶子节点的个数。
针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值ctj如下(yi是真实值,不是残差)
(四)XGBoost模型
由于篇幅过长,且结合具体链接会比较容易理解,这里就不赘述了,大家可以点击链接记性具体学习:https://blog.csdn.net/wuzhongqiang/article/details/104854890
文章的最后根据模型建立步骤,也提供了部分代码进行参考。
(五)LightGBM模型
(六)Catboost模型
(七)模型对比与性能评估
1.逻辑回归
优点:
- 训练速度较快,分类的时候,计算量仅仅只和特征的数目相关;
- 简单易理解,模型的可解释性非常好,从特征的权重可以看到不同的特征对最后结果的影响;
- 适合二分类问题,不需要缩放输入特征;
- 内存资源占用小,只需要存储各个维度的特征值;
缺点:
- 逻辑回归需要预先处理缺失值和异常值【可参考task3特征工程】;
- 不能用Logistic回归去解决非线性问题,因为Logistic的决策面是线性的;
- 对多重共线性数据较为敏感,且很难处理数据不平衡的问题;
- 准确率并不是很高,因为形式非常简单,很难去拟合数据的真实分布;
2.决策树模型
优点:
- 简单直观,生成的决策树可以可视化展示
- 数据不需要预处理,不需要归一化,不需要处理缺失数据
- 既可以处理离散值,也可以处理连续值
缺点:
- 决策树算法非常容易过拟合,导致泛化能力不强(可进行适当的剪枝)
- 采用的是贪心算法,容易得到局部最优解
3.集成模型集成方法
集成方法主要包括Bagging和Boosting,Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个更加强大的分类。两种方法都是把若干个分类器整合为一个分类器的方法,只是整合的方式不一样,最终得到不一样的效果。常见的基于Baggin思想的集成模型有:随机森林、基于Boosting思想的集成模型有:Adaboost、GBDT、XgBoost、LightGBM等。
- 样本选择上:
Bagging方法的训练集是从原始集中有放回的选取,所以从原始集中选出的各轮训练集之间是独立的;而Boosting方法需要每一轮的训练集不变,只是训练集中每个样本在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整 - 样例权重上:
Bagging方法使用均匀取样,所以每个样本的权重相等;而Boosting方法根据错误率不断调整样本的权值,错误率越大则权重越大 - 预测函数上:
Bagging方法中所有预测函数的权重相等;而Boosting方法中每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重 - 并行计算上:
Bagging方法中各个预测函数可以并行生成;而Boosting方法各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
4.模型评估方法
对于模型来说,其在训练集上面的误差我们称之为训练误差或者经验误差,而在测试集上的误差称之为测试误差。
对于数据集的划分,我们通常要保证满足以下两个条件:
- 训练集和测试集的分布要与样本真实分布一致,即训练集和测试集都要保证是从样本真实分布中独立同分布采样而得;
- 训练集和测试集要互斥
划分方法:
(1)留出法:直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。在划分的时候要尽可能保证数据分布的一致性,即避免因数据划分过程引入额外的偏差而对最终结果产生影响。为了保证数据分布的一致性,通常我们采用分层采样的方式来对数据进行采样。
(2)k折交叉验证:通常将数据集D分为k份,其中k-1份作为训练集,剩余的一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。交叉验证中数据集的划分依然是依据分层采样的方式来进行。(其k值的选取往往决定了评估结果的稳定性和保真性,通常k值选取10;当k=1的时候,我们称之为留一法)
(3)自助法:使用有放回重复采样的方式进行数据采样,每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。
数据集划分总结
对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;
对于数据集小且难以有效划分训练/测试集时使用自助法; 对于数据集小且可有效划分的时候最好使用留一法来进行划分,因为这种方法最为准确
5.模型评价标准(见Task1)
(八)模型调参
1. 贪心调参
先使用当前对模型影响最大的参数进行调优,达到当前参数下的模型最优化,再使用对模型影响次之的参数进行调优,如此下去,直到所有的参数调整完毕。
这个方法的缺点就是可能会调到局部最优而不是全局最优,但是只需要一步一步的进行参数最优化调试即可,容易理解。
这里列举一下日常调参过程中常用的参数和调参顺序:
①:max_depth、num_leaves ②:min_data_in_leaf、min_child_weight
③:bagging_fraction、 feature_fraction、bagging_freq
④:reg_lambda、reg_alpha ⑤:min_split_gain
2. 网格搜索
sklearn 提供GridSearchCV用于进行网格搜索,只需要把模型的参数输进去,就能给出最优化的结果和参数。相比起贪心调参,网格搜索的结果会更优,但是网格搜索只适合于小数据集,一旦数据的量级上去了,很难得出结果。
3.贝叶斯调参
贝叶斯调参的步骤如下:
- 定义优化函数(rf_cv)
- 建立模型
- 定义待优化的参数
- 得到优化结果,并返回要优化的分数指标
三、思考与总结
在刚开始看各个模型的代码 的时候,因为代码很多,也涉及到了许多不认识的函数等,所以在学习的时候也查阅了许多关于函数的资料,将这些代码自己运行一遍,也会帮助自己理解这些代码的作用,可在代码后加一些注释,以帮助自己的理解。
参考文献:https://www.cnblogs.com/caizhou520/p/11227986.html.