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

目录

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

一、随机森林的基本概念

二、随机森林的核心机制

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

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

三、随机森林的工作流程

1. 训练阶段

2. 预测阶段

四、随机森林的优缺点

优点

缺点

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

六、随机森林的应用场景

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

1. 导入库和数据

2. 构建并训练随机森林模型

3. 模型评估

4. 特征重要性分析

5. 运行结果解读


一、随机森林的基本概念

随机森林(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. 构建并训练随机森林模型

# 初始化随机森林分类器
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. 特征重要性分析

# 输出特征重要性
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生态繁荣发展。

更多推荐