XGBoost
XGBoost 是大规模、分布式的通用梯度提升(GBDT)库,它在GB框架下实现了GBDT和一些广义线性ML算法。
XGBoost 是一种集成学习算法,属于3类常用的集成方法(Bagging,Boosting,Stacking)中的Boosting算法类别。它是一个加法模型,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。
XGBoost 对 GBDT 进行了一系列优化,比如损失函数进行了二阶泰勒展开、目标函数加入正则项、支持并行、默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但其核心思想没有大的变化。
XGBoost 是基于 GBDT 算法的工程实现,其是生成一组决策树,通过串行(boosting)依次将前一个决策树的结果作为下一个决策树的输入,不断进行拟合前一次的误差,直至结束。 而在预测中,根据样本特征得到每一个决策树的结果,将这些结果累加起来就是最终的预测结果。(此处的决策树为CART回归树)
xgboost 树的分裂方法
xgboost 树的分裂方法 -> 贪心枚举所有不同树结构:
选择一个特征,遍历该特征所有的划分点计算损失函数的最小值,利用打分函数获得其中最优结构的树;然后再选择一个特征,不断枚举不同的树结构,重复计算损失函数的最小值。同时为了限制树的生长过深,增加了阈值,只有当增益大于阈值时才进行分裂。以此类推每次在前一次的预测基础上取最优然后不断地分裂树/建树。
核心算法思想基本流程:
- 不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。
- 当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数
- 最后只需要将每棵树对应的分数加起来就是该样本的预测值。
xgboost 如何停止树的循环生成
xgboost 如何停止树的循环生成:
- 设置树的最大深度。设置超参数 max_depth,避免树太深导致过拟合。
- 分裂带来的增益小于设定阈值则停止分裂。该子树的分裂可能导致损失函数增大,无效操作,类似于预剪枝。
- 样本权重和小于设定阈值则停止建树。超参数 min_child_weight,叶子节点样本太少,避免过拟合。
树的复杂度
树的复杂度包含两部分:
- 树的叶子节点个数T。
- 树的叶子节点得分W 的 L2 模平方(对 w 进行 L2 的正则化,避免过拟合)
XGBoost与GBDT有什么不同
1. 基分类器:XGBoost的基分类器不仅支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的LR回归(分类问题)或者线性回归(回归问题)。
2. 导数信息:XGBoost对损失函数做了二阶泰勒展开,可以更为精准的逼近真实的损失函数,GBDT只用了一阶导数信息,并且XGBoost还支持自定义损失函数,只要损失函数一阶、二阶可导。
3. 正则项:XGBoost的目标函数加了正则项, 相当于预剪枝,使得学习出来的模型更加不容易过拟合。
4. 列抽样:XGBoost支持列采样,与随机森林类似,用于防止过拟合。
5. 缺失值处理:对树中的每个非叶子结点,XGBoost可以自动学习出它的默认分裂方向。如果某个样本该特征值缺失,会将其划入默认分支。
- xgboost对特征的缺失值处理是将其作为稀疏矩阵一样考虑,首先按照特征有值的序列选择最优分裂点,然后将空值分别放入左子树和右子树,计算两侧的信息增益,保留较大信息增益的分裂方向。 训练时特征无空值,而预测时出现空值默认分裂到左侧子节点。
7. 可扩展性:损失函数支持自定义,只需要新的损失函数二阶可导。
XGBoost 模型参数解释
XGBoost 模型参数解释:
- objective 目标函数。[reg:linear 线性回归, reg:logistic 逻辑回归, binary:logistic 二分逻辑回归,输出概率, binary:logitraw 二分逻辑回归,输出逻辑转换前的分数, multi:softmax 多分类,设置 num_class, multi:softprob 多分类,输出概率]
- eval_metric 验证数据的评估指标,可以添加多个。[rmse 均方根误差, mse 均方误差, mae 平均绝对误差, auc 准确率, r^2 R方, mape 平均绝对百分比误差]
- booster 基分类器。gbtree 树模型(默认)。gbliner 线模型。
- silent 是否输出中间过程。
- reg_alpha L1正则化权重。
- reg_lambda L2正则化权重。
- n_estimatores 迭代次数,即决策树个数。
- gamma 节点分裂的最小损失函数下降值。惩罚系数,值越大,模型越保守。
- eta 类似于learning_rate,减少每一步的权重。
- subsample 随机采样比例。
- colsample_bytree 训练树时,使用特征占全部特征的比例。
- early_stopping_rounds 在验证集上训练n 次,分数无提高,提前终止训练。防止过拟合。
- max_leaves 树最大叶子数。
- max_depth 树最大深度。
- min_child_weight 最小叶子权重和。
- max_leaf_nodes 树上的最大叶子节点数。
- 保持 learning_rate 和其他 booster 参数不变,调节 n_estimatores 参数。
- 调节 max_depth 和 min_child_weight 参数,首先大范围粗调参数,然后小范围微调。
- gamma 参数调优。
- subsample 和 colsample_bytree 调优。
- 正则化参数调优,选择L1 正则化或L2 正则化。
- 缩小 learning_rate ,得到最佳的 learning_rate 值。
RF(随机森林)和GBDT的区别
相同点:
都是由多棵树组成,最终的结果都是由多棵树一起决定。
不同点:
1. 集成学习:RF属于Bagging思想,而GBDT是Boosting思想
2. 偏差-方差权衡:RF不断的降低模型的方差,而GBDT不断的降低模型的偏差
3. 并行性:RF的树可以并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)
4. 最终结果:RF最终是多棵树进行多数表决(回归问题是取平均),而GBDT是加权融合
5. 数据敏感性:RF对异常值不敏感,而GBDT对异常值比较敏感
6. 泛化能力:RF不易过拟合,而GBDT容易过拟合
随机森林采用集成学习中 bagging 的思想,其特点是随机采样(放回采样),通过每次采样生成多个决策树,而这些决策树之间并无任何联系。
而当进行分类任务时,新的输入样本进行,会让每个决策树都进行分类,然后统计分类结果,将最多的分类结果作为最终的结果。
随机森林构建步骤:
- 随机抽样,构建决策树。
- 随机选取属性,做节点分裂属性。
- 重复步骤2直至无法继续分裂。
- 建立大量决策树形成随机森林。
比较LR和GBDT,说说什么情景下GBDT不如LR
先说说LR和GBDT的区别:
LR是线性模型,可解释性强,很容易并行化,但学习能力有限,需要大量的人工特征工程
GBDT是非线性模型,具有天然的特征组合优势,特征表达能力强,但是树与树之间无法并行训练,而且树模型很容易过拟合;
当在高维稀疏特征的场景下,LR的效果一般会比GBDT好。原因如下:
先看一个例子:
假设一个二分类问题,label为0和1,特征有100维,如果有1w个样本,但其中只要10个正样本1,而这些样本的特征 f1的值为全为1,而其余9990条样本的f1特征都为0(在高维稀疏的情况下这种情况很常见)。 我们都知道在这种情况下,树模型很容易优化出一个使用f1特征作为重要分裂节点的树,因为这个结点直接能够将训练数据划分的很好,但是当测试的时候,却会发现效果很差,因为这个特征f1只是刚好偶然间跟y拟合到了这个规律,这也是我们常说的过拟合。
因为现在的模型普遍都会带着正则项,而 LR 等线性模型的正则项是对权重的惩罚,也就是 w_1 一旦过大,惩罚就会很大,进一步压缩 w_1 的值,使他不至于过大。但是,树模型则不一样,树模型的惩罚项通常为叶子节点数和深度等,而我们都知道,对于上面这种`case`,树只需要一个节点就可以完美分割9990和10个样本,一个结点,最终产生的惩罚项极其之小。这也就是为什么在高维稀疏特征的时候,线性模型会比非线性模型好的原因了:带正则化的线性模型比较不容易对稀疏特征过拟合。
XGBoost为什么可以并行训练
不是说每棵树可以并行训练,XGBoost本质上仍然采用Boosting思想,每棵树训练前需要等前面的树训练完成才能开始训练。
而是特征维度的并行:在训练之前,每个特征按特征值对样本进行预排序,并存储为`block`结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个`block`结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个`block`并行计算。
注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。
xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。
这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
XGBoost为什么快?
1. 分块并行:训练前每个特征按特征值进行排序并存储为`block`结构,后面查找特征分割点时重复使用,并且支持并行查找每个特征的分割点
2. `block` 处理优化:`block`预先放入内存;`block`按列进行解压缩;将`block`划分到不同硬盘来提高吞吐
3. 候选分位点:每个特征采用常数个分位点作为候选分割点
4. CPU cache 命中优化: 使用缓存预取的方法,对每个线程分配一个连续的`buffer`,读取每个`block`中样本的梯度信息并存入连续的`buffer`中。
XGBoost中如何处理过拟合的情况?
目标函数中增加了正则项:使用叶子结点的数目和叶子结点权重的 L2 模的平方,控制树的复杂度。
设置目标函数的增益阈值:如果分裂后目标函数的增益小于该阈值,则不分裂。
设置最小样本权重和的阈值:当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值(最小样本权重和),也会放弃此次分裂。
设置树的最大深度:XGBoost 先从顶到底建立树直到最大深度,再从底到顶反向检查是否有不满足分裂条件的结点,进行剪枝。
shrinkage: 可以叫学习率或步长,为了给后面的训练留出更多的学习空间
子采样:每轮计算可以不使用全部样本,使算法更加保守
列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可)
XGBoost的优缺点
xgboost 的优点:
- 可以学习到缺失值的处理逻辑。
- 支持每轮学习时随机采样。
- 支持多种基分类器。
- 可以使用一阶、二阶导数,使得梯度下降更快。
优点:
- 精度更高: GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost 引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
- 灵活性更强: GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,使用线性分类器的 XGBoost 相当于带 和 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;
- 正则化: XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的 范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合,这也是XGBoost优于传统GBDT的一个特性。
- Shrinkage(缩减): 相当于学习速率。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。传统GBDT的实现也有学习速率;
- 列抽样: XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算。这也是XGBoost异于传统GBDT的一个特性;
- 缺失值处理: 对于特征的值有缺失的样本,XGBoost 采用的稀疏感知算法可以自动学习出它的分裂方向;
- XGBoost工具支持并行: Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是树粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第次迭代的代价函数里包含了前面次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为`block`结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个`block`结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
- 可并行的近似算法: 树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以XGBoost还提出了一种可并行的近似算法,用于高效地生成候选的分割点。
缺点:
- 虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂过程中仍需要遍历数据集;
- 预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
XGBoost和LightGBM的区别
- 树生长策略
- 分割点查找算法
- 直方图算法
- 支持离散变量
- 缓存命中率
- 并行策略-特征并行
- 并行策略-数据并行
XGB 采用`level-wise`的分裂策略:XGB对每一层所有节点做无差别分裂,但是可能有些节点增益非常小,对结果影响不大,带来不必要的开销。
LGB 采用`leaf-wise`的分裂策略:Leaf-wise是在所有叶子节点中选取分裂收益最大的节点进行的,但是很容易出现过拟合问题,所以需要对最大深度做限制 。
XGB 使用特征预排序算法,LGB使用基于直方图的切分点算法,其优势如下:
减少内存占用,比如离散为256个bin时,只需要用8位整形就可以保存一个样本被映射为哪个bin(这个bin可以说就是转换后的特征),对比预排序的exact greedy算法来说(用int_32来存储索引+ 用float_32保存特征值),可以节省7/8的空间。
计算效率提高,预排序的Exact greedy对每个特征都需要遍历一遍数据,并计算增益。而直方图算法在建立完直方图后,只需要对每个特征遍历直方图即可。
LGB 还可以使用直方图做差加速,一个节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算
XGB 在每一层都动态构建直方图, 因为XGB的直方图算法不是针对某个特定的feature,而是所有feature共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图。
LGB 中对每个特征都有一个直方图,所以构建一次直方图。
XGB 无法直接输入类别型变量因此需要事先对类别型变量进行编码(例如独热编码),
LGB 可以直接处理类别型变量。
XGB 用`block`结构的一个缺点是取梯度的时候,是通过索引来获取的,而这些梯度的获取顺序是按照特征的大小顺序的,这将导致非连续的内存访问,可能使得CPU cache缓存命中率低,从而影响算法效率。
LGB 是基于直方图分裂特征的,梯度信息都存储在一个个bin中,所以访问梯度是连续的,缓存命中率高。
XGB 每个`worker`节点中仅有部分的列数据,也就是垂直切分,每个`worker`寻找局部最佳切分点,`worker`之间相互通信,然后在具有最佳切分点的`worker`上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他`worker`才能开始分裂。
LGB 特征并行的前提是每个`worker`留有一份完整的数据集,但是每个`worker`仅在特征子集上进行最佳切分点的寻找;`worker`之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个`worker`进行切分即可。
LGB 中先对数据水平切分,每个`worker`上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个直方图算法使得`worker`间的通信成本降低一倍,因为只用通信以此样本量少的节点
XGB 中的数据并行也是水平切分,然后单个`worker`建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个`worker`上的节点分裂时会单独计算子节点的样本索引。
XGBoost使用二阶泰勒展开的目的和优势
XGBoost是以MSE为基础推导出来的,在MSE的情况下,XGBoost的目标函数展开就是一阶项+二阶项的形式,而其他类似Logloss这样的目标函数不能表示成这样形式,为了后续推导的统一,所以将目标函数进行二阶泰勒展开,就可以直接定义损失函数了,只要二阶可导即可,增强了模型的扩展性
二阶信息能够让梯度收敛的更快,拟牛顿法比SGD收敛更快,一阶信息描述梯度变化方向,二阶信息可以描述梯度变化方向是如何变化的。
L1正则化和L2正则化:
正则化是对机器学习中的原始损失函数引入额外信息,以防止过拟合和提高泛化能力方法的统称,常用的额外项:L1正则化和L2正则化。
其可以看作是损失函数的惩罚项,所谓惩罚项不过是对参数做限制。L1正则化是指权值向量w中各个元素的绝对值之和。L2正则化是指权值向量w中各个元素的平方和然后求平方根。
作用:L1正则化使得参数稀疏化,即得到的参数是一个稀疏矩阵,可以用作特征选择。L2正则化可以防止模型过拟合,L1一定程度上也可以的。
参数选择:从0开始逐步增大,在训练集上学习参数,然后在测试集上验证误差,反复试验多次,直至测试集上的误差最小。
LightGBM
LightGBM是一个梯度 boosting 框架,使用基于学习算法的决策树。 它可以说是分布式的,高效的。
从 LightGBM 名字我们可以看出其是轻量级(Light)的梯度提升机(GBM),其相对 XGBoost 具有训练速度快、内存占用低的特点。
LightGBM 是为解决GBDT训练速度慢,内存占用大的缺点,此外还提出了:
- 基于Histogram的决策树算法
- 单边梯度采样 Gradient-based One-Side Sampling(GOSS)
- 互斥特征捆绑 Exclusive Feature Bundling(EFB)
- 带深度限制的 Leaf-wise 的叶子生长策略
- 直接支持类别特征(Categorical Feature)
- 支持高效并行
- Cache 命中率优化
- 将连续的浮点特征离散成 k 个离散值,并构造宽度为 k 的直方图。
- 遍历训练数据,统计每个离散值在直方图中的累积统计量。
- 在特征选择时,只需要根据直方图的离散值,遍历寻找最优分割点。
集成学习
集成学习是指使用多种兼容的学习算法、模型来执行单个任务的技术,目的是为了更佳的预测表现。其主要可分为三大类:
- bagging 装袋。随机森林,其通过对数据集进行有样放回抽样,训练多个模型最后通过投票或平均来决定最终结果。可以用于不同的基本学习器、不仅限于决策树。
- boosting 提升。GBDT 梯度提升决策树,通过逐步拟合残差来训练多个弱学习器,最终将其组合。其核心思想是利用梯度下降来最小化损失函数,对异常值和噪声相对稳定,但容易过拟合。
Adaboost 也是一种 boosting 技术,其通过逐步调整训练样本的比重,每次都在前一个模型错误的样本上学习。通过组合多个弱学习器,以此提升整体模型的性能。对噪声敏感,容易收到异常值的影响。 - stacking 堆叠。是一种组合分类器的方法,以两层为例,第一层由基学习器组成,其输入为原始数据;第二层的模型则以第一层学习器的输出作为输入继续训练模型,从而得到完整的stacking 模型。
随机森林
随机森林是 bagging 类型算法的代表,其使用CART 树作为弱分类器,将多个不同的决策树进行组合,利用这种组合来降低单颗决策树可能带来的不确定性。
随机森林通过自助采样(boostrap)得到n个训练集,然后在单个训练集上随机选择部分特征,在部分特征来选择一个最优特征来划分决策树的左右子树,该过程中不存在剪枝过程,最后得到n个决策树。对于分类问题则按多数投票确定最终结果;对于回归问题,则由多颗决策树的预测值的平均数作为最终结果。
随机森林的随机性体现在两个方面:一个是选取样本的随机性;另一个则是选择特征的随机性。这些都会进一步增强模型的泛化能力。
优缺点:
优点:
- 训练过程可以并行化,训练速度快,效率高。
- 选取样本和选取特征的随机性,使得不容易过拟合,具有很好的抗噪声能力。
- 由于每次随机选择部分特征,所以相对于bagging计算开销小,效率更高。
- 对数据的适应能力强,可以处理连续型和离散型的变量,数据无需规范化。
- 可以输出特征的重要性,是一种不错的降维方法。
- 在某些噪声较大的问题上容易过拟合。
- 模型的可解释性较差,无法控制模型的内部运行。
- 对于较少或低维数据效果可能不太好。
随机森林评估特征重要性原理:判断每个特征在随机森林中的每棵树上的贡献,然后取平均值,最后比较特征之间的贡献大小。计算方式主要有基尼系数和袋外数据错误率。
决策树
决策树基于树的结构进行决策,学习过程包含特征选择、决策树的生成和剪枝过程。
决策树的学习过程通常是递归地选择最优特征,并用最优特征对数据集进行划分。开始时,构建根节点,选择最优特征,该特征有几种值就划分为多少个子集,每个子集递归调用此方法,返回结点,返回的结点就是上一层的子节点,直到所有特征都已经用完,或者数据集只有一维特征为止。
概述SVM
SVM 是一种二类分类模型。
它的基本思想是在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类,具体来讲,有三种情况(不加核函数的话就是个线性模型,加了之后才会升级为一个非线性模型):
- 当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
- 当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
- 当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
SVM为什么采用间隔最大化
当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强。
SVM的优缺点
优点:
- 由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优。
- 不仅适用于线性线性问题还适用于非线性问题(用核技巧)。
- 拥有高维样本空间的数据也能用SVM,这是因为数据集的复杂度只取决于支持向量而不是数据集的维度,在某种意义上避免了“维数灾难”。
- 理论基础比较完善(例如神经网络就更像一个黑盒子)。
缺点:
- 二次规划问题求解将涉及m阶矩阵的计算(m为样本的个数), 因此SVM不适用于超大数据集。(SMO算法可以缓解这个问题)
- 只适用于二分类问题。(SVM的推广SVR也适用于回归问题;可以通过多个SVM的组合来解决多分类问题)
SVM对缺失数据敏感
这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM 没有处理缺失值的策略。而 SVM 希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。
KMeans
KMeans是无监督的聚类算法,对于给定的样本集,将样本集划分为k个簇,让簇内的距离尽量小一点,簇间的距离尽量大一点。
其也有许多的变体:初始化优化KMeans++、距离计算优化elkan KMeans、大数据情况下的优化 MiniBatch KMeans。
KMeans算法流程:
- 随机选择k个样本作为簇的质心。
- 将数据集划分为k个样本集,以质心为中心,计算各个样本到质心之间的距离,根据最短位置更新质心位置。利用肘部法则确定分类数。
- 当质心无变动时即输出簇划分。计算轮廓系数,结合肘部法则确定分类数。
- 原理简单,实现容易,收敛速度快。
- 聚类效果较优。
- 可解释性强。
- 主要可调参数仅仅是簇数 k。
- k值不好把握。
- 对于不是凸的数据比较难以收敛。
- 采用迭代方法,得到的结果仅为局部最优。
- 对噪音和异常点较为敏感。
过拟合和欠拟合
过拟合是指训练误差和测试误差之间的差距太大。即模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。
欠拟合是指模型不能在训练集上获得足够低的误差。即模型复杂度低,模型在训练集上就表现很差,没法学习到数据背后的规律。
过拟合和欠拟合如何解决?
过拟合:要想解决过拟合问题,就要显著减少测试误差而不过度增加训练误差,从而提高模型的泛化能力。可以使用正则化(Regularization)方法。正则化是指修改学习算法,使其降低泛化误差而非训练误差。
常用的正则化方法根据具体的使用策略不同可分为:
- 直接提供正则化约束的参数正则化方法,如L1/L2正则化;增加正则化参数。限制模型的复杂度。
- 通过工程上的技巧来实现更低泛化误差的方法,如提前终止(Early stopping)和Dropout;Dropout,增强模型的泛化能力。
- Dropout 在训练时会随机丢弃,避免模型过拟合和提供泛化能力。而在测试时,会关闭Dropout,已得到结果的统一性。(BN(Batch Normalization)层也是如此,其在训练时对每个batch计算方差和均值进行归一化,而在测试时则不会。)
- 不直接提供约束的隐式正则化方法,如数据增强等。增大数据样本,让模型学习更多的数据。更多的学习时间和更低的学习率。
欠拟合:通过增加网络复杂度或者在模型中增加特征,这些都是很好解决欠拟合的方法。
函数的优化算法
- 随机梯度下降。每次迭代仅使用一个样本计算梯度更新参数,计算复杂度小,但不稳定和难以收敛。
- 批量梯度下降。通过计算目标函数在所有样本上的梯度来更新参数,保证每次迭代全局最优,但计算量较大。
- 自适应梯度下降。自适应调整学习率来加快收敛,常见的算法 Adam。
优化器是用于更新模型参数以最小化训练误差的方法。其将损失函数的梯度作为输入,并根据该梯度动态调整模型中参数的值。
不同的优化器对于不同模型的性能和收敛速度影响很大,不同的优化器适用于不同的模型和数据集。
- 随机梯度下降算法 GSD。从样本集中抽出一部分样本(随机抽出)计算梯度,用于梯度更新。训练时间快,但不是全局最优解。
- 自适应矩估计优化器 Adam。包含两个关键算法:RMSprop 学习率调整(在模型学习过程中不断调整学习率,避免过大或过小)和梯度估计修正(动量法,使用最近一段时间的平均梯度代替当前的随机梯度可以缓解参数更新方向变化,提高优化速度)。
- 自适应梯度优化器 Adagrad。每次更新参数时,学习率逐参数的除以历史梯度平方和的平方根,动态更新每个参数的学习率。
激活函数
激活函数:
- sigmoid。将输入x压缩到(0,1)区间内。
- relu。将输入x压缩到(0,+∞)区间内,所有小于0的数都会被归为0。梯度弥散(梯度长时间不更新或训练停止不动)很有用。
- tanh。将输入x压缩到(-1,1)区间内。
数据异常波动归因分析
数据走势会在一定范围内浮动,不同的指标其浮动范围会有差异。业务高速期时,指标每日波动幅度较大;业务在平稳期时,指标每日波动较小;统计度越粗,数据量越大,统计结果的波动性也越小。因此对于不同指标需要用不同的标准
去衡量波动是否存在异常。
指标监控的常用方法:
- 基于实际业务经验设置阈值。
- 基于数据结果进行统计分析。
- 使用算法进行建模分析。
- 横向归因分析。指对于组合型的指标对过程指标进行拆解,分析每个过程指标的波动影响因素,再对多个影响因素整合分析。
- 纵向归因分析。指对指标的通过维度下钻,分析各个子指标对指标的贡献程度,以此分析波动的影响因素。
评分卡建模全流程
评分卡建模全流程:
- 数据准备:收集并清晰需要建模的数据,包括缺失值处理、异常值处理、变量转换等。
- 变量选择:通过特征分析、相关性分析、变量筛选方法(IV、WOE、PSI、相关系数)等,选择具有预测能力的变量作为建模输入。
- 数据切分:将数据集切分为训练集、验证集,用于模型训练和验证。
- 建立评分卡模型:根据业务需求选择适当的分类算法,如逻辑回归、决策树等,建立评分卡模型。在建模过程中,需要进行特征工程、变量转换、变量融合等步骤。
- 模型评估和验证:使用验证集对模型进行评估,包括计算评分卡的各项指标,如准确率、精确率、召回率、F1分数等。根据评估结果对模型进行调优和验证。
风控模型常用评估指标
- 混淆矩阵指标:精准率、查全率、假正率。当模型最终转换为规则时,一般使用这三个指标来衡量规则的有效性。要么注重准确率、要么注重查全率,二者不可兼而得之。
- ROC曲线和AUC值。ROC曲线是一种对查全率和假正率的权衡,具体方法是在不同阈值下以查全率作为纵轴,假正率作为横轴绘制的曲线。曲线越靠近左上角,意味着正例优先于负例,模型的整体表现也越好。AUC是ROC曲线下的面积,AUC面积越大,即模型能力越好。
- KS值。用于区分预测正负样本分隔程度的评价指标,ks值越大,表示模型区分正负样本能力越好。KS值不是越高越好,越高表示数据有点极端。
- 对变量进行分箱。
- 计算每个分箱区间的好账户数(goods)和坏账户数(bads)
- 计算每个分箱区间内的累积好账户数占总好账户数比率(cum_good_rate)和累积坏账户数占总坏账户数比率(cum_bad_rate)
- 计算每个分箱区间累积坏账户占比与累积好账户占比差的绝对值,得到 KS 曲线。ks = |cum_good_rate - cum_bad_rate|
- 在这些绝对值中取最大值,得到此变量最终的 KS 值。
- 基尼系数。其横轴是根据分数(概率)由高到低的好用户占总的好用户比例,纵轴是根据分数(概率)从高到低坏用户占总的坏用户的比例。总体基尼曲线会呈现向下弯圈的形式,向下突出的半月形面积除以下方三角形的面积即基尼系数。基尼系数越大,表示模型对于好坏用户的区分能力越好。
- 准确率(accuracy)是指模型正确预测样本数与样本总数之比,其衡量模型对所有分类样本的分类准确程度。准确率 =(真阳性 + 真阴性)/(真阳性 + 真阴性 + 假阳性 + 假阴性)。
精确率(precision)是指模型预测正例的样本所占比例。精确率 = 真阳性 / (真阳性 + 假阳性)。
召回率(recall)是指模型预测为正样本与所有正样本的比率,其衡量的是模型识别正样本的能力。recall = TP / (TP + FN)。
- Lift 指数是指模型对坏样本的预测能力相比随机选择的倍数。当 Lift 大于1 时说明模型优于随机选择。
- 将样本分箱。
- 计算每个分箱内样本的坏样本数占总坏样本数的占比(bad_rate)与整体样本占总样本数的占比(total_rate)的比率。
- 计算累积坏样本占比(cum_bad_rate)与累积总样本占比(total_rate)的比率。
- Gain 是描述整体精准度的指标。
KS 值计算方法:
KS 检验是一种根据样本来推断总体是否服从某种分布的方法,因此可以检验两个经验分布是否服从同一总体分布。如果得到的 p-value 比指定的显著水平(5%)小,那么就可以拒绝原假设,人物两个分布不服从同一总体分布。
计算方式:
交叉验证
重复使用数据,将样本数据进行划分,组合不同的训练集和测试集,某次训练集中的样本可能是下次测试集中的样本,即交叉。
其目的在于评估算法在特定数据集上训练后的泛化性能,比单次划分训练集和测试集的方法更加稳定、全面。
常用交叉验证方法:
- 标准k折交叉验证:k为自定义的数字,通常选择5或者10。
- 分层k折交叉验证:每个折中的类别比例与整个数据集类别比例相同,这样对泛化性能做出更可靠的估计。
- 留一法交叉验证:每次划分时,把单个数据点作为测试集,如果数据量小,能得到更好的估计结果,数据量很大时则不适用。
Swap set
1000 accept 40% 600 reject
300 no overdue 75%
100 overdue 25%
通过率、坏账率
通过率提升,坏账率不变
500 accept 50%
375 no overdue 75%
125 overdue 25%
通过率不变,坏账率降低
400 accept 40%
320 no overdue 80%
80 overdue 20%
swap set - 用通过的坏人换被拒绝的好人。
新模型从旧模型通过的人群中 swap out 出6个人(3 bad,3 good),swap in 入6个人(5 good, 1 bad)。在该交换的过程总,通过总人数不变(通过率也不变),那最终的坏账率会降低。
通过计算换入换出前后的通过率、坏账率差异即可知道模型的效果。
使用方式:同时上线新旧模型,旧模型打分并生效,新模型仅打分不生效。一段时间后就可得到其贷后表现,此时观察新旧模型的效果即可。
使用拒绝推断
100人 40人 accept 60人 reject
30 no overdue
10 overdue
评分卡模型(100人)
是否逾期模型(40人)
被拒绝的60人中选取[530,570] 分之间的人使用是否逾期模型预测其是否逾期,获取对应的是否逾期标签后与之前的40人一起重新训练评分卡模型和是否逾期模型。
此时再拿出[530,570]以外的人群重复上述步骤,直至某个指标符合预期。
否决报表
在一般场景中,目前主采用模型为主,人工为辅的审批策略,而在个别情况下会出现模型通过,人工拒绝的情况,对于这种问题需要详细记录否决原因,便于追溯案件和可解释性。
对于人工否决中的原因通过分析即可得到重要的特征。
举个例子,信用卡消费地点和生活常住地点不一致,有可能信用卡消费造假,可以增加特征“消费地点与生活地点是否一致”来优化模型。
拒绝推断
拒绝推断是一种对拒绝用户进行推理归纳,从而得到该样本标签的方法。
行业内的拒绝推断通常是指通过数据分析方法修正模型的参数估计偏差。拒绝推断的主要意义在于,希望修正建模样本和实际全量样本之间的差异,本质上降低模型估计参数的偏差。
常见的拒绝推断方法有三种:
- 数据验证
- 标签分裂
- 同生表现,利用当前产品的拒绝原因、平台其他产品线的贷后表现、其余机构的标注信息定义拒绝样本的伪标签。
- 多规则交叉,由于规则通常使用IV较高的变量,其对于负样本的挑选精度较高,然而利用单规则阈值对样本进行的标记与较低模型分直接标记无本质区别,因此通常使用多条关键规则进行交叉组合,将同时多条规则的用户标记为负样本。
- 数据推断
- 已知好坏标签样本(Know Good Bad, KGB)。准入模型允许通过的样本集,已知标签。由 KGB 样本训练的模型也叫 KGB模型。
- 未知标签(Inferred Good Bad, IGB)。准入模型拒绝的样本集,未知标签。由于 IGB 样本没有标签,通常不会用于训练模型,在部分方法中可能会生成伪标签,从而参与建模过程。
- 全量样本(All Good Bad,AGB)。包含 KGB 和 IGB 两部分的全量样本集,由该部分数据训练得到的模型也称为 AGB 模型。
- 硬截断法
- 模糊展开法
- 重新加权法
- 外推法
- 迭代再分类法
数据验证也被称为下探,即从拒绝样本中选取部分样本进行放款,以获得该部分样本的真实标签,从而带入评分卡模型进行监督学习。
数据验证是最有效且实施起来最简单的一种拒绝推断方法,通常为获取较为丰富的拒绝样本标签,将当前模型分低于通过阈值的客群,按照预测分值排序后,等频划分为10箱,然后从中抽取部分拒绝样本进行放款实验。
数据验证的缺点也是显而易见的,其本身需要一定周期才能得到结果,且为了后续将验证样本用于后续模型建模中,数据验证方案需要提前整个贷款周期,再加上逾期观察周期,预先进行实施;其次拒绝样本的负样本占比是明显高于通过样本的,因此该方法会对平台造成一定的收益损失;
获取该部分样本的信息,对未来的模型是有很大的帮助,因此需要在短期收益和长期风险之间选择一个平衡点。
标签分裂方法期望将标签定义方法拆分为多个和原始标签定义方法强相关的子方法。
常见的标签分类方法如下:
标签分裂的用途较广,其本质上是一种基于业务思想的方法,在实际使用中限制条件也很多。
拒绝推断场景有如下三个概念:
数据推断常见的方法:
一种常见思路是直接使用 KGB 模型在拒绝样本上做预测,并将低分版本(如分数最低的20%样本)认为是负样本,代入模型进行估计,其余拒绝样本全部视为灰色样本,不予考虑。
硬截断法假设【逾期】与【放款】之间相互独立。
模糊展开法将每条拒绝样本复制为不同类别、不同权重的两条。假设当前有一个拒绝样本 KGB 模型预测其为负样本的概率为0.8,为正样本的概率为0.2,则分别生成两条新样本,第一个样本标签为负,权重为0.8;第二个样本标签为正,权重为0.2,将上述两条样本分别带入 AGB 模型进行训练。
与硬截断法同样的,假设【逾期】与【放款】之间相互独立。
模糊展开法通过权重调整、修正模型的误差,其效果与 AGB 模型的识别能力相关性较高,使用权重进行调整的方法还有重新加权法。
重新加权法不使用拒绝样本进行学习,而仅利用其样本分布特点,调整原 KGB 数据集分布权重。在重新加权法中,首先使用 KGB 模型获得 AGB 样本的逾期概率,并将逾期概率升序排序;接着等频分箱为10等份,分别计算每个分箱中的负样本占比;然后将负样本占比乘以当前箱中的权重修正项,获取 AGB 样本中负样本占比的边际期望;最后将权重带入建模过程,得到新的 KGB 模型作为最终模型。
除了基于数据分析修正模型偏差外,还可以根据经验风险因子调控,引入人工修正。
外推法根据 KGB 模型在拒绝样本上的预测结果,通过人工指定经验风险因子,获取不同分组上的负样本占比,然后按照正负样本的比例,为无标签拒绝样本随机赋值为0或1。
经验风险因子表示拒绝推断好坏比与放贷已知好坏比的倍数。数值越大,表示拒绝样本越坏,通常取值在[2,4]之间。假设 AGB 样本使用 AGB 模型预测获得逾期概率,按照逾期概率升序排序后等频划分为10箱,则每箱样本中的负样本占比应逐箱递增,因此定义其经验风险逐箱递增。从第1箱初始IK为2,逐步递增到第10箱IK为4,每箱之间增加的数值相等,恒等于0.2。
其缺点在于随机赋值具有较大的偶然性,因此可以在每箱中引入硬截断法,即不按照正负样本比例进行随机赋值,而是按照 AGB 模型的预测概率排序后选择百分比阈值进行截断。
前几种方法存在一个问题:无法保证修正偏差后的模型依旧是有效的。
迭代再分类法是一种通过多次迭代,保证模型效果有效且收敛的拒绝推断方法。其基本思想是先使用硬截断法为拒绝样本的标签赋值;随后将具有伪标签的样本加入原 KGB 模型进行学习,得到部分标签失真的 AGB 模型;接着使用 AGB 模型获取拒绝样本的逾期概率;之后再次使用硬截断法不断重复上述过程,直至某个指标收敛。迭代再分类法的思路是启发式的,可以使用任何指标作为模型是否收敛的依据。
https://zhuanlan.zhihu.com/p/162724703
https://zhuanlan.zhihu.com/p/88624987
https://www.cnblogs.com/cgmcoding/p/14034228.html
模型特征漂移
模型漂移的本质是指目标变量与自变量之间的关系随时间发生了变化,而由于这种漂移会导致模型变得不稳定,并且随时间推移预测会出错。
模型漂移可以分为两类:
- 概念漂移。当目标变量本身的统计属性发生变化时,就会发生这种情况。
- 数据漂移。同样地当基础变量发生变化时,则模型必然会失效。
对于自变量随时间变化的情况,数据权重是一个很不错的选择,给予最近数据较高的权重,过去数据较小的权重,确保模型的鲁棒性,也有助于减少模型漂移。
数据不平衡
在训练二分模型时,经常遇到正负样本数据不均衡问题,为了模型具有在正负样本上具有足够的准确率和召回率。
主要有两种解决方法:
- 基于数据
- 随机采样。最简单的处理方式就是随机采样。采样分为过采样和欠采样:
- SMOTE算法。对少数样本集中的每个样本x,在其中的k近邻中随机选择一个样本 y;然后在x,y 连线上随机选择一点生成新的样本。降低过拟合,但容易产生边缘化问题。
- Balance Cascade 算法。级联结构,在每一级中从多数类中随机抽取子集,用子集与少数类训练该级的分类器;然后将能够正确预测的样本剔除,继续下一级操作,重复若干次得到级联结构;最终的输出结果也就是各级分类器结果的融合。
- 基于算法
- 改变模型的训练函数,给予不同类别的不同权重来纠正这种不平衡。
- 当数目极度不均衡时,可以将问题转化为单类学习、异常检测。
过采样是从少数样本中随机重复放回抽取样本,以此得到更多样本。缺点容易过拟合。
欠采样则相反,只从多数样本中随机选取较少样本(有放回和无放回)。缺点欠拟合,丢失部分数据信息。