机器学习(五)——GBDT算法

1.GBDT概述

GBDT也是集成学习Boosting家族的成员,GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型。在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是 f t-1(x),损失函数是L(y,ft-1(x)),我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数L(y,ft(x))=L(y,ft-1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。

GBDT算法在回归问题上,损失函数是(1)均方差“ls”,这个是最常见的回归损失函数(2)绝对损失“lab”(3)Huber损失“huber”,它是均方差和绝对损失的折中产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。(4)分位数损失”quantile“,对应的是分位数回归的损失函数。对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

在分类问题上,损失函数是(1)对数损失函数”deviance“

(2)指数损失函数”exponential“

GBDT的正则化,和Adaboost一样,我们也需要对GBDT进行正则化,防止过拟合。正则化有三种:

(1)类似Adaboost的正则化,即步长(learning_rate)。对于同样的训练集学习效果,较小的v意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代次数一起来决定算法的拟合效果。

(2)通过子采样比例(subsample)。注意这里的子采样和随机森林的不一样,随机森林使用的放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在【0.5,0.8】。

(3)对弱学习器即CART回归树进行正则化剪枝。

 2.scikit-learn 中GBDT类库概述

在scikit-learn中,GradientBoostingClassifier为GBDT的分类类,而GradientBoostingRegressor为GBDT的回归类。两者参数类型不完全相同,但是有些参数比如损失函数loss的选择并不相同。(并且回归类多了一个alpha)

class sklearn.ensemble.GradientBoostingClassifier(loss="deviance", learning_rate=0.1,
            n_estimators=100, subsample=1.0, criterion="friedman_mse", min_samples_split=2,
            min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0,
            min_impurity_split=None, init=None, random_state=None, max_features=None,verbose=0,
            max_leaf_nodes=None,warm_start=False, presort="auto", validation_fraction=0.1,
            n_iter_no_change=None, tol=0.0001)

class sklearn.ensemble.GradientBoostingRegressor(loss="ls", learning_rate=0.1,
            n_estimators=100, subsample=1.0, criterion="friedman_mse", min_samples_split=2,
            min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0,
            min_impurity_split=None, init=None, random_state=None, max_features=None, alpha=0.9, verbose=0,
            max_leaf_nodes=None,warm_start=False, presort="auto", validation_fraction=0.1,
            n_iter_no_change=None, tol=0.0001) 

 (1)n_estimators:弱学习器的最大迭代次数,或者数是最大的弱学习器的个数。一般来说,该参数太小,容易欠拟合,太大,容易过拟合。默认是100,在实际应用过程中,我们常常将n_estimators和learning_rate一起考虑。

(2)learning_rate:即每个弱学习器的权重缩减系数,也称为步长,在原理篇正则化章节中,加上正则化项,我们强学习器的迭代公式为fk(x)=fk-1(x)+vhk(x)。v的取值范围为0<v≤1,对于同样的训练集拟合效果,较小的v意味着需要更多的弱学习器的迭代次数,通常我们用步长和迭代次数一起决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。

(3)subsample:子采样,取值为(0,1]。这里的子采样和随机森林的子采样不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样;如果取值小于1,则只有一部分样本去做GBDT的决策树0拟合。选择小于1的比例可以减少方差,即防止过拟合,但不能取值过低,会增加样本拟合的偏差。推荐在【0.5,0.8】之间,默认为1,即不使用子采样。

(4)init:即我们初始化的时候的弱学习器,对应原理篇里面的f0(x),如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话,就不用管这个参数。

(5)loss:损失函数,分类模型和回归模型是不一样的。

                  分类模型:有对数似然损失函数“deviance”和指数损失函数“exponential”两种。默认的是对数似然损失函数“deviance”。一般来说,推荐使用默认的损失函数。它对二元分类和多元分类都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。

                 回归模型:有均方差“ls”,绝对损失“lab”,Huber损失“huber”和分位数损失“quantile”。默认的是均方差“ls”。一般来说,如果数据的噪音点不多,用默认的“ls”比较好。如果是噪音点较多,则推荐用抗噪音的损失函数“huber”。如果我们需要对训练集进行分段预测的时候,则采用“quantile”。

(6)alpha:这个参数只有在GradientBoostingRegressor中有。当我们使用“huber”和“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个alpha值。

转自:https://www.cnblogs.com/pinard/p/6140514.html

猜你喜欢

转载自blog.csdn.net/guoyang768/article/details/85229488
今日推荐