降低偏差(bias)
降低方差
偏差:预估值与真实值的偏离程度,是算法对数据的拟合能力。
方差:数据扰动,训练集变化时,模型的学习性能。
噪声:任何学习算法在泛化能力的下界,是学习问题本身的难度。
将第一层的输出train再结合其他的特征集再做一层,就是stacking。例如gbt+lr
Dropout 训练继承模型的方式 from 花书7.12
Dropout 训练的集成包括所有从基础网络除去非输出单元后形成的子网络。在 Dropout 的情况下,所有模型共享参数,其中每个模型继承父神经网络参数的不同子集。
在Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择。过程分为四个部分:
(1)缺点:
利用随机森林对特征重要性进行评估
本质:计算该特征在分支前后对树的平均gini提升占比所有特征的值。
步骤:
相同点:) 都是多棵树
(2) 最终结构由多棵树共同决定
不同点:
(1) RF的组成可以是分类树、回归树;组成 GBDT 只能是回归树。
(2) RF的树可以并行生成(Bagging);GBDT 只能串行生成(Boosting)
(3) 对于最终的输出结果而言,RF使用多数投票或者简单平均;而 GBDT 则是将所有结果累加起来,或者加权累加起来;
(4) RF对异常值不敏感,GBDT 对异常值非常敏感;
(5) RF对训练集一视同仁权值一样,GBDT 是基于权值的弱分类器的集成;
(6) RF通过减小模型的方差提高性能,GBDT 通过减少模型偏差提高性能。
泛化性能更好!GBDT 的最大好处在于,每一步的残差计算其实变相的增大了分错样本的权重,而已经分对的样本则都趋向于0。这样后面就更加专注于那些分错的样本。
可以理解为残差是全局最优的绝对方向,类似于求梯度。
GBDT 也可以在使用残差的同时引入 Bootstrap re-sampling,GBDT 多数实现版本中引入了这个选项,但是是否一定使用有不同的看法。
原因在于 re-sample 导致的随机性,使得模型不可复现,对于评估提出一定的挑战,比如很难确定性能的提升是由于 feature 的原因还是 sample 的随机因素。
不放回抽样
Xgboost是GBDT的一个变种,最大的区别是xgboost通过对目标函数做二阶泰勒展开,从而更新树的叶子的权重和树的权重,并根据loss function求出每一次分裂节点的损失减小的大小,根据分裂损失选择合适的属性进行分裂。
【源码参考:XGBoost解析系列–源码主流程】
features = np.random.randint(0, col-1, col/2)
features = np.unique(features)
fea_list = features.tolist()
两种分裂算法:精确分裂exact,近似分裂approx。
//找到切分点(splits)及箱子信息(Bins)
//对于连续型特征,利用切分点抽样统计简化计算
//对于离散型特征,如果是无序的,则最多有个 splits=2^(numBins-1)-1 划分
//如果是有序的,则最多有 splits=numBins-1 个划分
xgboost的特点
提出了一种特殊的分桶策略,一般的分桶策略是每个样本的权重都是相同的,但是xgboost使每个样本的权重为损失函数在该样本点的二阶导。
(泰勒展开不应该是损失函数关于模型的展开吗?为什么会有在该样本点的二阶导这种说法? 因为模型是对所有样本点都通用的,把该样本输入到二阶导公式中就可以得到了)。
所有建树算法:‘auto’, ‘approx’, ‘exact’, ‘hist’, ‘gpu_exact’, ‘gpu_hist’等,默认设置为’auto’。使用’auto’自适应到具体的算法,对于数据量小于222222使用’exact’精确方法,否则会重置’approx’近视方法。计算批次量大小max_row_perbatch=min(用户设置max_row_perbatch, safe_max_row),进行批次处理,其中safe_max_row=216216
RF的并行化是树与树之间的并行化。
xgboost和boosting方法一样,在树的计算上是串行的,但是在构建树的过程中,也就是在分裂节点的时候支持并行化。
比如同时计算多个取值作为分裂特征及其值,然后选择收益最大的特征及其取值对节点分裂。
一般的feature parallel就是对数据做垂直分割(partiion data vertically,就是对属性分割),然后将分割后的数据分散到各个workder上,各个workers计算其拥有的数据的best splits point, 之后再汇总得到全局最优分割点。
【源码讲解】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BgQpzIKv-1621158296838)(evernotecid://F168D203-45D2-4FD0-BB36-6F63414FB4C7/appyinxiangcom/21940830/ENResource/p232)]
三个函数:
xgboost在计算分裂收益的时候只利用了没有missing值的样本。但是在确定了树的结构的时候!xgboost分别假设该样本属于左子树和右子树,比较两者的分裂增益,选择增益较大的那一边作为该样本的分裂方向。
对每一个叶节点进行增益的计算。
xgboost:level-wise. LGBM:leaf-wise.
xgboost对每一层所有节点进行无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,开销太大了。
leaf-wise是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归,但很容易过拟合,陷入比较高的深度当中,所以要对最大深度做限制,避免过拟合。
histogram算法在内存和计算代价上都有不小优势。
为什么xgboost的近似直方图比LGBM的直方图算法慢?
一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
xgboost在每一层都动态构建直方图, 因为xgboost的直方图算法不是针对某个特定的feature,而是所有feature共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图,而lightgbm中对每个特征都有一个直方图,所以构建一次直方图就够了。
在对离散特征分裂时,分裂时的增益算的是“是否属于某个类别的”增益。
1.最主要的区别是取样方式不同。Bagging的训练集的选择是随机均匀的,Boosting的训练集的选择与前面的学习结果有关,所以Boosting的分类精度要优于Bagging。
2.模型的集成方式上,Bagging的各个预测函数没有权重,Boosting有。
3.运行方式上,Bagging可以并行生成各个预测函数,Boosting只能顺序生成。所以针对NN,Bagging可以节省大量时间开销。
【Bagging是降低方差,Boosting是偏差】
理解:
Bagging是多个模型并行集成,并且样本可放回抽样。
Boosting是每一次都在修订前面模型的结果,也就是说在降低错误率,降低偏差。
1.xgboost使用了泰勒展开
2.xgboost使用了多线程
3.xgboost在代价函数中加入了正则项,用于控制模型的复杂度。
4.LGBM基本原理与Xgboost一样,但是速度更快:
使用泰勒展开是为了能够【自定义loss function】。
实际上,使用最小二乘法的损失函数进行直接推导和泰勒展开的推导结果相同。两者虽然结果相同,但是OLS的计算量太大了。在实际的代码过程中,任何损失函数只要二阶可导都可以【复用】泰勒展开,例如基于分类的对数损失函数。这样的话,【代码可以在分类和回归进行复用】。
Xgboost在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性。
无放回抽样。Xgboost是梯度优化模型,如果一个样本连续重复抽出,则梯度来回踏步,不利于收敛。
提升树是:计算每个样本的残差,对残差进行拟合得到回归树。
GBDT(梯度提升树):使用loss function的偏导代替残差进行拟合。
讲多线程计算的三个函数:
map -> reduce -> shift