在机器学习中,单棵决策树的结构太简单会因无法捕捉数据复杂规律导致欠拟合,增加树的复杂度,过度贴合训练数据,又会因记忆噪声陷入过拟合,泛化能力骤降。显然,单一模型很难同时兼顾 “精准拟合” 与 “稳健泛化”。
这时,聪明的人们想到一个思路:将多棵表现不够优秀的决策树组合起来,会不会比单棵树更强? 可以按照一句古话来理解:“三个臭皮匠顶个诸葛亮”。单个“臭皮匠”各有优缺点,但他们的优点可以互补,组成一个更强大的整体。这正是集成学习的核心思想。
在众多集成学习方法中,最经典的有两种:随机森林(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。
- 初始预测:50,剩余误差 = 100−50=50 。
- 第一棵树拟合 50,预测值 = 40,剩余误差 = 50 − 40 = 10
- 第二棵树拟合 10,预测值 = 8,剩余误差 = 10 − 8 = 2
- 第三棵树拟合 2,预测值 = 3,剩余误差 = 2 − 3 = −1
- 第四棵树拟合 -1,预测值 = -1,剩余误差 = −1 − (−1) = 0
最终预测值: 50 + 40 + 8 + 3 + (−1) = 100,完全逼近真实值。

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