《GBDT 梯度提升树》算法初探

在机器学习中,单棵决策树的结构太简单会因无法捕捉数据复杂规律导致欠拟合,增加树的复杂度,过度贴合训练数据,又会因记忆噪声陷入过拟合,泛化能力骤降。显然,单一模型很难同时兼顾 “精准拟合” 与 “稳健泛化”。

这时,聪明的人们想到一个思路:将多棵表现不够优秀的决策树组合起来,会不会比单棵树更强? 可以按照一句古话来理解:“三个臭皮匠顶个诸葛亮”。单个“臭皮匠”各有优缺点,但他们的优点可以互补,组成一个更强大的整体。这正是集成学习的核心思想。

在众多集成学习方法中,最经典的有两种:随机森林(Random Forest)和梯度提升决策树(GBDT)。随机森林通过同时构建多个决策树,并以多数投票的方式忽略个别树的错误,从而获得稳定的预测结果。而 GBDT 的策略则更为巧妙:不是一次性构建所有树,而是一棵一棵地构建,每棵新树专注于修正前面模型的错误。通过这种逐步优化,多个弱小的决策树最终叠加为一个强大的预测模型。

在这个课程里,我们会先直观地用 GBDT 做分类和回归,感受它的威力;然后逐步拆解它的原理,最后再结合 scikit-learn 的接口,学会在实际项目中灵活使用它。

1. 直接上手

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_regression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split


def demo01():
    # 生成数据
    x, y = make_classification(n_samples=200, random_state=42)
    # 分割数据(训练集 80%,测试集 20%)
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
    # 训练模型
    gbdt = GradientBoostingClassifier()
    gbdt.fit(x_train, y_train)
    # 评估模型
    acc = gbdt.score(x_test, y_test)
    print('Acc: %.2f' % acc)


def demo02():
    # 生成数据
    x, y = make_regression(n_samples=200, random_state=42)
    # 分割数据(训练集 80%,测试集 20%)
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
    # 训练模型
    gbdt = GradientBoostingRegressor()
    gbdt.fit(x, y)
    # 评估模型
    r2 = gbdt.score(x_test, y_test)
    print('R2: %.2f' % r2)


if __name__ == '__main__':
    demo01()
    demo02()

2. 基本思想

GBDT(梯度提升树)算法本质上是梯度优化 + 加法模型的结合。

  • 梯度优化:在构建每棵决策树时,GBDT 会根据当前模型的预测误差(梯度信息)来指导下一棵树的构建,从而逐步减小预测误差,提升模型精度,这就是梯度优化。
  • 加法模型:GBDT 的最终预测结果,是将所有弱学习器(通常是决策树)的输出加起来,形成一个强模型的预测结果,这就是加法模型。

下面通过一个例子,理解梯度优化、加法模型的概念。例如:回归 GBDT 要学习一个样本,该样本的真实输出值是 100。GBDT 先设定一个初始预测值,通常是所有样本输出的均值(回归任务的常用做法)。比如这里初始预测值设置为 50

  1. 初始预测:50,剩余误差 = 100−50=50 。
  2. 第一棵树拟合 50,预测值 = 40,剩余误差 = 50 − 40 = 10
  3. 第二棵树拟合 10,预测值 = 8,剩余误差 = 10 − 8 = 2
  4. 第三棵树拟合 2,预测值 = 3,剩余误差 = 2 − 3 = −1
  5. 第四棵树拟合 -1,预测值 = -1,剩余误差 = −1 − (−1) = 0

最终预测值: 50 + 40 + 8 + 3 + (−1) = 100,完全逼近真实值。

下面,我们先建立起对 GBDT 的初步认识:

  1. 拟合能力:GBDT 通过不停的补漏,反复针对性修正,最终结果比单棵树精准得多。
  2. 泛化能力:泛化能力的核心是平衡训练精度和模型复杂度。单棵树主要是依赖调整树的 “高度” 来平衡,把树调高就会学得太细,调低又学不透,控制粒度太粗。GBDT 则可以通过控制单棵树高度、整体树的数量、每棵树的贡献等平衡精度和复杂度,控制粒度更细。
  3. 训练效率:GBDT 的后一棵树必须等前一棵训练完,才能明确自己的补漏方向,整个过程是串行的,无法实现多棵树同时训练,训练速度偏慢。

未经允许不得转载:一亩三分地 » 《GBDT 梯度提升树》算法初探
评论 (0)

7 + 3 =