GBM,XGBoost,LightGBM

GBM如何调参:https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/
XGBoost 应该如何调参:https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/#
LightGBM和XGBoost:https://www.analyticsvidhya.com/blog/2017/06/which-algorithm-takes-the-crown-light-gbm-vs-xgboost/

def grid_search_params_dict_to_params_list(grid_search_params_dict):
    params_list=[]
    for key in grid_search_params_dict:
        new_params_list=[]
        if len(params_list)==0:
            for value in grid_search_params_dict[key]:
                params_list.append({key:value})
        else:
            for value in grid_search_params_dict[key]:
                for params_dict in params_list:
                    new_params_dict = params_dict.copy()
                    new_params_dict[key] = value
                    new_params_list.append(new_params_dict)
            params_list = new_params_list
    return params_list

gbdt、xgb、lgb、cat考点

转自:https://zhuanlan.zhihu.com/p/82521899

注意,下文的原始的gbdt是以sklearn中的gbdt的实现为例子来阐述的,因为gbdt的改进版本有很多,为了叙述方便,使用这个最为人所知的实现来描述。

你有自己用过别的模型然后调参之类的吗?能说一下基本的调参流程吗?XGB知道吗,以XGB为例子说一下调参流程吧
(个人的思路):一般来说采用贝叶斯优化或者遗传算法等启发式的优化算法确定相对最佳参数(如果不熟悉的话用随机搜索也是可以的,或者网格搜索但是参数得到步长设置的很大,一步一步确定相对最优参数的区间),然后再根据实际的模型在验证集上的表现做一些微调,对于过拟合优先调整max_depth和树的数量,在实际使用过程中这两个参数对于模型的整体效果影响很大很明显。对于欠拟合,反着来就行了。

XGB和GBDT的区别有哪些?
1、算法层面:

(1)损失函数的二阶泰勒展开;(具体的二阶泰勒展开的阐述下面那点会详细描述)

(2)树的正则化概念的引入,对叶节点数量和叶子节点输出进行了约束,方式是将二者形成的约束项加入损失函数中;

(3)二阶泰勒展开与树正则化推出了新的叶子节点输出的计算公式而不是原始gbdt那样的简单平均;

(4)a、对于基础学习器的改进,

分裂的时候自动根据是否产生正增益指导是否进行分裂,因为引入了正则项的概念,分裂的时候这个预剪枝更加严苛;

b、对于缺失值的处理,xgboost根据左右子节点的增益大小将缺失值分到增益大的节点中,而sklearn中的gbdt是无法处理缺失值的,因为sklearn中的gbdt是以sklearn中的cart为基学习器的,而sklearn中的cart也并没有实现对缺失值的处理功能。

(5)学习率,Shrinkage,对每一颗树都乘以小于1的学习率,来削弱每一颗树的影响,这样的结果就是会引入更多的树来处理使得基学习器得数量变多,从而降低过拟合,不过其实sklearn中的gbdt也实现了。。。不知道为什么这么多人把这一点也列为不同;

(6)、引入了随机森林使用的列采样功能,便于降低过拟合;

(7)、引入了许多近似直方图之类的优化算法来进一步提高树的训练速度与抗过拟合的能力,这个比较复杂,因为实现了很多种算法,后面单独写一篇来总结;

2、工程层面
(1)、对每个特征进行分块(block)并排序(pre_sort),将排序后的结构保存在内存中,这样后续分裂的时候就不需要重复对特征进行排序然后计算最佳分裂点了,并且能够进行并行化计算.这个结构加速了split finding的过程,只需要在建树前排序一次,后面节点分裂时直接根据索引得到梯度信息。

(2)

金贵涛:对xgboost的理解

zhuanlan.zhihu.com
图标
其它更复杂的工程优化处理见这里。。。。

为什么xgb用二阶导:
1、形式上的统一:

下面来自xgb的官网叙述:

可以看到,损失函数为mse的时候,注意,此时我们没有进行二阶泰勒展开

对比可以看到,其它损失函数泰勒展开之后去掉常数最终的形式和mse的不泰勒展开的形式是完全一致的(mse的二阶梯为常数1,一阶梯度是y_pred-y_True),这么做的好处是,这样的话,1、 xgboost在对mse的损失函数设计完求解器之后,这一套代码可以直接复用给别的损失函数来使用,因为我们如果不做二阶泰勒展开的话,比如新的损失函数是二元交叉熵,在工程设计上,我们还要将损失函数的求导,然后把求导之后的式子写出来:

二元交叉熵的一阶梯度
设计一个新的求解器去求解,很麻烦。

而进行了这样的设计之后,后续如果还有一些什么别的损失函数,底层的求解mse的代码可以直接使用,使用者只需要自行去求解新的损失函数的一阶梯度和二阶梯度的表达式,然后通过xgboost的自定义损失函数的功能就可以实现使用完备的xgboost的框架来求解自己的损失函数的最优值了。

2、关于速度的问题,gbdt的前向分布的求解思路可以说就和我们常见的逻辑回归求解的梯度下降是类似的,线性回归的梯度下降每一轮通过更新参数的方式接近损失函数的最优值,而gbdt则是用基学习器去拟合,相对而言,xgboost类似于使用牛顿法来求解线性回归,所以下面从牛顿和梯度下降的角度来阐述,的实际上我们常说的牛顿法比梯度下降法快是不准确的,应该是牛顿法的收敛速度要比梯度下降法快,也就是说牛顿法使用的迭代次数相对于梯度下降法要更少,但是由于涉及到计算二阶导的信息,牛顿法不一定在算法训练的时间上总比梯度下降法快,只是相对于梯度下降法而言,更少的迭代达到最优,这一点来看,并不算是优势。

没明白为什么有人说xgboost的二阶泰勒展开要更快???希望有大佬来解释一下这个问题。
xgb怎么梯度下降的:
和gbdt是一样的,t-1轮的所有的子数的总预测值和真实值进入损失函数的负梯度的表达式计算得到负梯度作为第t轮要拟合的标签值。严格来说,这是前向分布算法,虽然他和梯度下降法的思路非常相似,但是梯度下降法对于每一轮的负梯度的使用方法是作为上一轮参数的参数的更新量,而xgb是直接将其作为标签值用新的基学习器去拟合。

xgb的正则化

叶子节点个数的正则化约束,参数为gamma,

叶子节点输出值的正则化约束,参数是lambda。

XGB特征重要性程度是怎么判断的?

xgb的特征重要性的方式衍生的非常花俏了。

官网上给出的方案,total_gain就是特征带来的总的分裂增益,也就是我们常规意义上的分裂总增益,weight,被用来作为分裂节点的次数,也就是我们常规意义上的分裂总次数,gain=total_gain/weight,计算的是每一次分裂带来的平均增益,total_cover表示特征分裂的样本数,举个例子,假设初始样本有10000个,第一次分裂的时候使用了特征A,也就是特征A在这10000个样本上分裂,则此时的cover值为10000,假设根据特征A分裂出左枝的样本有1000个,右边有9000个,而在左枝特征B是最优特征根据这1000个样本进行分裂,则B当前的cover是1000,依次类推最后求和。

而cover显然就是total_cover/weight,也就是平均每次分裂所“负责”的样本数。

XGB很容易理解它的回归和二分类,如何理解多分类呢?
https://www.cnblogs.com/always-fight/p/9400346.html

www.cnblogs.com
图标
GBDT用于分类问题 - 1直在路上1 - 博客园

GBDT用于分类问题 - 1直在路上1 - 博客园

www.cnblogs.com
图标
思路就是ovr,比如三分类,每一轮是生成3颗数,不过损失函数还是用的多分类的损失函数比如常见的logloss,具体的可以见上面这篇文章写的很清楚了。

XGB和LGB区别:

1、直方图优化,对连续特征进行分桶,在损失了一定精度的情况下大大提升了运行速度,并且在gbm的框架下,基学习器的“不精确”分箱反而增强了整体的泛化性能;

2、goss 树的引入;

3、efb,对稀疏特征做了“捆绑”的优化功能;

4、直接支持对于类别特征进行训练(实际上内部是对类别特征做了类似编码的操作了)

5、树的生长方式由level-wise变成leaf-wise;

算法层面的优化具体可见:

马东什么:不手写lightgbm(1)—怎么分桶的

zhuanlan.zhihu.com
图标
马东什么:不手写lightgbm(2)—其它的一些特性

zhuanlan.zhihu.com
图标

工程层面的优化可见lightgbm原作者之一的知乎回答:

如何看待微软新开源的LightGBM?

www.zhihu.com
图标

xgboost与RF的对比

GBDT与RF区别

1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成,GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树)

2、组成随机森林的树可以并行生成;而GBDT只能是串行生成

3、对于最终的输出结果而言,随机森林采用多数投票或简单平均等;而GBDT则是将所有结果累加起来,或者加权累加起来(存在学习率)

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

5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成

6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能,但是xgb引入了正则项和列采样等等正则化手段之后,可以在少量增加偏差的情况下大幅度缩减模型的方差。

xgb的预排序算法是怎么做的呢?

将原始特征进行排序之后以块的形式保存到内存中,在块里面保存排序后的特征值及对应样本的引用,以便于获取样本的一阶、二阶导数值,但意味着除了保存原始特征之外还要保存原始特征的排序结果,耗内存。

rf和xgb哪个对异常点更敏感

xgb明显敏感的多,当然对rf也是有一定影响的,rf的每棵数的生成是独立的,异常点数量不多的情况下异常点常常和正常样本中的某些样本合并在一个分支里。

但是xgb不一样,异常样本的t-1轮的预测值和真实标签计算出来的负梯度会一直很大,假设当到达某一轮的时候,所有正常样本的计算得到的负梯度都很小而异常样本的负梯度很大例如【0.0000001,0.0000001,0.0000001,0.0000001,0.0000001,10】,这个时候新树会可能会继续进行不正常的分裂为[0.0000001,0.0000001,0.0000001,0.0000001,0.0000001],[10],而这样的分裂是不合理的,因为异常值本身可能是因为某些人为失误导致的数据记录错误,或者异常样本完全是属于另外一种分布,此时强制要进行模型训练会导致模型的结果有偏从而发生过拟合。

当然异常样本数量很少比如10个以内的时候而正常样本有100000000个其实基本没什么影响,但是如果占比较高的话是会产生影响的。

xgb何时停止分裂?

1、人工设定的参数,max_depth,min_data_in_leaf等等,这类通过超参数形式限制树的复杂度的方法都会引发xgb的分裂的停止,也就是常说的预剪枝;

2、人工不限制,自由生长的情况下,当分裂增益小于0则基学习器停止分裂

XGB怎么解决过拟合?怎么剪枝?怎么选择特征?
叶节点个数和叶节点权重(输出值)树的正则项,各种预剪枝的超参数(最大深度、最大叶节点个数、最小分裂增益、学习率、早停等等)控制树结构的复杂度,行列采样的引入、以及各类近似算法等。每轮计算所有特征各自的最佳分裂点,比较所有特征按照最佳分裂点分裂之后的分裂增益大小,使用分裂增益最大的特征在其最佳分裂点分裂一次,然后继续循环。。。。。

对比一下XGB和lightGBM在节点分裂时候的区别
xgb是level-wise,lgb是leaf-wise,level-wise指在树分裂的过程中,同一层的非叶子节点,只要继续分裂能够产生正的增益就继续分裂下去,而leaf-wise更苛刻一点,同一层的非叶子节点,仅仅选择分裂增益最大的叶子节点进行分裂。

Lgb相对于xgb的优缺点
优点:直方图算法—更高(效率)更快(速度)更低(内存占用)更泛化(分箱与之后的不精确分割也起到了一定防止过拟合的作用);

缺点:直方图较为粗糙,会损失一定精度,但是在gbm的框架下,基学习器的精度损失可以通过引入更多的tree来弥补。

Xgb叶子节点怎么计算值的
损失函数引入树正则化概念并二阶泰勒展开,去掉常数项之后得到最终的xgb损失函数的形式:,

然后根据此损失函数推导得到叶节点的计算公式

2.xgb与lr相比优缺点在哪里?
这类问题是一个很广的问题,涉及到不同算法的适用性,这个后面单独总结一下吧

xgb中l1正则怎么用的
xgb中l1表示对叶节点个数的约束项的系数,而l2则是叶子节点权重的约束项系数。

6、xgboost对特征缺失敏感吗,对缺失值做了什么操作,存在什么问题
不敏感,可以自动处理,处理方式是将missing值分别加入左节点 右节点取分裂增益最大的节点将missing样本分裂进这个节点 。这种处理方式的问题在xgboost仅仅在特征的非缺失的值上进行分裂然后missing值直接放入其中一个节点,显然当缺失值很多的情况下,比如缺失80%,那么xgb分裂的时候仅仅在20%的特征值上分裂,这是非常容易过拟合的。

7、xgb和lgb在特征、数据并行上存在什么差异?
lgbm特征并行的前提是每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。

xgb的特征并行与lgbm的最大不同在于xgb每个worker节点中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。

二者的区别就导致了lgbm中worker间通信成本明显降低,只需通信一个特征分裂点即可,而xgb中要广播样本索引。

2)数据并行

当数据量很大,特征相对较少时,可采用数据并行策略。

lgbm中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个直方图算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。

xgb中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率贼慢,每个worker间的通信量也就变得很大。

3)投票并行(lgbm)

当数据量和维度都很大时,选用投票并行,该方法是数据并行的一个改进。数据并行中的合并直方图的代价相对较大,尤其是当特征维度很大时。

大致思想是:每个worker首先会找到本地的一些优秀的特征,然后进行全局投票,根据投票结果,选择top的特征进行直方图的合并,再寻求全局的最优分割点。这个方法我没有找到很好的解释,因此,面试过程中答出前面两种我觉得就ok了吧。

为什么xgboost不用后剪枝
后剪枝计算代价太高了,合并一次叶节点就要计算一次测试集的表现,数据量大的情况下非常消耗时间,而且也并不是特别必要,因为这样很容易过拟合测试集。

4、GBDT和RF哪个树比较深

第一种解释: RF深。随机森林的思路是用大量低偏差高方差的基学习器进行集成,简单平均(不过lightgbm中的rf貌似不太一样,没有细致研究过),降低方差,所以希望每一个基学习器的精度尽量高,如果随机森林的基学习器偏差大,对于100个或者10000个精度为0.6的学习器,很难通过随机森林的集成方式来达到好的效果;而gbdt本身就是对误差的不断拟合,本身就是一个偏差很低的集成框架,那么为了同时也使得方差缩小,需要基学习器的泛化性能好一些,避免整个框架的偏差很低但方差很大的窘境;

第二种解释:随机森林每一颗树都是独立的,每一颗树都是以原始标签进行训练的,在不进行任何限制的情况下会生长的比较深,而gbdt不一样,每一轮都是以上一轮的负梯度为新标签进行训练,训练到一定程度的时候我们去观察负梯度就可以发现,因为很多样本已经得到很好的拟合,所以负梯度会比较小,比如可能是这样的[0.000000001,0.000000001,0.000000001,0.0000000015......],这样树在分裂的时候实际上再进行分裂的增益并不大,甚至分裂之后的增益反而减少,这就导致了基树训练的时候很早就停止了,从而导致树的深度降低。

为什么gbdt不能用分类树?
分类树无法处理连续值,负梯度一般都是连续值。

6 lightGBM直方图加速原理? lightGBM处理类别变量的原理? lightGBM在特征分裂时相比GBDT和xgboost有什么优化? lightGBM特征分裂加速的原理是什么?
马东什么:不手写lightgbm(1)—怎么分桶的

zhuanlan.zhihu.com
图标
马东什么:不手写lightgbm(2)—其它的一些特性

zhuanlan.zhihu.com
图标
如何看待微软新开源的LightGBM?

www.zhihu.com
图标

算法和工程方面的都在这里了。

2 lightGBM重要性怎么评估?
和xgb一样。不过lgb中没有cover这一评价方式。

3 lightGBM节点怎么分裂的?
这个问题,去github上看了问答才搞清楚,

马东什么:不手写lightgbm(1)—怎么分桶的

zhuanlan.zhihu.com
图标
What is the LightGBM splitting criterion? · Issue #1774 · microsoft/LightGBM

github.com
图标
已经有人在github上提问了,按照开发者的意思,和xgboost是一样的。

用的xgboost也许要对特征进行标准化吗?
不用做标准化,但是要对分布不稳定的特征进行处理,比如分箱,log变换之类的,因为我们交叉验证的时候如果特征分布特别不规则,可能每一折的训练集和开发集上划分到的特征差异性比较大,这是包括gbdt算法之外所有算法都 需要进行处理的,机器学习的基本假设是同分布,如果不同数据集的特征分布差异性太大,这样的特征没法直接使用必须要转换一下。

XGBoost或GBDT中怎么控制模型复杂度?XGBoost的参数选择(怎么调参)。。。
自己看参数吧

1.xgboost怎么处理高维稀疏数据?
xgboost原理中的稀疏感知是关于缺失值的,

就是在非缺失的样本上做分裂然后缺失值根据分别进入左右节点带来的增益来决定要划分到哪个节点。如果是常规意义上的高基数类别特征进行onehot之后的0-1矩阵,xgb没有什么特别的处理方案。

数据标签值都在0-1000范围之内,随机森林和gbdt做回归的值能否超过1000.

以原始的gbdt的叶子节点输出为例,假设学习率为1,以mse为损失函数的情况下上面的式子可以变成:

[公式] 其中n为这个叶子节点的样本数量。。。。。

这个问题。。。我还真没想到什么答案。。。。

7、GBDT为什么用CART回归树做基学习器?

GBDT算法原理深入解析

xudongyang.coding.me
这一篇说的很清晰。

基于梯度提升算法的学习器叫做GBM(Gradient Boosting Machine)。理论上,GBM可以选择各种不同的学习算法作为基学习器。现实中,用得最多的基学习器是决策树。为什么梯度提升方法倾向于选择决策树(通常是CART树)作为基学习器呢?这与决策树算法自身的优点有很大的关系。决策树可以认为是if-then规则的集合,易于理解,可解释性强,预测速度快。同时,决策树算法相比于其他的算法需要更少的特征工程,比如可以不用做特征标准化,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖等。决策树能够自动组合多个特征,它可以毫无压力地处理特征间的交互关系并且是非参数化的,因此你不必担心异常值或者数据是否线性可分(举个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)。不过,单独使用决策树算法时,有容易过拟合缺点。所幸的是,通过各种方法,抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题。由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。至于抑制单颗决策树的复杂度的方法有很多,比如限制树的最大深度、限制叶子节点的最少样本数量、限制节点分裂时的最少样本数量、吸收bagging的思想对训练样本采样(subsample),在学习单颗决策树时只使用一部分训练样本、借鉴随机森林的思路在学习单颗决策树时只采样一部分特征、在目标函数中添加正则项惩罚复杂的树结构等。

2、GBDT不擅长处理离散特征,你在应用的时候是怎么处理的
GBDT不擅长处理高基数类别特征,如果基数低,问题也不大。原因可见:

马东什么:为何常规的gbdt和决策树不适用于高基数特征的场景

zhuanlan.zhihu.com
图标
lightgbm和catboost内部对类别特征有自己的特征工程方案,而xgboost这类无法直接处理类别特征的库则一般来说:1、单值离散用编码的方法;2、多值离散用embedding

6、GBDT在回归和多分类当中有什么不同,在预测的时候的流程是怎样的
损失函数不同(废话),预测存在差异。

回归则直接加权求和输出全部基学习器的预测结果,分类还要将预测结果加权求和的结果放到sigmoid或者softmax里面转化为概率值。

1,gbdt如果损失函数换成exponent会怎样,有什么变化?
变成adaboost。

具体可见:

(boost框架的历史回顾中,有空补上)

3.GBDT在什么情况下比逻辑回归算法要差?
高维稀疏的数据集,gbdt对维度超高的稀疏数据集,其正则项约束基本没用,并且决策空间会变成太多零散的决策小空间,具体可见上gbdt为何不好处理高基数类别特征的问题。

而lr的l1正则项可以很好的约束没啥用 的稀疏特征,直接w置0即可。

4、GBDT对输入数据有什么要求,如果效果比较差,可能是什么原因造成的?

如果训练集的效果很差,说明原始数据相对于gbdt算法来说实在太差了,特征基本没什么区分度,xgb这种拟合能力超强的算法都无法很好的拟合;

如果训练集的效果很好测试集很差,并且二者的差距非常大(比如10个点以上),考虑特征分布的问题,应该是有一些强特的分布在训练集和测试集上差异太大了。

如果训练集效果很好,测试集稍差一点,二者差异并不是很大,考虑调参。

xgb和lgb的并行实现的比较
1)特征并行

lgbm特征并行的前提是每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。

简单说就是lgb的每一个worker处理一个特征,按列来拆分到多个worker上进行计算的

xgb的特征并行与lgbm的最大不同在于xgb每个worker节点中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。

简单说就是xgb的每一个worker处理所有特征,但是每个worker只处理一部分取值范围里的最佳切分点,比如5个worker对一个特征的取值范围切分为5份,在每一份上计算最佳切分点,然后5份上的5个最佳切分点做比较取最好

一个是竖着切分,一个是横着切分。

二者的区别就导致了lgbm中worker间通信成本明显降低,只需通信一个特征分裂点即可,而xgb中要广播样本索引。

2)数据并行

当数据量很大,特征相对较少时,可采用数据并行策略。

lgbm中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个直方图算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。

xgb中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率贼慢,每个worker间的通信量也就变得很大。

3)投票并行(lgbm)

当数据量和维度都很大时,选用投票并行,该方法是数据并行的一个改进。数据并行中的合并直方图的代价相对较大,尤其是当特征维度很大时。

大致思想是:每个worker首先会找到本地的一些优秀的特征,然后进行全局投票,根据投票结果,选择top的特征进行直方图的合并,再寻求全局的最优分割点。这个方法。。。不懂,上述都是搬运来的。。

xgboost有哪些参数?
-学习率 eta :学习率越小,迭代次数越多。

-最小孩子权重 min-child-weight:控制叶子结点中二阶导数和的最小值,即样本的数量越少(由于h大约均在0.01附近),越容易过拟合

-最大深度 max_depth
-最大叶子结点数 max_leaf_node

-后剪枝参数gamma
-L2参数lambda
-L1参数alpha (控制模型复杂度)

-样本随机采样 subsample;列采样比例 colsample_bytree
(5)xgboost 有哪些优点?
-树节点分裂方法,利用近似算法,二阶导数为权重值的分位数作为切分点
-自动学习特征缺失值的方向
-列抽样(借鉴随机森林),行抽样
-学习率(eta)的shrinkage,增加迭代次数
-自定义损失函数
-特征预排序
(6)xgboost和gbdt的区别?
1)GBDT是以CART作为基分类器,xgboost支持线性分类器,其中线性分类器的xgboost相当于正则化的逻辑回归(分类问题)或
线性回归(回归问题)
2)GBDT的目标函数含有一阶信息,xgboost的目标函数含有二阶信息,最小化目标函数可得关于函数空间f(t)的梯度迭代或牛顿迭代,
牛顿法能更快的收敛。同时xgboost加入了正则项,控制了模型的复杂度。
(7) Lightgbm对xgboost有哪些改进?
-Histgram算法 将浮点型数值离散为K个,统计离散值的累积量,遍历直方图找最优特征分裂点
-直方图加速:叶子结点的直方图可由父亲结点的直方图与兄弟结点的直方图做差得到
-leave wise 选取信息增益最大的叶子结点继续分裂(容易过拟合,利用max_depth参数控制)

  1. xgboost里面的lambdarank的损失函数是什么?

  2. xgboost在什么地方做的剪枝,怎么做的? 分裂,预剪枝;参数,预剪枝。

  3. xgboost如何分布式?特征分布式和数据分布式? 各有什么存在的问题?

posted @ 2017-09-28 11:08  机器狗mo  阅读(1656)  评论(0编辑  收藏  举报