算法十问

  1. 随机森林为什么能够更鲁棒?

由于随机森林使用了使用了行采样和列采样技术,使得每棵树不容易过拟合;并且是基于树的集成算法,由于使用了采用数据是的每棵树的差别较大,在进行embedding的时候可以更好的降低模型的方差,整体而言是的RF是一个鲁棒的模型。

  1. RF分类和回归问题如何预测y值?

RF是一个加权平均的模型,是进行分类问题的时候,使用的个k个树的投票策略,多数服从少数。在回归的使用是使用的k个树的平均。可以看出来rf的训练和预测过程都可以进行并行处理。

  1. 相同数据量,训练RF和gbdt谁可以更快?谁对异常值不敏感?

gbdt是前向加法模型,由于第i棵树需要用到前i-1树的残差,所有在再整个建立过程是串行处理的,RF整体是bagging算法的一种,是k个树的加权平均,k棵树可以并行处理,因此可能得到更快的速度。需要指出在gbdt的原始算法中没有使用行列的随机采样,相反rf使用了随机采样。
由于gbdt当前的误差会延续给下一棵树,而RF每次都是独立的随机采样,随机森林对异常值不敏感,GBDT对异常值非常敏感。

  1. gbdt是训练过程如何选择特征?

gbdt使用基学习器是CART树,CART树是二叉树,每次使用yes or no进行特征选择,数值连续特征使用的最小均方误差,离散值使用的gini指数。在每次划分特征的时候会遍历所有可能的划分点找到最有的特征分裂点,这是用为什么gbdt会比rf慢的主要原因之一。

  1. gbdt应用在多分类问题?
  • gbdt 每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的。残差相减是有意义的。
  • 对于多分类任务,GDBT的做法是采用一对多的策略也就是说,对每个类别训练M个分类器。假设有K个类别,那么训练完之后总共有M*K颗树。
  • 两层循环的顺序不能改变。也就是说,K个类别都拟合完第一颗树之后才开始拟合第二颗树,不允许先把某一个类别的M颗树学习完,再学习另外一个类别。
    还是树模型 - 图1
  1. RF和GBDT的区别?

GBDT是采用boosing方法,降低偏差;RF采用的是baggging方法,降低方差。其中GBDT中的核心是通过用分类器(如CART、RF)拟合损失函数梯度,而损失函数的定义就决定了在子区域内各个步长,其中就是期望输出与分类器预测输出的查,即bias;而RF的核心就是自采样(样本随机)和属性随机(所有样本中随机选择K个子样本选择最优属性来划分),样本数相同下的不同训练集产生的各个分类器,即数据的扰动导致模型学习性能的变化,即variance。

  1. xgb为什么使用二阶梯度信息,为什么不使用三阶或者更高梯度信息?

xgb之所以使用二阶梯度信息,是因为从泰勒展开式来看,gbdt使用的一阶梯度的泰勒展开式,丢失了很多的信息,使用二阶可以使损失函数更加准确。从泰勒展开的角度来看展开的次数越多越能更精准的表示损失函数的值,但是如果我们使用二阶梯度就要要求损失函数二阶可导,如果使用n阶展开就要求损失函数n阶可导,但是有很多损失函数不是n阶可导的,比如均方误差,因此使用二阶梯度信息是一个泰勒展开和损失函数选择的折中。

  1. 比较一下catboost、lgb和xgb?
    XGBoost、LightGBM和CatBoost都是目前经典的SOTA(state of the art)Boosting算法,都可以归类到梯度提升决策树算法系列。三个模型都是以决策树为支撑的集成学习框架,其中XGBoost是对原始版本的GBDT算法的改进,而LightGBM和CatBoost则是在XGBoost基础上做了进一步的优化,在精度和速度上都有各自的优点。
  • 三个模型树的构造方式有所不同,XGBoost使用按层生长(level-wise)的决策树构建策略,LightGBM则是使用按叶子生长(leaf-wise)的构建策略,而CatBoost使用了对称树结构,其决策树都是完全二叉树。
  • 对于类别特征的处理。XGBoost本身不具备自动处理类别特征的能力,对于数据中的类别特征,需要我们手动处理变换成数值后才能输入到模型中;LightGBM中则需要指定类别特征名称,算法即可对其自动进行处理;CatBoost以处理类别特征而闻名,通过目标变量统计等特征编码方式也能实现类别特征的高效处理。
  1. gbdt如何防止过拟合?由于gbdt是前向加法模型,前面的树往往起到决定性的作用,如何改进这个问题?

一般使用缩减因子对每棵树进行降权,可以使用带有dropout的GBDT算法,dart树,随机丢弃生成的决策树,然后再从剩下的决策树集中迭代优化提升树。
GBDT与Boosting区别较大,它的每一次计算都是为了减少上一次的残差,而为了消除残差,可以在残差减小的梯度方向上建立模型;
在GradientBoost中,每个新的模型的建立是为了使得之前的模型的残差往梯度下降的方法。