机器学习之随机森林(Random Forest)详解

一、随机森林的基本概念

随机森林(Random Forest)是一种集成学习(Ensemble Learning) 算法,由多个决策树(Decision Tree)集成而成。它通过** bootstrap 抽样特征随机选择**两种随机性机制,综合多棵决策树的预测结果,最终输出更稳定、更准确的预测结论。

其核心思想是“三个臭皮匠顶个诸葛亮”——单棵决策树容易过拟合(对训练数据拟合过好,泛化能力差),而多棵决策树通过合理组合可以降低方差、提升模型的泛化能力。

二、随机森林的核心机制

随机森林的“随机性”体现在两个关键步骤,这也是它优于单棵决策树的核心原因:

1. Bootstrap 抽样(样本随机性)

  • 从原始训练集中,有放回地随机抽取 n 个样本(n 与原始数据集大小相同),形成一个新的子训练集。
  • 每棵决策树都基于不同的 Bootstrap 子数据集训练,避免因单一数据集的偏差影响模型。
  • 未被抽取的样本:每次抽样约有 36.8% 的样本未被选中(称为“袋外样本,OOB”),可用于无额外验证集时的模型评估。

2. 特征随机选择(特征随机性)

  • 在决策树的每个节点分裂时,不从所有特征中选择最优分裂特征,而是随机选择一部分特征(通常为 √总特征数总特征数/2),仅从这部分特征中寻找最优分裂点。
  • 该机制降低了多棵决策树之间的相关性,避免“强特征”主导所有树的分裂,提升集成效果的多样性。

三、随机森林的工作流程

1. 训练阶段

  1. 对原始训练集进行 k 次 Bootstrap 抽样,生成 k 个不同的子训练集(k 为决策树数量)。
  2. 对每个子训练集,构建一棵决策树:
    • 每个节点分裂时,随机选择部分特征。
    • 不进行剪枝(随机森林通过多棵树的集成降低过拟合,单棵树可保留一定复杂度)。
  3. 重复步骤 2,生成 k 棵独立的决策树,组成随机森林。

2. 预测阶段

  • 分类任务:统计所有决策树的预测类别,选择出现次数最多的类别作为最终预测结果(多数投票法)。
  • 回归任务:计算所有决策树预测值的平均值,作为最终预测结果(均值法)。

四、随机森林的优缺点

优点

  1. 泛化能力强:通过样本和特征的双重随机性,有效降低过拟合风险,对噪声数据不敏感。
  2. 适用性广:支持分类和回归任务,无需对数据做过多预处理(如归一化、标准化),可直接处理混合类型特征(数值型、类别型)。
  3. 抗缺失值能力:对缺失数据不敏感,可通过特征重要性自动处理部分缺失特征的影响。
  4. 可解释性较好:能输出特征重要性(通过特征在分裂中的贡献度计算),帮助理解数据规律。
  5. 训练效率高:多棵树可并行训练(无依赖关系),适合大规模数据集。

缺点

  1. 计算成本较高:训练多棵决策树需更多计算资源和时间,模型规模较大时推理速度可能较慢。
  2. 复杂场景下的局限性:在高维稀疏数据(如文本)上,性能可能不如线性模型或深度学习模型。
  3. 过度拟合极端数据集:当数据集存在大量高度不平衡的类别时,可能倾向于预测多数类。

五、随机森林的关键参数(以 Scikit-learn 为例)

在实际使用中,需通过调参优化模型性能,核心参数包括:

参数 作用 常用取值范围
n_estimators 决策树数量,数量过少易欠拟合,过多增加计算成本。 100-1000(默认100)
max_features 每个节点分裂时随机选择的特征数量,控制特征随机性。 分类:'sqrt';回归:'log2'
max_depth 决策树最大深度,限制单棵树复杂度,过深可能过拟合。 无限制(默认None)或5-30
min_samples_split 节点分裂所需的最小样本数,过小易过拟合。 2-20(默认2)
min_samples_leaf 叶节点所需的最小样本数,过小易过拟合。 1-10(默认1)
bootstrap 是否使用 Bootstrap 抽样,False 则所有树使用原始数据集。 默认为True
oob_score 是否使用袋外样本评估模型,仅当 bootstrap=True 时有效。 默认为False

六、随机森林的应用场景

随机森林因其稳定性和易用性,在多个领域被广泛应用:

  1. 金融领域:信用评分、风险预测(如贷款违约概率)。
  2. 医疗领域:疾病诊断、患者预后分析(结合症状和病史预测病情发展)。
  3. 电商领域:用户行为预测、商品推荐(通过用户特征预测购买偏好)。
  4. 环境科学:气候预测、污染溯源(分析多因素对环境的影响)。
  5. 工业领域:设备故障诊断(通过传感器数据预测设备健康状态)。

七、随机森林实战案例:鸢尾花分类

以下是使用 Python 的 Scikit-learn 库实现随机森林分类的完整案例,以经典的鸢尾花数据集为例:

1. 导入库和数据

# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
from sklearn.feature_selection import SelectFromModel

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
y = iris.target  # 标签:3种鸢尾花类别

# 数据集划分(训练集80%,测试集20%)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42  # 固定随机种子,保证结果可复现
)
### 2. 构建并训练随机森林模型
```python

# 初始化随机森林分类器
rf_model = RandomForestClassifier(
    n_estimators=100,  # 100棵决策树
    max_features='sqrt',  # 分类任务默认使用sqrt(n_features)
    random_state=42,  # 固定随机种子
    oob_score=True  # 使用袋外样本评估
)

# 训练模型
rf_model.fit(X_train, y_train)

# 查看袋外样本得分(OOB score)
print(f"OOB 得分: {rf_model.oob_score_:.4f}")
### 3. 模型评估

# 在测试集上预测
y_pred = rf_model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集准确率: {accuracy:.4f}")

# 详细分类报告(精确率、召回率、F1分数)
print("\n分类报告:")
print(classification_report(
    y_test, y_pred,
    target_names=iris.target_names  # 显示类别名称
))



### 4. 特征重要性分析
python
运行
# 输出特征重要性
feature_importance = pd.DataFrame({
    '特征': iris.feature_names,
    '重要性': rf_model.feature_importances_
}).sort_values(by='重要性', ascending=False)

print("\n特征重要性排序:")
print(feature_importance)
### 5. 运行结果解读
OOB 得分: 0.9583
测试集准确率: 1.0000

分类报告:
              precision    recall  f1-score   support

     setosa       1.00      1.00      1.00        10
 versicolor       1.00      1.00      1.00         9
  virginica       1.00      1.00      1.00        11

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

特征重要性排序:
             特征      重要性
2       petal length (cm)  0.449879
3        petal width (cm)  0.431392
0       sepal length (cm)  0.093591
1        sepal width (cm)  0.025138
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐