Ensemble 调参之道

Ensemble learning

bagging

从训练集中进行子抽样,然后组成每个基模型所需要的子训练集,对所有的基模型预测结果进行综合产生最终的预测结果:

Boosting

训练过程为阶梯状,基模型按次序一一进行训练,基模型的训练集按照某种策略每次都进行一定的转化。对所有基模型预测的结果进行线性的综合,从而产生最终结果。

Stacking

将训练好的所有基模型对训练基进行预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,然后再对测试集进行预测。

模型的偏差和方差

如上图所示,High variance是模型过于复杂,记住太多细节,导致果泥和;而High Bias是由于模型过于简单,导致欠拟合。

强模型与弱模型

强模型

偏差低,方差高,在训练集上的准确度高,但是防止过拟合的能力弱,例如Bagging和Stacking模型

弱模型

偏差高,方差低,在训练集上的准确度低,但是防止过拟合的能力强,Boosting就属于这类型。

Ensemble model的偏差与方差

bagging的偏差和方差

显然,整体的模型的期望近似等于基模型的期望,也就是说整体模型的偏差和单个基模型的偏差相似,同时,根据方差的公式,整体模型的方差小雨基模型的方差,随着基模型数量m的增多,整体模型的方差将会减少,从而可以防止过拟合,进一步提升模型的准确度。因此,就bagging而言,主要的目的是为了降低模型的方差

注意到要降低整个模型的方差,除了增加模型的数量外,还可以减少相关系数低值,对于随机森林这类典型的bagging的模型,为了近一步降低方差,在树的内部节点分裂过程中,不再是将所有特征,耳式随机抽样一部分特征纳入分裂的候选项,这样一来,基模型之间的相关性降低,在方差公式中,第一项显著减少,第二项稍微增加,整体方差仍在减少。

Boosting的偏差和方差

显然,如果boosting的基模型不是弱模型,则基模型的方差较大,就会导致整体模型的方差很大,这样就达不到防止过拟合的效果了,所以,在boosting中,模型必须为弱模型,即偏差高,方差小。

因为基模型为弱模型,导致每个基模型的准确度并不是很高,但是随着基模型的数量增多,整体模型的期望值增加,从而整体模型的准确度提高。

调参思想

调参的主要目的是使的模型在训练集上的准确度和防止过拟合能力的大和谐,从以上理论角度分析得到:

  1. 使用模型的偏差和方差描述其在训练集上的准确度和防止过拟合能力
  2. 对于bagging来说,整体模型的偏差和基模型的偏差近似,随着训练的进行,整体模型的方差降低
  3. 对于boosting来说,整体模型的初始偏差较高,方差较低,随着训练的进行,整体模型的偏差降低,然而伴随着方差的增高,因此当训练过度时,因为方差的增高导致整体模型的准确度反而降低。
  4. 整体模型的偏差和方差与基模型的方差和偏差息息相关。

Random Forest 和 Gradient Tree Boosting 参数详解

参数 这里将模型的参数分为4类:目标类,性能类,效率类和附加类。

参数小结

显然,基于bagging的随机森林模型和基于boosting的Gradient Tree Boosting模型有着不少共同的参数。随机森林的子模型需要拥有较低的偏差,整体模型的训练过程旨在降低方差,记得上面说到,有两种方式,第一增加模型数量,第二减少模型之间的相关度,因此,n_estimators默认值为10 , 且子模型不是弱模型(max_depth默认值设置为None,也就是说树的深度足够深),同时,降低子模型的相关度(max_features设置为总特征数的开方);另一方面,GradientTreeBoosting的子模型都是有着较低的方差,整个模型的目的是为了降低偏差,因此,需要较多的子模型(n_estimators)且子模型为弱模型(max_depth默认为3),但是降低子模型之间的相关度并不会显著减少整体模型的方差(max_features设置为None)

如何调参

调参的目标:偏差和方差的协调

参数可以分成两种类型:过程影响类子模型影响类。在子模型不变的前提下,某些参数可以通过改变训练的过程,从而影响模型的性能,例如:子模型数n_estimators,学习率learning_rate 等。另外,我们还可以通过改变子模型性能来影响整体模型等性能,例如:最大树深度max_depth , 分裂条件criterion,正由于bagging度训练旨在降低方差,而boosting度训练过程旨在降低偏差,过程影响类度参数能够引起整体模型性能度大幅度变化。因此,一般来说,在此前提下,我们需要继续微调子模型影响参数,从而进一步提高模型度性能

参数对整体模型性能度影响

对于随机森林来说,为了达到减少方差的目的,一般选择增加子模型数和降低模型相关度的参数。增加子模型数n_estimators可以明显的降低整体模型的方差,且不会对子模型的偏差和方差有任何影响。模型的准确度随着子模型数的增加而提高。由于减少的是整体模型的方差公式的第二项,孤儿准确度的提高会有一个上限。在不同场景下,分裂条件criterion对模型的影响也不一样,该参数需要视情况而定。接下来可以对基模型进行粗粒度的调整,此时调整最大叶结点数max_leaf_nodes以及最大树深度max_depth之一,可以粗粒度的调整树的结构:叶结点越多或者树越深,则意味着子模型的偏差月底,方差越高:同时,调整分裂所需要的最小样本数min_samples_split,叶结点最小样本数min_samples_leaf和叶结点最小权重总值min_weight_fraction_leaf,可以更细粒度的调整树结构:分裂所需样本数越少或者叶结点所需要的样本越少,也就意味着子模型越复杂。而在降低相关度方面,我们采用bootstrap对样本进行子采用来境地子模型之间的关联度,从而降低整个模型的方差。适当地减少分裂时考虑的最大特征数max_features,给子模型注入另外的随机性,同样也可以达到子模型之间关联度的效果。但是一味降低该参数时不行的,因为分裂可选特征变少,模型的偏差就会越来越大。

对于GradientTreeBoosting来说,子模型数n_estimators和学习率learning_rate需要联合调整才能尽可能地提高模型度准确度。切记,boosting旨在降低模型度偏差,所以子模型越复杂,对应整体模型偏差地,方差高,所以最大叶结点数max_leaf_nodes,最大树深度max_depth等控制子模型等参数与随机森林一致。类似分裂时考虑的最大特征数max_features,降低子采样率subsample,也会造成子模型间的关联度降低,整体模型的方差减少,但是当子采样率低到一定晨读时,子模型的偏差增大,将引起整体模型的准确度降低。

总结

目前,在调参领域里,有一些常用的经验法则,Aarshay Jain针对XGBoost就总结了一套调参方法,其核心思想在于:对于过程影响参数进行调整,比较它们对整体模型的性能影响最大,然后依据经验,在其他参数中选择对整体模型性能影响较大的参数,进行下一步调参。这种方法的关键在于依照对整体模型性能度影响力给参数进行排序,然后按照该顺序对参数进行调整,如何衡量参数对整体模型性能的影响力呢?基于经验,Aarshay提出他的见解:最大叶结点数max_leaf_modes和最大树深度max_depth对整体模型性能的影响大于分裂所需要的最小样本数min_samples_split,叶结点最小样本数min_samples_leaf以及叶结点最小权重总值min_weight_fraction_leaf,而分裂时考虑的最大特征数max_features的影响力最小。

注意类别不均衡的情况

当正例的样本数量远小于反例,如果按照调参的初始值,将max_depth默认设置为3,那么此时子模型早已过拟合,在后面的调参中,分裂所需最小样本数min_samples_split,叶结点最小样本数min_samples_leaf再怎么调也没什么作用。所以,在类别不均衡的情况下,只有先确定叶结点最小样本数min_samples_leaf,再确定分裂所需要最小样本数min_samples_split,然后再确定最大深度max_depth

以下策略可以用于类别不均衡的情况:

  • 首先,初步调一次子采样率subsample和分裂时考虑的最大特征数max_featyres,在此基础上一次调整叶结点最小样本数min_samples_leaf,分裂所需要的最小样本数min_samples_split以及最大深度max_depth,然后,按照Aarshay的方法,按照影响力从大到小再调一次。

参考文献

热评文章