机器学习面试笔记

集成学习

Boosting,Bagging,Stacking
https://xijunlee.github.io/2017/06/03/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/

Boosting:

AdaBoost

在不改变训练数据的情况下,通过在迭代训练弱学习器中,不断提升被错分类样本的权重(也就是使被错分的样本在下一轮训练时得到更多的重视),不断减少正确分类样本的权重。最后通过加权线性组合M个弱分类器得到最终的分类器,正确率越高的弱分类器的投票权数越高,正确率低的弱分类器自然投票权数就低。

优点
1、很好的利用了弱分类器进行级联。
2、可以将不同的分类算法作为弱分类器。
3、AdaBoost具有很高的精度
4、相对于bagging算法和Random Forest算法,AdaBoost充分考虑的每个分类器的权重

缺点
1、AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。
2、数据不平衡导致分类精度下降。
3、训练比较耗时,每次重新选择当前分类器最好切分点。

应用领域
模式识别、计算机视觉领域,用于二分类和多分类场景

GBDT

GBDT的基本原理是boosting里面的 boosting tree(提升树),并使用gradient boost。GBDT中的树都是回归树,不是分类树 ,因为gradient boost 需要按照损失函数的梯度近似的拟合残差,这样拟合的是连续数值,因此只有回归树。Gradient Boosting是一种Boosting的方法,其与传统的Boosting的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boosting中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少,与传统Boosting对正确、错误样本进行加权有着很大的区别。这个梯度代表上一轮学习器损失函数对预测值求导。与Boosting Tree的区别:Boosting Tree的适合于损失函数为平方损失或者指数损失。而Gradient Boosting适合各类损失函数(损失函数为:平方损失则相当于Boosting Tree拟合残差、损失函数为:使用指数损失则可以近似于Adaboost,但树是回归树)

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力较强的算法。GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。GBDT的思想使其具有天然优势可以发现多种有区分性的特征以及特征组合。

优点
1、防止过拟合。GBDT的最大好处在于,每一步的残差计算其实变相地增大了分错实例(instance)的权重,而已经分对的实例(instance)则都趋向于0。这样后面的树就能越来越专注那些前面被分错的实例(instance)。

2、它的非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换。

3、可解释性强,可以自动做特征重要性排序。因此在深度学习火热以前,常作为`发现特征组合‘的有效思路。

缺点
Boost是一个串行过程,不好并行化,而且计算复杂度高,同时不太适合高维稀疏特征,如果feature个数太多,每一棵回归树都要耗费大量时间。

XGBoost

xgboost类似于gbdt,但是很多地方经过了优化,因此不论是精度还是效率上都有了提升。与gbdt相比,具体的优点有:

1.损失函数是用泰勒展式二项逼近,而不是像gbdt里就是一阶导数
2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性
3.节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的.

xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。

https://bbs.huaweicloud.com/blogs/211421
XGBoost 的优点

1.正则化

XGBoost 在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的 score 的 L2 模的平方和。从 Bias-variancetradeoff 角度来

讲,正则项降低了模型的 variance,使学习出来的模型更加简单,防止过拟合,这也是XGBoost 优于传统 GBDT 的一个特性。

2.并行处理

XGBoost 工具支持并行。Boosting 不是一种串行的结构吗?怎么并行的?注意 XGBoost 的并行不是 tree 粒度的并行,XGBoost 也是一次迭代完才能进行下一次迭代的(第 t 次迭代的代价函数里包含了前面 t-1 次迭代的预测值)。XGBoost 的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost 在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个 block 结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

3.灵活性

XGBoost 支持用户自定义目标函数和评估函数,只要目标函数二阶可导就行。

4.缺失值的处理

对于特征的值有缺失的样本,XGBoost 可以自动学习出它的分裂方向。

5.剪枝

XGBoost 先从顶到底建立所有可以建立的子树,再从底到顶反向进行剪枝。比起 GBM,这样不容易陷入局部最优解。

6.内置交叉验证

XGBoost 允许在每一轮 Boosting 迭代中使用交叉验证。因此,可以方便地获得最优Boosting 迭代次数。而 GBM 使用网格搜索,只能检测有限个值。

缺点或不足

虽然说 XGBoost 在 Kaggle 比赛中获得了不错的成绩,但并不代表 XGBoost 是一个完美的算法,它当然也有自己的缺点和不足之处:

1.算法参数过多

调参复杂,需要对 XGBoost 原理十分清楚才能很好的使用 XGBoost。

2.只适合处理结构化数据

相对于深度学习算法来说,XGBoost 算法只适合处理结构化的特征数据,而对于类似图像中的目标检测等任务重的非结构化数据没有很好的处理能力。

3.不适合处理超高维特征数据

XGBoost 算法对于中低维数据具有很好的处理速度和精度,但是对于例如大规模图像物体识别,或者是推荐算法的某些场景中会出现的超高维特征的数据就无能为力了,这时候我们就需要借助于深度学习等算法。

Bagging

Bagging的代表算法是随机森林,简单说下随机森林的步骤:

(1) 对训练样本进行bootstrap采样,即有放回的采样,获得M个采样集合;
(2) 在这M个采样集合上训练处M个弱决策树。注意到,在决策树生成中还用到了列采样的技巧,原本决策树中节点分裂时,是选择当前节点中所有属性的最优属性进行划分的,但是列采样的技巧是在所有属性中的子集中选最优属性进行划分。这样做可以进一步降低过拟合的可能性;
(3) 对这M个训练出来的弱决策树进行集成

优点:

1.准确率极高

2.能够有效地在大数据集上运行

3.引入了随机性,不容易过拟合

4.随机森林有很好的抗噪声能力,但是在在数据噪音比较大的情况下会过拟合。

5.能处理很高维度的数据,而且不用降维

6.不仅能处理离散型数据,还能处理连续型数据,而且不需要将数据集规范化

7.训练速度快,能够得到变量重要性排序

8.容易实现并行化

9.即使对于缺省值问题也能够获得很好得结果

10.超参数的数量不是很多,并且都能很直观地了解它们多代表的含义

缺点:

虽然随机森林算法已经足够快,但是当遇到随机森林中的决策树个数很多时,训练时所需要的空间和时间会会很大,这将导致模型越慢。因此在实际应用中,如果遇到实时性要求很高的情况,最好选择其他算法

你可能感兴趣的:(机器学习,机器学习)