【机器学习|学习笔记】集成学习之随机森林(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 更精细更强。选择取决于你的数据规模、精度要求和系统复杂度需求。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐