梯度提升树与随机森林对比详解以及python实现
有关于梯度提升树(Gradient Boosting Decision Tree, GBDT)和随机森林(Random Forest)的详解如下
一、核心思想对比
1、随机森林 — 群体的智慧(Random Forest)
- 核心思想: Bagging + 特征随机性。
- 哲学:“三个臭皮匠,顶个诸葛亮”。我独立地训练一大批“弱”模型(通常是深度较大、强力的决策树),然后让它们投票(分类)或取平均(回归)。每个模型都尽可能准确,并且相互独立。
- 关键:通过引入行采样和列采样,有意地让每棵树只看到一部分数据、一部分特征,从而确保树与树之间的差异性。这种差异性可以降低模型整体的方差。
2、梯度提升树 — 精益求精的学徒(Gradient Boosting Decision Tree, GBDT)
- 核心思想:Boosting。
- 哲学:“站在巨人的肩膀上”。我顺序地训练一大批“弱”模型(通常是深度较浅的决策树,如不超过5层)。第一棵树学习任务,第二棵树学习第一棵树犯的错误(即残差),第三棵树学习前两棵树剩下的错误,如此反复。
- 关键:每一棵新树的目标都是修正前一棵(或前几棵)树的错误。通过不断迭代,模型在之前表现不好的数据点上持续改进,从而逐步降低偏差。
- 随机森林像一个专家委员会。每个专家独立研究问题并提出自己的方案,最后通过民主投票决定最终方案。即使有个别专家出错,也不会影响大局。
- 梯度提升树像一个实习生团队。第一个实习生做完工作后,由第二个实习生检查并修正第一个的错误;第三个实习生再检查并修正前两个留下的错误…… 经过多轮迭代,最终成果会非常出色。
二、训练过程对比
| 特性 | 随机森林 | 梯度提升树 |
|---|---|---|
| 基学习器 | 决策树(通常深度较大,低偏差高方差) | 决策树(深度很浅,如树桩,高偏差低方差) |
| 集成方式 | Bagging | Boosting |
| 树关系 | 并行生成,树与树之间相互独立。 | 串行生成,后一棵树依赖于前一棵树的结果。 |
| 数据使用 | 对训练集进行Bootstrap抽样(有放回抽样),每棵树用不同的子集训练。 | 每一棵树都使用全部训练数据(但会为每个样本分配不同的权重)。 |
| 目标/标签 | 每棵树学习原始数据的真实标签。 | 从第二棵树开始,学习的是残差(真实值 - 当前模型预测值),即负梯度方向。 |
| 随机性来源 | 1. 数据行的Bootstrap抽样。 2. 分裂节点时特征的随机抽样。 | 1. 每棵树训练时也可对特征进行抽样(如XGBoost)。 2. 主要随机性来自于模型对数据顺序学习的依赖性。 |
三、梯度提升树的python库实现
梯度提升树在Python中有多个强大的库实现,其中最著名的包括scikit-learn中的GradientBoostingClassifier/GradientBoostingRegressor,以及专门优化的XGBoost、LightGBM和CatBoost。下面将分别介绍这些库的基本使用方法。
1、scikit-learn的GradientBoosting
from sklearn.ensemble import GradientBoostingClassifier, GradientBoostingRegressor
from sklearn.datasets import make_classification, make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, mean_squared_error
import numpy as np# 分类示例
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建GBDT分类器
gbc = GradientBoostingClassifier(n_estimators=100, # 树的数量learning_rate=0.1, # 学习率max_depth=3, # 每棵树的最大深度subsample=0.8, # 子采样比例random_state=42
)# 训练和预测
gbc.fit(X_train, y_train)
y_pred = gbc.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred):.4f}")# 回归示例
X_reg, y_reg = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42)
X_train_r, X_test_r, y_train_r, y_test_r = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)gbr = GradientBoostingRegressor(n_estimators=100,learning_rate=0.1,max_depth=4,random_state=42
)gbr.fit(X_train_r, y_train_r)
y_pred_r = gbr.predict(X_test_r)
print(f"MSE: {mean_squared_error(y_test_r, y_pred_r):.4f}")
四、随机森林的参数与梯度提升的参数对比
由于随机森林(Random Forest)和梯度提升树(Gradient Boosting)都是基于决策树的集成方法,所以有些参数是共有的(如树的相关参数),但也有一些参数是各自特有的,因为它们基于不同的集成思想(Bagging vs Boosting)。
1、核心参数对比表
| 参数类别 | 参数名称 | 随机森林 | 梯度提升树 | 作用与区别 |
|---|---|---|---|---|
| 基础参数 | n_estimators | 树的数量(通常较大:100-500) | 树的数量(通常较大:100-1000) | 两者都重要,但GBDT对数量更敏感 |
random_state | 随机种子 | 随机种子 | 保证结果可重现 | |
| 树结构参数 | max_depth | 通常较深(5-15),不限制过拟合 | 通常较浅(3-8),防止过拟合 | RF树是强学习器,GBDT树是弱学习器 |
min_samples_split | 节点分裂最小样本数 | 节点分裂最小样本数 | 作用相似,都用于防止过拟合 | |
min_samples_leaf | 叶节点最小样本数 | 叶节点最小样本数 | 作用相似,控制树生长 | |
max_features | √(重要参数) | √(可选参数) | RF中用于增加多样性,GBDT中用于正则化 | |
| 学习过程参数 | learning_rate | ×(不存在) | √(核心参数) | GBDT特有,控制每棵树的贡献程度 |
subsample | √(Bootstrap采样) | √(随机梯度提升) | RF默认1.0(有放回),GBDT可小于1.0 | |
loss / criterion | gini, entropy | deviance, exponential等 | 损失函数/分裂标准,选择不同 | |
| 正则化参数 | 正则化项 | ×(通常无) | √(L1/L2正则化) | GBDT特有,控制模型复杂度 |
