随机森林
随机森林是决策树的升级版,随机指的是树的生长过程,构建决策树时,从训练数据中有放回的随机选取一部分样本,也不会使用数据的全部特征,而是随机选取部分特征进行训练,每棵树使用的样本和特征各不相同,训练的结果也自然不同。在训练初期,不知道哪些是异常样本,哪些特征对分类结果影响更大,随机的过程降低了两者对分类结果的影响。随机森林的输出结果由投票决定,如果大部分决策树认为测试结果是对的,则认为其是对的。
树与树之间相互独立,可以同时训练,不需要花费太长时间,随机的过程让它不容易过拟合,能处理特征较多的高维数据,也不需要做特征选择,合理训练后准确性很高。
随机森林属于集成学习,即将多个模型组合起来解决问题,这些模型会独立学习、预测、再投票出结果,准确度往往比单独的模型高很多。除了决策树,还可以使用神经网络等其他模型,集成学习内部不必是同样的模型,神经网络和决策树可以共存于一个系统中。
Boosting
采用串行的方式训练,各基分类器之间有依赖。根据当前模型损失函数的负梯度训练新的弱分类器,将训练好的弱分类器以累加的形式结合到现有模型中。
过程中会不断减小损失函数,使模型偏差不断降低,方差不会降低。因为各弱分类器之间是强相关的,缺乏独立性,不会对降低方差有作用。
Gradient Boosting
boosting中的一大类算法。每轮迭代中,首先计算出当前模型在所有样本上的负梯度,以该值为目标训练一个新的弱分类器,计算该弱分类器的权重,实现模型更新。
优点:
1)预测阶段的计算速度快,树与树之间可并行化计算。
2)在分布稠密的数据集上,泛化能力和表达能力都很好。
3)采用决策树作为弱分类器使得GBDT模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的预处理如归一化等。
缺点:
1)GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。
2)GBDT在处理文本分类特征问题上,相对其他模型的优势不如它在处理数值特征时明显。
3)训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。
GBDT在搜索、广告、推荐系统等领域有广泛应用,能处理标签、数值等各类数据,解释性强。由于树与树之间的相互依赖,需要较长的训练时间,GBDT属于集成学习。
在集成学习中,一个模型依赖于上一个模型,共同逼近正确答案的方法(如GBDT)被称为Boosting提升;模型间相互独立共同投票出结果的方法(如随机森林),则被称为Bagging装袋;还有一种Stacking堆叠,是在多个模型的基础上放置一个更高层的模型,将底层模型的输出作为它的输入,由它给出最终的预测结果。
XGBoost
一种高效实现GBDT的改进算法。原始的GBDT算法基于经验损失函数的负梯度来构造新的决策树,只是在决策树构建完成后再进行剪枝。而xgboost在决策树构建阶段就加入正则项。
xgboost 从所有的树结构中找出一个最优的树结构,是一个NP-hard问题,通常采用贪心算法( 求解问题时,总是做出当前最好的选择,不从整体最优上加以考虑,得到局部最优) 构建一个次优的树结构,基本思想:从根节点开始,每次对一个叶子节点进行分裂,针对每一种可能的分裂,根据特定的准则选取最优的分裂。不同的决策树算法采用不同的准则,如IC3算法采用信息增益,C4.5算法为了克服信息增益中容易偏向取值较多的特征而采用信息增益比,CART算法使用基尼指数和平方误差,XGBoost也有特定的准则来选取最优分裂。
XGBoost 的并行是在特征粒度上的,决策树的学习最耗时的一个步骤是对特征的值排序以确定最佳分割点,XGBoost 在训练之前,预先对数据进行了排序,保存为block结构,后面的迭代中重复地使用这个结构,减小计算量。在进行节点的分裂时,需要计算每个特征的增益,选增益最大的特征做分裂,各个特征的增益计算就可以多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,此时 xgboost 使用一种可并行的近似直方图算法,高效生成候选分割点。先通过直方图算法获得候选分割点的分布情况,根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。
XgBoost:对所有特征都按照特征的数值进行预排序,遍历分割点的时候用O(#data)的代价找到特征最好的分割点。在找到一个特征的最好分割点后,将数据分裂成左右子节点。空间消耗和时间消耗都很大,对cache优化不友好。
优点
· 目标函数包括损失函数和正则项部分。损失函数代表模型拟合数据的程度,通常使用一阶导数指出其梯度下降的方向,XGBoost还计算了它的二阶导数,进一步考虑了梯度变化的趋势,收敛更快、精度更高;正则项用来控制模型的复杂程度,叶子节点越多,模型越大,运行时间越长,超过一定限度后模型过拟合会导致精度下降,XGBoost的正则项是一个惩罚机制,叶子节点的数目越多,惩罚力度越大,从而限制他们的数量。
· 加快了计算速度。树的构建中,最耗时的部分是为确定最佳分裂点而进行的特征值排序,XGBoost在训练前会先将特征进行排序,存储为Block结构,可以实现并行处理,此后重复使用此结构来减少计算量。
· 善于捕捉复杂数据间的依赖关系,能从大规模数据中获取有效模型,在实用性上支持多种系统语言。XGBoost 允许⽤户定义⾃定义优化⽬标和评价标准它对模型增加了⼀个全新的维度,所以我们的处理不会受到任何限制,有着高度的灵活性。
· 缺失值处理:XGBoost内置处理缺失值的规则。⽤户需要提供⼀个和其它样本不同的值,然后把它作为⼀个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采⽤不同的处理⽅法,并且会学习未来遇到缺失值时的处理⽅法。
· 内置交叉验证:XGBoost允许在每⼀轮boosting迭代中使⽤交叉验证。因此,可以⽅便地获得最优boosting迭代次数。⽽GBM使⽤⽹格搜索,只能检测有限个值。
缺点:在高维稀疏特征数据集和小规模数据集上表现不是很好。
LightGBM
Light Gradient Boosting Machine,实现GBDT算法的框架,支持高效并行训练,有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。
- 基于Histogram的决策树算法。
- 单边梯度采样 Gradient-based One-Side Sampling:减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
- 互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB将许多互斥的特征绑定为一个特征,达到了降维的目的;捆绑的特征都是互斥的,即特征不会同时为非零值,这样两个特征捆绑起来不会丢失信息。
- 带深度限制的Leaf-wise的叶子生长策略:多数GBDT使用低效的按层生长 (level-wise) 决策树的生长策略,不加区分的对待同一层的叶子,带来没必要的开销,很多叶子的增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
- 直接支持类别特征(Categorical Feature);对于决策树,不推荐使用 one-hot 编码,特别是类别个数很多的情况,会产生样本切分不平衡问题,并影响决策树的学习。
- 支持高效并行
- Cache命中率优化
速度更快:
- LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;
- LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;
- LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;
- LightGBM 采用优化后的特征、数据并行方法加速,数据量大时可采用投票并行策略;
- LightGBM 优化缓存,增加了缓存命中率;
内存更小:
- XGBoost 预排序后,要记录特征值及其对应样本的统计值的索引,而 LightGBM 使用了直方图算法将特征值转变为 bin ,不需要记录特征到样本的索引,将空间复杂度从 O(2∗#data) 降低为 O(#bin) ,减少了内存消耗;
- LightGBM 采用了直方图算法将存储特征值转变为存储 bin 值,降低了内存消耗;
- LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
缺点:
- 会生成较深的决策树,过拟合。通过增加了最大深度限制,保证高效率的同时防止过拟合;
- Boosting 是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,随着迭代不断进行,误差会越来越小,模型的偏差不断降低。而 LightGBM 是基于偏差的算法,所以会对噪点较为敏感;
- 寻找最优解时,依据最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去;
方法参数:
'task': 'train',
'boosting_type': 'gbdt', # 设置提升类型
'objective': 'regression', # 目标函数
'metric': {'l2', 'auc'}, # 评估函数
'num_leaves': 31, # 叶子节点数
'learning_rate': 0.05, # 学习速率
'feature_fraction': 0.9, # 建树的特征选择比例
'bagging_fraction': 0.8, # 建树的样本采样比例
'bagging_freq': 5, # k 意味着每 k 次迭代执行bagging
'verbose': 1 # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
CatBoost
一种基于对称决策树为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,解决了高效合理处理类别型特征的问题,还解决了梯度偏差(Gradient Bias)以及预测偏移(Prediction shift)的问题,减少过拟合,提高算法的准确性和泛化能力。
- 加入了自动将类别型特征处理为数值型特征的算法。对categorical features做统计,计算某类别特征出现的频率,加上超参数,生成新的数值型特征。
- 使用了组合类别特征,利用特征之间的联系,丰富了特征维度。
- 用排序提升的方法对抗训练集中的噪声点,避免梯度估计的偏差,解决预测偏移的问题。
- 采用了完全对称树作为基模型。
CatBoost可以直接传入类别特征列标识,模型自动将其转为one-hot编码,可通过max_one_hot_size限制其长度,如果不传入特征列标识,CatBoost会把所有列视为数值特征并处理,如果特征超过设定的长度,做如下处理:
LightGBM 也可使用特征名处理标签,但不将其转为one-hot形式,但需要将标签特征转为整型变量,其不接受字符串形式的标签。
XgBoost 则只接收数值型数据。
参考:
XGBoost-LightGBM-CatBoost三大杀器 - 知乎