【机器学习|学习笔记】集成学习之随机森林(Random Forest) 与 梯度提升树(GBDT,Gradient Boosted Decision Trees)算法详解?
·
【机器学习|学习笔记】集成学习之随机森林(Random Forest) 与 梯度提升树(GBDT,Gradient Boosted Decision Trees)算法详解?
【机器学习|学习笔记】集成学习之随机森林(Random Forest) 与 梯度提升树(GBDT,Gradient Boosted Decision Trees)算法详解?
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/148877490
✅ 一、背景简介:为什么提出 Random Forest 和 GBDT?
- 早期单一决策树虽然可解释性强,但有以下问题:
| 问题 | 说明 |
|---|---|
| 高方差 | 对数据敏感,容易过拟合 |
| 高偏差 | 简单模型无法拟合复杂分布 |
| 稳定性差 | 小数据扰动模型结果变化大 |
为了解决这些问题,集成模型被提出,其中:
- 🎯 随机森林(RF):通过Bagging + 特征扰动,降低方差。
- 🚀 GBDT(提升树):通过Boosting,逐步拟合残差,降低偏差。
🔍 二、原理对比:随机森林 vs GBDT
| 对比维度 | 随机森林(RF) | GBDT(梯度提升树) |
|---|---|---|
| 集成方式 | Bagging(并行) | Boosting(串行) |
| 模型顺序 | 各树独立并行训练 | 每棵树依赖前一棵树残差 |
| 目标 | 降低方差 | 降低偏差 |
| 特征选择 | 每个节点随机选部分特征 | 全特征使用 |
| 样本选择 | Bootstrap 采样 | 所有样本都用,部分加权 |
| 决策树深度 | 通常较深 | 通常浅(防过拟合) |
| 超参数调节 | 相对少 | 超参数更多 |
| 训练速度 | 快,可并行 | 慢,串行 |
| 对异常点 | 鲁棒 | 敏感 |
| 回归损失 | 平均 | 残差拟合(如平方损失) |
🧪 三、Python 实现:随机森林 vs GBDT
✅ 数据准备:
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
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, stratify=y, random_state=42)
✅ 1. 随机森林(Random Forest)
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=100, # 树的数量
max_depth=7, # 每棵树的深度
max_features="sqrt", # 特征采样策略
random_state=42,
n_jobs=-1
)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
print(f"🎯 Random Forest Accuracy: {accuracy_score(y_test, y_pred_rf):.4f}")
✅ 2. GBDT(Gradient Boosting)
from sklearn.ensemble import GradientBoostingClassifier
gbdt = GradientBoostingClassifier(
n_estimators=100, # 迭代次数
learning_rate=0.1, # 学习率
max_depth=3, # 弱分类器深度
subsample=1.0, # 可设为 <1.0 增强泛化
random_state=42
)
gbdt.fit(X_train, y_train)
y_pred_gbdt = gbdt.predict(X_test)
print(f"🚀 GBDT Accuracy: {accuracy_score(y_test, y_pred_gbdt):.4f}")
📊 四、可视化对比学习过程(Boosting 示例)
import matplotlib.pyplot as plt
test_scores = []
for n in range(10, 101, 10):
gbdt = GradientBoostingClassifier(n_estimators=n, max_depth=3, learning_rate=0.1)
gbdt.fit(X_train, y_train)
test_scores.append(gbdt.score(X_test, y_test))
plt.plot(range(10, 101, 10), test_scores, marker='o')
plt.title("GBDT Test Accuracy vs n_estimators")
plt.xlabel("Number of Estimators")
plt.ylabel("Accuracy")
plt.grid(True)
plt.show()
🧠 五、总结对比表:随机森林 vs GBDT
| 维度 | 随机森林(RF) | GBDT(提升树) |
|---|---|---|
| 并行支持 | ✅ 支持 | ❌ 串行计算 |
| 训练速度 | 快 | 慢 |
| 准确率 | 中高 | 较高 |
| 易调参 | 容易 | 较复杂 |
| 抗噪声能力 | 好 | 较差 |
| 是否易过拟合 | 否 | 是(需控制) |
| 特征重要性 | 可解释 | 可解释 |
| 应用场景 | 快速 baseline、多分类 | 高精度任务(排序、点击率等) |
✅ 六、如何选择?
| 应用场景 | 推荐算法 | 原因 |
|---|---|---|
| 模型训练速度关键 | 随机森林 | 并行高效,调参简单 |
| 模型精度优先 | GBDT(或 XGBoost) | 精度更高,灵活性好 |
| 特征数量多,维度高 | 随机森林 | 抗高维 |
| 少量数据、精细建模 | GBDT | 可拟合非线性关系 |
| 工程部署简洁 | RF | 稳定易部署 |
总结一句话:
- 🎯 随机森林更鲁棒更快,GBDT 更精细更强。选择取决于你的数据规模、精度要求和系统复杂度需求。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)