互联网金融风控面试算法知识(二)

       资料来源于网络搜集和汇总,把算法知识的总结放在业务知识后面也是为了说明实际工作业务落地应用的重要性大于算法创新。面试题依然是适用于3年经验以内的初学者,希望大家在学习算法的同时不要一心只研究算法而脱离了业务,要真正做到数据驱动业务。先附上之前对算法的一些总结:

1.常用机器学习算法的原理推导

2.评分卡的一些理论知识

一、什么是集成学习?集成学习有哪些框架?简单介绍各个框架的常用算法。

       集成学习是一种优化手段和策略,通常是结合多个简单的弱分类器来集成模型组,去做更可靠的决策。一般的弱分类器可以是决策树,SVM,kNN等构成,其中的模型可以单独来训练,并且这些弱分类器以某种方式结合在一起去做出一个总体预测。集成学习就是找出哪些弱分类器可以结合在一起,以及如何结合的方法。目前集成学习主要有bagging,boosting,stacking三种:

bagging:对训练集进行随机子抽样,对每个子训练集构建基模型,对所有的基模型的预测结果进行综合产生最后的预测结果。如果是分类算法,则用多数投票法确定最终类别,如果是回归算法,则将各个回归结果做算术平均作为最终的预测值。常用的bagging算法:随机森林

boosting:训练过程为阶梯状,基模型按照次序进行训练(实际上可以做到并行处理),先给定一个初始训练数据,训练出第一个基模型,根据基模型的表现对样本进行调整,在之前基模型预测错误的样本上投入更多的关注,然后用调整后的样本训练下一个基模型,重复上述过程N次,将N个基模型进行加权结合,输出最后的结果。常用的算法有GBDT,XGBOOST等。

stacking:是一种组合分类器的方法,以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练(一般用LR进行回归组合),从而得到完整的stacking模型。要得到stacking模型,关键在于如何构造第二层的特征,构造第二层特征的原则是尽可能的避免信息泄露,因此对原始训练集常常采用类似于K折交叉验证的划分方法。各个基模型要采用相同的Kfold,这样得到的第二层特征的每一折(对应于之前的K折划分)都将不会泄露进该折数据的目标值信息 ,从而尽可能的降低过拟合的风险。

二、简单描述一下模型的偏差和方差?bagging和boosting主要关注哪个?

       偏差描述的是预测值与真实值的差距,偏差越大,越偏离真实数据。

       方差描述的是预测值的变化范围,离散程度,方差越大,数据分布越分散。

       bagging主要关注的是降低方差,boosting主要关注降低偏差。因为bagging采取分而治之的策略,对训练样本多次采样,训练多个模型做综合,减小分类器的方差;boosting通过逐步聚焦于基分类器分错的样本,减小集成分类器的偏差。

三、简述一下随机森林的原理,随机森林的构造过程。

       随机森林是bagging算法的代表,使用了CART树作为弱分类器,将多个不同的决策树进行组合,利用这种组合来降低单棵决策树的可能带来的片面性和判断不准确性。对于普通的决策树,是在所有样本特征中找一个最优特征来做决策树的左右子树划分,而随机森林会先通过自助采样的方法(bootstrap)得到N个训练集,然后在单个训练集上会随机选择一部分特征,来选择一个最优特征来做决策树的左右子树划分,最后得到N棵决策树,对于分类问题,按多数投票的准则确定最终结果,对于回归问题,由多棵决策树的预测值的平均数作为最终结果。随机森林的随机性体现在两方面,一个是选取样本的随机性,一个是选取特征的随机性,这样进一步增强了模型的泛化能力。

四、随机森林的优缺点?

优点:

1.训练可以高度并行化,训练速度快,效率高。

2.两个随机性的引入,使得随机森林不容易过拟合,具有很好的抗噪声能力。

3.由于每次不再考虑全部的特征属性,二是特征的一个子集,所以相对于bagging计算开销更小,效率更高。

4.对于数据的适应能力强,可以处理连续型和离散型的变量,数据无需规范化。

5.可以输出变量的重要程度,被认为是一种不错的降维方法。

缺点:

1.在某些噪声较大的分类问题和或回归问题上容易过拟合。

2.模型的可解释性比较差,无法控制模型内部的运行。

3.对于小数据或者低维数据,效果可能会不太好。

四、随机森林为什么不容易过拟合?

       随机森林由很多棵树组合在一起,单看每一棵树可以是过拟合的,但是既然是过拟合,就会拟合到非常小的细节,随机森林通过引入随机性,让每一棵树过拟合的细节不同,再将这些树组合在一起,过拟合的部分就会抵消掉,不过随机森林还是可能会出现过拟合的现象,只是出现的概率相对较低。

五、随机森林输出特征重要性的原理?

       随机森林对于特征重要性的评估思想:判断每个特征在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。其中关于贡献的计算方式可以是基尼指数或袋外数据错误率。

1.基于基尼系数:如果特征X出现在决策树J中的结点M,则计算节点M分枝前后的Gini指数变化量,假设随机森林由N棵树,则计算N次的Gini系数,最后将所有的Gini系数做一个归一化处理就得到了该特征的重要性。

2.基于袋外数据错误率:袋外数据指的是每次随机抽取未被抽取达到的数据,假设袋外的样本数为O,将这O个数据作为测试集,代入已生成好的随机森林分类器,得到预测的分类结果,其中预测错误的样本数为X,则袋外数据误差为X/O,这个袋外数据误差记为errOOB1,下一步对袋外数据的特征A加入噪声干扰,再次计算袋外误差errOOB2,假设随机森林由N个分类器,则特征A的重要性为:sum(errOOB2-errOOB1)/N,其依据就是,如果一个特征很重要,那么其变动后会非常影响测试误差,如果测试误差没有怎么改变,则说明特征A不重要。

六、简单描述一下Adaboost的算法原理和流程。

       Adaboost基于分类器的错误率分配不同的权重系数,最后得到累加加权的的预测结果。算法流程:

1.给数据中每一个样本一个权重,若有N个样本,则每个样本的权重为1/N.

2.训练数据的每一个样本,得到第一个分类器。

3.计算该分类器的错误率,根据错误率计算给分类器分配的权重。

4.将第一个分类器分错的样本权重增加,分对的样本权重减少,然后再用新的样本权重训练数据,得到新的分类器。

5.迭代这个训练步骤直到分类器错误为0或达到迭代次数。

6.将所有的弱分类器加权求和,得到分类结果(分类器权重),错误率低的分类器获得更高的决定系数,从而在数据进行预测起关键作用。

七、Adaboost的优点和缺点?

优点:

1.分类精度高,构造简单,结果可理解。

2.可以使用各种回归分类模型来构建弱学习器,非常灵活。

3.不容易过拟合。

缺点:

1.训练时会过于偏向分类困难的数据,导致Adaboost容易受噪声数据干扰。

2.依赖于弱分类器,训练时间可能比较长。

八、简单说一下GBDT的原理。

       GBDT是boosting的一种方法,主要思想是每一次建立单个分类器时,是在之前建立的模型的损失函数的梯度下降方向。损失函数越大,说明模型越容易出错,如果我们的模型能让损失函数持续的下降,则说明我们的模型在持续不断的改进,而最好的方式就是让损失函数在其梯度的方向上下降。

       GBDT的核心在于每一棵树学的是之前所有树结论和的残差,残差就是真实值与预测值的差值,所以为了得到残差,GBDT中的树全部是回归树,之所以不用分类树,是因为分类的结果相减是没有意义的。

       Shrinkage(缩减)是 GBDT 的一个重要演进分支,Shrinkage的思想在于每次走一小步来逼近真实的结果,要比直接迈一大步的方式更好,这样做可以有效减少过拟合的风险。它认为每棵树只学到了一小部分,累加的时候只累加这一小部分,通过多学习几棵树来弥补不足。这累加的一小部分(步长*残差)来逐步逼近目标,所以各个树的残差是渐变的而不是陡变的。

       GBDT可以用于回归问题(线性和非线性),也可用于分类问题。

九、为什么对于高维稀疏特征不太适合用GBDT?

       GBDT在每一次分割时需要比较大量的特征,特征太多,模型训练很耗费时间。

       树的分割往往只考虑了少部分特征,大部分的特征都用不到,所有的高维稀疏的特征会造成大量的特征浪费。

十、GBDT和随机森林的异同点?

相同点:

都是由多棵树构成,最终的结果也是由多棵树决定。

不同点:

1.随机森林可以由分类树和回归树组成,GBDT只能由回归树组成。

2.随机森林的树可以并行生成,而GBDT只能串行生成,所以随机森林的训练速度相对较快。

3.随机森林关注减小模型的方差,GBDT关注减小模型的偏差。

4.随机森林对异常值不敏感,GBDT对异常值非常敏感。

5.随机森林最终的结果是多数投票或简单平均,而GBDT是加权累计起来。

十一、GBDT的优缺点?

优点:

1.GBDT每一次的残差计算都增大了分错样本的权重,而分对的权重都趋近于0,因此泛化性能比较好。

2.可以灵活的处理各种类型的数据。

缺点:

1.对异常值比较敏感。

2.由于分类器之间存在依赖关系,所以很难进行并行计算。

十二、XGBOOST和GBDT的区别在哪里?

       传统的GBDT是以CART树作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题),线性分类器的速度是比较快的,这时候xgboost的速度优势就体现了出来。

       传统的GBDT在优化时只使用一阶导数,而xgboost对损失函数做了二阶泰勒展开,同时用到了一阶和二阶导数,并且xgboost支持使用自定义损失函数,只要损失函数可一阶,二阶求导。

       xgboost在损失函数里加入了正则项,用来减小模型的方差,防止过拟合,正则项里包含了树的叶节点的个数, 每个叶子节点上输出的score的L2模的平方和。

       xgboost里有一个参数叫学习速率(learning_rate), xgboost在进行完一次迭代后,会将叶子节点的权重乘上学习速率,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把learing_rate设置得小一点,然后迭代次数(n_estimators)设置得大一点。

       xgboost借鉴了随机森林的原理,支持行抽样和列抽样, 行抽样指的是随机森林里对数据集进行有放回抽样,列抽样指的是对特征进行随机选择,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

十三、为什么XGBOOST要用泰勒展开,优势在哪里?

       xgboost使用了一阶和二阶偏导,二阶导数有利于梯度下降的更快更准,使用泰勒展开取得函数做自变量的二阶导数形式,可以在不选定损失函数具体形式的情况下,仅仅依靠输入数据的值就可以进行叶子分裂优化计算,本质上也就把损失函数的选取和模型算法的优化分开来了,这种去耦合增加了xgboost的适用性,使得它按需选取损失函数,既可以用于分类,也可以用于回归。

十四、XGBOOST是如何寻找最优特征的?

       xgboost在训练过程中给出各个特征的增益评分,最大增益的特征会被选出来作为分裂依据,从而记忆了每个特征在模型训练时的重要性,从根到叶子中间节点涉及某特征的次数作为该特征重要性排序。

十五、XGBOOST是如何处理缺失值的?

       xgboost为缺失值设定了默认的分裂方向,xgboost在树的构建过程中选择能够最小化训练误差的方向作为默认的分裂方向,即在训练时将缺失值划入左子树计算训练误差,再划入右子树计算训练误差,然后将缺失值划入误差小的方向。

十六、XGBOOST的并行化是如何实现的?

       xgboost的并行不是在tree粒度上的并行,xgboost也是一次迭代完才能进行下一次迭代(第t次迭代的损失函数包含了第t-1次迭代的预测值),它的并行处理是在特征粒度上的,在决策树的学习中首先要对特征的值进行排序,然后找出最佳的分割点,xgboost在训练之前,就预先对数据做了排序, 然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

       可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

十七、XGBOOST采样时有放回的还是无放回的?

       xgboost属于boosting方法的一种,所以采样时样本是不放回的,因而每轮计算样本不重复,另外,xgboost支持子采样,每轮计算可以不使用全部的样本,以减少过拟合。另外一点是xgboost还支持列采样,每轮计算按百分比随机抽取一部分特征进行训练,既可以提高速度又能减少过拟合。

十八、XGBOOST的调参步骤是怎样的?

PS:这里使用Gridsearch cv来穷举检索最佳的参数,如果时间允许,可以通过设置步数先粗调,再细调。

1.保持learning rate和其他booster相关的参数不变,调节和estimators的参数。learing_rate可设为0.1, max_depth设为4-6之间,min_child_weight设为1,subsample和colsample_bytree设为0.8 ,其他的参数都设为默认值即可。

2.调节max_depth 和 min_child_weight参数,首先,我们先大范围地粗调参数,然后再小范围地微调。

3.gamma参数调优

4.subsample和colsample_bytree 调优

5.正则化参数调优,选择L1正则化或者L2正则化

6.缩小learning rate,得到最佳的learning rate值

十九、XGBOOST特征重要性的输出原理?

      xgboost是用get_score方法输出特征重要性的,其中importance_type*参数*支持三种特征重要性的计算方法:

1.importance_type*=*weight(默认值),使用特征在所有树中作为划分属性的次数。

2.importance_type*=*gain,使用特征在作为划分属性时loss平均的降低量。

3.importance_type*=*cover,使用特征在作为划分属性时对样本的覆盖度。

二十、LightGBM相比XGBOOST在原理和性能上的差异?

1.速度和内存上的优化:

       xgboost用的是预排序(pre-sorted)的方法, 空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。 其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。

       LightGBM用的是直方图(Histogram)的决策树算法,直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

2.准确率上的优化:

       xgboost 通过level(depth)-wise策略生长树, Level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

       LightGBM通过leaf-wise(best-first)策略来生长树, Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

3.对类别型特征的处理:

       xgboost不支持直接导入类别型变量,需要预先对类别型变量作亚编码等处理。如果类别型特征较多,会导致哑变量处理后衍生后的特征过多,学习树会生长的非常不平衡,并且需要非常深的深度才能来达到较好的准确率。

       LightGBM可以支持直接导入类别型变量(导入前需要将字符型转为整数型,并且需要声明类别型特征的字段名),它没有对类别型特征进行独热编码,因此速度比独热编码快得多。LightGBM使用了一个特殊的算法来确定属性特征的分割值。基本思想是对类别按照与目标标签的相关性进行重排序,具体一点是对于保存了类别特征的直方图根据其累计值(sum_gradient/sum_hessian)重排序,在排序好的直方图上选取最佳切分位置。

       算法部分到此结束,后续还有一篇特征工程的。上面这些问题都曾经一个个啃过,每一个问题都有很熟悉的感觉,但其实并不是掌握了上面的东西就是一个成熟的模型er了。也希望初学者在钻研算法的同时能把头抬起来,从业务的角度来看待模型,将模型作为风险控制的一个工具和手段,而非多么高大深的数学理论。做业务讲究的都是实际效果和增益,更通俗地说是为公司赚了多少钱,并不是做研究、写论文,希望大家能有所领悟。

       最后附上几张以前的笔记,一些努力的痕迹。

互联网金融风控面试算法知识(二)_第1张图片

互联网金融风控面试算法知识(二)_第2张图片

互联网金融风控面试算法知识(二)_第3张图片

【作者】:Labryant  
【原创公众号】:风控猎人  
【简介】:做一个有规划的长期主义者。
【转载说明】:转载请说明出处,谢谢合作!~

你可能感兴趣的:(风控,面试,算法,集成学习)