skiti-learn Adaboost类库

skiti-learn的Adaboost库中包括两个,AdaboostClassifier(分类)和AdaboostRegressor(回归)。AdaboostClassifier有两种分类算法实现,SAMME和SAMME.R;AdaboostRegressor只有Adaboost.R2。针对Adaboost调参,主要对两部分内容,第一部分是对我们Adaboost框架调参,第二部分是对我们选择的弱分类器进行调参。

  1. AdaboostClassifier和AdaboostRegressor框架参数
    1)base_estimator:
    AdaboostClassifier和AdaboostRegressor均有的参数,即弱学习器。理论上支持任何分类或者回归学习器,不过需要支持样本权重,我们一般常用CART决策树或者神经网络MLP。默认是决策树,如果选择AdaboostCLassifier的算法是 SAMME.R,则选择的弱分类器还 需要支持概率预测,也就是在scikit-learn中弱分类学习器对应的预测方法除了predict还需要有predict_proba。
    2)algorithm:
    这个参数只有AdaboostClassifier有。主要原因是skiti-learn实现了两种Adaboost分类器,SAMME和SAMME.R。两种的主要区别是弱学习器权重的度量,SAMME使用的二分类的Adaboost算法的扩展,即样本集的分类效果作为弱学习器权重,而SAMME.R使用了对样本集分类的预测概率大小来作为弱学习器权重。由于SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此AdaBoostClassifier的默认算法algorithm的值也是SAMME.R。我们一般使用默认的SAMME.R就够了,但是要注意的是使用了SAMME.R, 则弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。SAMME算法则没有这个限制。
    3)loss:
    这个参数只有AdaboostRegressor有,SAMME.R2算法需要,有‘linear’线性,‘square’平方,以及‘exponential’指数三种选择。默认为线性,一般线性就可以了,它对应了我们对第k个弱分类器的中第i个样本的误差的处理,即:如果是线性误差,则eki=|yi−Gk(xi)|/Ek;如果是平方误差,则eki=(yi−Gk(xi))²/E2;如果是指数误差,则eki=1−exp(−yi+Gk(xi))/Ek),Ek为训练集上的最大误差Ek=max|yi−Gk(xi)|i=1,2…m
    4)n_estimators:
    AdaBoostClassifier和AdaBoostRegressor都有,是我们弱学习器的最大迭代次数,或者最大弱学习器的个数。如果太小则容易欠拟合,太大容易过拟合,一般要选择一个合适的值,默认为50。
    5)learning_rate:
    AdaBoostClassifier和AdaBoostRegressor都有,即每个弱学习器的权重缩减系数ν。我们的强学习器的迭代公式为fk(x)=fk−1(x)+ν αkGk(x)。ν的取值范围为0<ν≤1。对于同样的训练集拟合效果,较小的νν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的νν开始调参,默认是1。

  2. AdaBoostClassifier和AdaBoostRegressor弱学习器参数
    由于选择的弱学习器不同,对应的学习器的参数也不同。下面仅讨论决策树弱学习器的参数。 DecisionTreeClassifier和DecisionTreeRegressor的参数基本类似,在scikit-learn决策树算法类库这篇文章中我们对这两个类的参数做了详细的解释。
    1)划分时需要考虑的最大特征数max_features:
    默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
    2)决策树最大深max_depth:
    默认可以不输入,不输入就是不限制子树的深度。一般情况,数据少或者特征少可以不管这个值,如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
    3)内部节点再划分所需要的最小样本数min_samples_leaf:
    这个值限制了子树继续划分,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
    4)叶子节点最少样本数min_samples_leaf:
    这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
    5)叶子节点最小的样本权重和min_weight_fraction_leaf:
    这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重。
    6)最大叶子节点数max_leaf_nodes:
    通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

猜你喜欢

转载自blog.csdn.net/weixin_40732844/article/details/82970334