当前位置: 首页 > news >正文

机器学习(9)——随机森林

文章目录

  • 1. 随机森林的基本原理想
  • 2. 算法流程
    • 2.1. 数据采样(Bootstrap):
    • 2.2. 构建决策树:
    • 2.3. 聚合预测:
  • 3. 随机森林的构建过程
    • 3.1. 数据集的随机抽样
    • 3.2. 决策树的训练
    • 3.3. 树的生长
    • 3.4. 多棵树的集成
    • 3.5. 输出预测结果
  • 4. 随机森林的关键参数
  • 5. 数学原理
  • 6. 随机森林的优缺点
  • 7. 特征重要性评估
  • 8. 随机森林的应用
  • 9. 样例代码
  • 10. 如何提升随机森林的性能
  • 11. 小结

1. 随机森林的基本原理想

随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,属于监督学习的一种,广泛应用于分类和回归任务。它通过构建多个决策树(Decision Tree),并通过集成学习的思想,最终输出多个决策树的结果的平均值或多数投票结果,从而提高模型的准确性和稳定性

随机森林的核心思想是通过构建多个决策树,并结合它们的结果来进行预测。与单一的决策树相比,随机森林在处理复杂的任务时能够显著提高预测性能。它通过集成不同的弱分类器(决策树)来形成一个强分类器。

随机森林通过以下两个主要方面引入随机性:

  • 随机采样数据:对于每棵决策树,在训练时从原始数据集中进行有放回的随机抽样,这种方法称为Bootstrap抽样(Bootstrap sampling)。也就是说,每棵树使用的数据集是从原始数据中随机选择的,且有可能重复抽取某些数据点。

  • 随机选择特征:在每个决策树的每个节点,选择一个随机的特征子集来进行分裂,而不是使用所有特征。这种做法减少了不同决策树之间的相关性,增强了模型的多样性。

2. 算法流程

2.1. 数据采样(Bootstrap):

  • 从原始数据集 D D D 中有放回地抽取 n n n 个样本,生成 T T T 个子集 D 1 , D 2 , … , D T D_1,D_2,…,D_T D1,D2,,DT

2.2. 构建决策树:

  • 对每个子集 D i D_i Di,训练一棵决策树 h i h_i hi
    • 在每个节点分裂时,从 m m m 个特征中随机选择 k k k 个(通常 k = m k = \sqrt{m} k=m log ⁡ 2 ( m ) \log_2(m) log2(m))。
    • 选择最佳分裂特征和阈值(基于基尼不纯度或信息增益)。

2.3. 聚合预测:

  • 分类任务:投票(多数表决)。
  • 回归任务:平均预测值。

3. 随机森林的构建过程

构建一个随机森林的过程通常包括以下几个步骤:

3.1. 数据集的随机抽样

首先,从训练数据集中随机选取多个子集(通常是有放回的抽样),每个子集的大小与原始数据集相同(或稍小)。每个子集将用于训练一棵独立的决策树。

3.2. 决策树的训练

对于每个训练子集,构建一棵决策树。在每个节点的划分时,随机选择一个特征子集,而不是使用所有特征,从而减少不同决策树之间的相关性。

3.3. 树的生长

决策树继续生长,直到满足一定条件(例如,树的深度达到预设的最大值,或者节点的样本数小于某个阈值)为止。注意,随机森林通常不剪枝(pruning)决策树,这有助于减少偏差。

3.4. 多棵树的集成

随机森林通过集成所有决策树的预测结果来给出最终预测。对于分类任务,通常采用多数投票法;对于回归任务,通常计算各树输出的平均值。

3.5. 输出预测结果

分类任务:每棵树都会给出一个类别标签,随机森林根据多数投票的原则来确定最终的分类结果。
回归任务:每棵树给出一个连续的数值预测,随机森林通过计算这些预测的平均值来得到最终的回归结果。

4. 随机森林的关键参数

  • n_estimators:森林中树的数量。通常越大越好,但计算成本增加(默认100)。
  • max_depth:决策树的最大深度,控制树的复杂度。较小的值会减少过拟合,但可能导致欠拟合;较大的值可能导致过拟合。
  • max_features:每次分裂时考虑的最大特征数。较小的值能增加模型的随机性,提高模型的多样性。
    • 分类:sqrt(n_features)(默认)。
    • 回归:n_features / 3。
  • min_samples_split:一个节点分裂所需的最小样本数(默认2)。如果某个节点的样本数小于此值,则不会继续分裂。
  • min_samples_leaf:叶节点最少的样本数,控制树的生长(默认1)。较大的值有助于防止过拟合。
  • bootstrap:是否采用自助法(bootstrap)进行数据采样,默认是True,表示使用有放回的抽样。
  • oob_score:是否使用袋外数据(Out-of-Bag data)来评估模型的性能,默认是False。

5. 数学原理

  • Bagging的方差减少:
    设单棵树的方差为 σ 2 σ^2 σ2 T T T棵树的平均预测方差为:
    Var ( 1 T ∑ i = 1 T h i ( x ) ) = σ 2 T + ρ σ 2 ( 1 − 1 T ) \text{Var} \left( \frac{1}{T} \sum_{i=1}^{T} h_i(x) \right) = \frac{\sigma^2}{T} + \rho \sigma^2 \left( 1 - \frac{1}{T} \right) Var(T1i=1Thi(x))=Tσ2+ρσ2(1T1)
    ρ ρ ρ 为树间相关系数,随机特征选择可降低 ρ ρ ρ

  • 泛化误差上界:
    Error ≤ ρ ˉ ( 1 − s 2 ) s 2 \text{Error} \leq \frac{\bar{\rho}(1 - s^2)}{s^2} Errors2ρˉ(1s2)
    ρ ˉ \bar{\rho} ρˉ:树间平均相关性。
    s s s:单棵树的平均准确率。

6. 随机森林的优缺点

  • ✅ 优点:

    • 高准确性:通过集成降低过拟合风险。

    • 鲁棒性强:对噪声和异常值不敏感。

    • 可并行化:每棵树独立训练。

    • 特征重要性评估:基于分裂时的贡献度。

  • ❌ 缺点:

    • 计算成本高:树数量多时训练慢。

    • 解释性差:相比单棵树更难可视化。

    • 对高维稀疏数据(如文本)效果一般。

7. 特征重要性评估

  • 基于基尼重要性(Gini Importance):

    • 统计每个特征在所有树中分裂时减少的基尼不纯度总和。
  • 基于排列重要性(Permutation Importance):

    • 打乱特征值后观察模型性能下降程度。

8. 随机森林的应用

随机森林在许多领域有广泛的应用,包括但不限于:

  • 分类任务:如图像识别、垃圾邮件过滤、疾病预测、信用卡欺诈检测等。
  • 回归任务:如房价预测、股票市场分析等。
  • 特征选择:通过计算各个特征的重要性,帮助选择最具代表性的特征,进行后续建模。
  • 异常检测:通过判断某个样本与其他样本的区别,进行异常检测。

9. 样例代码

# 导入所需的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 标签数据# 将数据集分为训练集和测试集,80% 用于训练,20% 用于测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)# 训练模型
rf_classifier.fit(X_train, y_train)# 在测试集上进行预测
y_pred = rf_classifier.predict(X_test)# 输出分类报告和准确率
print("Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))# 输出特征重要性
print("\nFeature Importance:", rf_classifier.feature_importances_)

10. 如何提升随机森林的性能

尽管随机森林已经是一种强大的机器学习算法,但在某些情况下,仍然可以通过以下方法来提升其性能:

  • 增加树的数量(n_estimators):增加树的数量可以提高模型的准确性,但也会增加计算的开销。通常,树的数量达到一定水平后,性能提升会趋于平稳。
  • 调整特征选择的数量(max_features):尝试调整在每个节点分裂时使用的特征数量,选择合适的值可以帮助提高模型的多样性和性能。
  • 通过交叉验证选择最佳超参数:使用交叉验证(cross-validation)来选择最佳的超参数,例如树的最大深度、最小样本数等。
  • 使用更多的样本(更大的数据集):如果条件允许,可以使用更多的训练样本,帮助模型捕捉到更丰富的规律。

11. 小结

随机森林通过Bagging+随机特征构建多样化的决策树群,平衡偏差与方差,适用于大多数表格数据任务。其优势在于易用性、鲁棒性和可解释性(通过特征重要性)。在实际应用中,需注意:

  • 树数量:通常100~500足够。

  • 特征子集大小:分类用 sqrt(n_features),回归用 n_features/3。

  • 避免过拟合:控制树深度(max_depth)和叶节点样本数(min_samples_leaf)。

相关文章:

  • 使用 VMware 安装一台 Linux 系统之Ubuntu
  • JAVA---面向对象(上)
  • CSGO饰品盲盒系统源码搭建与仿站开发全解析
  • Sharding-JDBC 系列专题 - 第八篇:数据治理与高级功能
  • 【Python爬虫基础篇】--4.Selenium入门详细教程
  • java—14 ZooKeeper
  • Springboot3+ JDK21 升级踩坑指南
  • 实现营销投放全流程自动化 超级汇川推出信息流智能投放产品“AI智投“
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第三模块·面向对象深度进化 —— 第十二章 接口:比C函数指针更强大的契约
  • 身份证实名认证接口数字时代的信任基石-node.js实名认证集成
  • C++之类和对象:定义,实例化,this指针,封装
  • (转)正则化等最优化方法介绍
  • 「图文互搜+情感分析」聚客AI前沿技术拆解:用Hugging Face玩转多模态AI大模型
  • windows安装Mysql
  • 手机端本地服务与后端微服务的技术差异
  • Tailwind CSS 初学者入门指南:项目集成,主要变更内容!
  • 探秘 FFmpeg 版本发展时间简史
  • 解决VS Code中Vue项目不识别`@/`的可能解决方案及总结
  • 【mdlib】0 全面介绍 mdlib - Rust 实现的 Markdown 工具集
  • 模板元编程(Template Metaprogramming, TMP)
  • 张又侠董军分别与印尼国防部长会见会谈
  • 《哪吒2》票房已达157亿,光线传媒一季度净利增至20亿元
  • 受贿超8.22亿元,新疆维吾尔自治区党委原副书记李鹏新一审被判死缓
  • 中纪委驻中组部纪检监察组原组长李刚被捕
  • 商务部:中国加快推进服务业扩大开放综合试点为世界注入更多确定性
  • IPO周报|本周暂无新股申购,上周上市新股中签浮盈均超1.6万