【机器学习笔记 Ⅱ】12随机森林

发布于:2025-07-09 ⋅ 阅读:(25) ⋅ 点赞:(0)

随机森林(Random Forest)详解

随机森林是一种基于集成学习(Ensemble Learning)的高性能分类/回归算法,通过构建多棵决策树并综合其预测结果,显著提升模型的准确性和鲁棒性。其核心思想是“集体智慧优于个体决策”。


1. 核心思想
  • Bagging(Bootstrap Aggregating):通过有放回抽样生成多个训练子集,每棵树独立训练。
  • 随机特征选择:每个节点分裂时,仅考虑随机子集的特征(进一步增加多样性)。
  • 投票/平均机制
    • 分类任务:多数投票(Majority Voting)。
    • 回归任务:预测均值。

2. 算法步骤
  1. 数据采样
    • 从原始训练集中通过Bootstrap抽样(有放回)生成 ( T ) 个子集(每子集≈63.2%原始数据)。
  2. 构建决策树
    • 对每个子集训练一棵决策树,节点分裂时从随机选择的 ( m ) 个特征中找最优划分(通常 ( m = \sqrt{\text{总特征数}} ))。
  3. 聚合结果
    • 分类:统计所有树的预测类别,取票数最多的类别。
    • 回归:计算所有树的预测平均值。

3. 关键特性
特性 说明
降低方差 多棵树平均减少过拟合风险(相比单棵决策树)。
抗噪声 通过多数投票抑制异常值影响。
并行化训练 各树独立训练,适合分布式计算。
特征重要性 基于特征在分裂时的贡献度(如基尼下降)自动评估。

4. 代码实现
(1) Scikit-learn分类
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# 加载数据
data = load_iris()
X, y = data.data, data.target

# 训练模型
rf = RandomForestClassifier(
    n_estimators=100,      # 树的数量
    max_depth=5,           # 单树最大深度
    max_features='sqrt',   # 每节点分裂考虑的特征数(sqrt为特征数平方根)
    random_state=42
)
rf.fit(X, y)

# 预测
y_pred = rf.predict(X)
(2) Scikit-learn回归
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

rf_reg = RandomForestRegressor(n_estimators=200)
rf_reg.fit(X_train, y_train)
mse = mean_squared_error(y_test, rf_reg.predict(X_test))
(3) 特征重要性可视化
import matplotlib.pyplot as plt

plt.barh(data.feature_names, rf.feature_importances_)
plt.xlabel("Feature Importance")
plt.show()

特征重要性


5. 超参数调优
参数 作用 推荐范围
n_estimators 树的数量 100-500(越多越好,但计算成本增加)
max_depth 单棵树的最大深度 5-30(防过拟合)
max_features 节点分裂时的特征子集大小 'sqrt'(分类)、'log2'或0.3-0.8
min_samples_split 节点分裂所需最小样本数 2-10
bootstrap 是否使用Bootstrap抽样 True(默认)

网格搜索示例

from sklearn.model_selection import GridSearchCV

param_grid = {
    'n_estimators': [100, 200],
    'max_depth': [5, 10, None],
    'max_features': ['sqrt', 'log2']
}
grid_search = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
print("最佳参数:", grid_search.best_params_)

6. 优缺点对比
优点 缺点
1. 高准确性:优于单棵决策树和许多其他算法。 1. 计算成本高:树数量多时训练慢。
2. 抗过拟合:通过随机性降低方差。 2. 内存占用大:需存储多棵树。
3. 无需特征缩放:对数据分布不敏感。 3. 可解释性弱:相比单棵树更难解释。

7. 进阶应用
(1) 异常检测

利用样本在所有树中的平均深度(Isolation Forest原理相近)。

(2) 缺失值处理

通过随机森林的相似性矩阵估算缺失值。

(3) 分类-回归混合任务

使用MultiOutputRegressor处理多目标预测。


8. 与梯度提升树(GBDT/XGBoost)对比
特性 随机森林 梯度提升树(如XGBoost)
训练方式 并行独立训练多棵树 串行训练,每棵树修正前序错误
偏差-方差 主要降低方差 同时降低偏差和方差
参数敏感性 相对不敏感 需精细调参(如学习率、树深度)
适用场景 高维数据、快速原型开发 高精度需求、中小规模数据

9. 总结
  • 随机森林 = Bagging + 随机特征选择 + 决策树,通过“集体决策”提升泛化能力。
  • 核心优势:抗过拟合、处理高维数据、天然支持特征重要性评估。
  • 适用场景
    • 分类/回归任务(尤其特征间存在复杂交互)。
    • 需要快速基线模型或特征重要性分析的场景。
  • 升级方向
    • 对速度要求高时→ 使用RandomForestwarm_start增量训练。
    • 对精度要求高时→ 尝试XGBoostLightGBM

网站公告

今日签到

点亮在社区的每一天
去签到