梯度提升树 GBDT

什么是梯度提升树?

  • 梯度提升树(Gradient Boosting Decision Tree,简称 GBDT)是一种集成学习算法,它通过构建多个决策树来逐步修正之前的预测错误,从而提高模型的整体性能

梯度提升树如何应用于分类任务?

  • 梯度提升分类器(GradientBoostingClassifier)支持二进制和多级分类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     >>> from sklearn.datasets import make_hastie_10_2
    >>> from sklearn.ensemble import GradientBoostingClassifier

    >>> X, y = make_hastie_10_2(random_state=0)
    >>> X_train, X_test = X[:2000], X[2000:]
    >>> y_train, y_test = y[:2000], y[2000:]

    >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,
    ... max_depth=1, random_state=0).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.913...

梯度提升树如何用于回归任务?

  • GradientBoostingRegressor 支持许多不同的回归损失函数,可以通过参数 loss 来指定;回归的默认损失函数是平方误差(‘squared_error’)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     >>> import numpy as np
    >>> from sklearn.metrics import mean_squared_error
    >>> from sklearn.datasets import make_friedman1
    >>> from sklearn.ensemble import GradientBoostingRegressor

    >>> X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0)
    >>> X_train, X_test = X[:200], X[200:]
    >>> y_train, y_test = y[:200], y[200:]
    >>> est = GradientBoostingRegressor(
    ... n_estimators=100, learning_rate=0.1, max_depth=1, random_state=0,
    ... loss='squared_error'
    ... ).fit(X_train, y_train)
    >>> mean_squared_error(y_test, est.predict(X_test))
    5.00...

为什么梯度提升树 (Gradient Boosting Decision Tree, GBDT) 只能由回归树组成?

  • 因为 GBDT 是加法模型,主要是利用残差逼近的方式,这就意味每棵树的值是连续的可叠加的,这一点和回归树输出连续值不谋而合,如果采用分类树,那么残差逼近进行叠加就会使得这种叠加没有意义,比如男 + 男 + 女 = 到底是男是女。这个是 GBDT 基本原理决定的