RF、GBDT、XGBOOST常见面试算法整理
1、 RF(随机森林)与GBDT之间的区别
相同点:
1)都是由多棵树组成的
2)最终的结果都是由多棵树一起决定
不同点:
1) 组成随机森林的树可以是分类树也可以是回归树,而GBDT只由回归树组成
2) 组成随机森林的树可是并行生成,而GBDT只能是串行生成
3) 随机森林的结果是多棵树表决决定,而GBDT则是多棵树累加之和
4) 随机森林对异常值不敏感,而GBDT对异常值比较敏感
5) 随机森林是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能
6) 随机森林不需要进行数据预处理、归一化,而GBDT需要进行归一化
2、 分类树与回归树的区别
1) 分类树使用信息增益或者增益比来划分节点;每个节点的类别经投票数额决定测试样本的类别;
2) 回归树使用最小化均方差划分节点;每个节点样本的均值作为测试样本的回归预测值
3、 GBDT的核心
1) GBDT的核心就在于每一棵树都建立在之前所学的所有树的绝对值残差,这个残差就是一个加预测值后的真实值的累加量
4、 XGBOOST和GBDT的区别
1) 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
2) 节点分裂的方式不同,gbdt是用gini系数,xgboost是经过优化推导后的。
3) 传统的GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
4) xgboost在代价函数里加入了正则项,用于控制模型得复杂度,降低了过拟合的可能性。正则项里包含了树的叶子节点的个数、每个叶子节点上输出的score的L2模的平方和。
5) shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
6) 列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;
7) 对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动 学习出它的分裂方向;
8) xgboost工具支持并行。注意xgboost的并行并不是tree粒度的并行,xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复的使用这个结构,大大减小计算量。这个block结构也使得并行成为可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
9) xgboosst借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
10) 对缺失值处理。对于特征的值有缺失样本,xgboost可以自动学习出他的分裂方向。
1) 为什么xgboost要用泰勒展开,优势在哪里?
xgboost使用了一阶和二阶偏导,二阶导数有利于梯度下降的更快更准。使用泰勒展开取得函数做自变量得二阶导数形式,可以在不选定损失函数具体形式的情况下,仅仅依靠输入数据的值就可以进行叶子分裂优化计算,本质上也就把损失函数的选取和模型算法优化/参数选择分开了,这种去耦合增加了xgboost的适用性,使得它按需选取损失函数,可以用于分类,也可以用于回归
5、 GBDT怎样设置单颗树的停止生长条件?
1) 节点分裂时的最小样本数
2) 树的最大深度
3) 最多叶子节点数
4) Loss满足约束条件
6、 GBDT如何评估特征值的权重大小?
1) 通过计算每个特征在训练集下的信息增益,最后计算每个特征信息增益与所有特征信息增益之和的比例为权重值
2) 借鉴投票机制。用相同的GBDT参数对w每个特征训练出一个模型,然后在该模型下计算每个特征正确分类的个数,最后计算每个特征正确分类的个数与所有正确分类个数之和的比例为权重值
7、 GBDT当增加样本数量时,训练时长是线性增加吗?
不是的,因为生成单棵决策树时,对于损失函数极小值与样本数量N不是线性相关的
8、 当增加树的棵数时,训练时长是线性增加吗?
不是的,因为每棵树的生成时间复杂度O(N)不同
9、 当增加一棵树叶子节点数目时,训练时长是线性增加吗?
不是的,叶子节点数和每棵树的生成之间复杂度O(N)不成正比
10、每个节点上都保存什么信息?
中间节点保存某个特征的分割值,叶节点保存预测是某个类别的概率
11、如何防止过拟合
1)增加样本,移除噪声
2)减少特征,保留一些重要的特征
3)对样本进行采样,就是在构建树的时候,不是把所有的样本都作为输入,而是选择一部分数据作为子集
4)对特征进行采样化,和对样本采样基本一致,就是在每次建树的时候只对部分的特征进行切分
12、GBDT中哪些部分可以并行
1)计算每个样本的负梯度时
2)分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时
3)更新每个样本的负梯度时
4)最后预测的过程当中,每个样本将之前的所有树的结果累加的时候
13、树生成畸形树,会带来哪些危害,如何预防?
在生成树的过程中,加入树不平衡的约束条件。这种约束条件可以是用户自定义的。例如对样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚。
RF、GBDT、XGBOOST常见面试算法整理的更多相关文章
- RF,GBDT,XGBoost,lightGBM的对比
转载地址:https://blog.csdn.net/u014248127/article/details/79015803 RF,GBDT,XGBoost,lightGBM都属于集成学习(Ensem ...
- RF/GBDT/XGBoost/LightGBM简单总结(完结)
这四种都是非常流行的集成学习(Ensemble Learning)方式,在本文简单总结一下它们的原理和使用方法. Random Forest(随机森林): 随机森林属于Bagging,也就是有放回抽样 ...
- 常见面试算法题JS实现-设计一个有getMin功能的栈
前言: 已经确定工作了-下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书, ...
- 常见排序算法整理(python实现 持续更新)
1 快速排序 快速排序是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行 ...
- 常见面试算法题JS实现-仅用递归函数和栈操作逆序一个栈
前言: 因为JAVA和JS语言特性的不同,有些东西在JAVA中可能需要一些技巧和手段才能实现的复杂程序,但是在JS中可能就是天然存在的,所以这套书里面的题目不会全部用JS去实现一遍,因为可能JS的实现 ...
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考 ...
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...
- 随机森林RF、XGBoost、GBDT和LightGBM的原理和区别
目录 1.基本知识点介绍 2.各个算法原理 2.1 随机森林 -- RandomForest 2.2 XGBoost算法 2.3 GBDT算法(Gradient Boosting Decision T ...
随机推荐
- View模块
一.应用场景 通过View的类注释,可知,Backbone.view是一个JS构造函数,与DOM中的某一块UI相对应,通过注册模型层数据的监听,可实现视图的自动渲染. Backbone.View模块也 ...
- 添加SAP_ALL权限
更新usr04,ust04,usrbf2这三张表 REPORT ZTESTCREATEUSER. data: l_USR04 LIKE USR04 , l_UST04 LIKE UST04 , l_P ...
- C# Dictionary的遍历
foreach (KeyValuePair<string, string> kvp in dic) { Console.WriteLine("key:{0},value:{1}& ...
- webapplication发布
在vs2010里写的 ASP.NET Web Application 发布步骤: ①:右击Web Application项目可以看到发布,弹出的对话框里选择要发布的路径,路径选择一个容易记住的地址即可 ...
- Weblogic 10.3.6.0 集群搭建
Weblogic 集群搭建 Oracle的Weblogic分开发者版本和生产版本,有32位和64位.一般生产版本的weblogic是64位的,安装文件是一个大小为1G多的jar包.去oracle官网上 ...
- 微信jssdk实现分享到微信
本来用的是这个插件http://overtrue.me/share.js/和百度分享 相同之处:在微信分享的时候,分享的链接都不能获取到缩略图... 不同之处:百度分享在微信低版本是可以看到缩略图的( ...
- Redis安装配置及在Python上的应用
最近在使用Kazoo(开源电话系统) API时,一次请求的处理需要调用几次API,只为了得到一个name和id的对应关系,耗时非常大,开始想使用一种简单的实现,直接将对应关系保存到静态类的静态变量中, ...
- vue登录权限
登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根 ...
- 实现Hbase的分页
作者:R星月 出处:http://www.cnblogs.com/rxingyue 欢迎转载,也请保留这段声明.谢谢! 做一个项目中由于数据量比较大,并且需要定时增量分析,做了hbase的分页.项目中 ...
- objective C 内存管理及属性方法具体解释
oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...