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

文章目录

  • [1. 随机森林的基本原理想](#1. 随机森林的基本原理想)
  • [2. 算法流程](#2. 算法流程)
    • [2.1. 数据采样(Bootstrap):](#2.1. 数据采样(Bootstrap):)
    • [2.2. 构建决策树:](#2.2. 构建决策树:)
    • [2.3. 聚合预测:](#2.3. 聚合预测:)
  • [3. 随机森林的构建过程](#3. 随机森林的构建过程)
    • [3.1. 数据集的随机抽样](#3.1. 数据集的随机抽样)
    • [3.2. 决策树的训练](#3.2. 决策树的训练)
    • [3.3. 树的生长](#3.3. 树的生长)
    • [3.4. 多棵树的集成](#3.4. 多棵树的集成)
    • [3.5. 输出预测结果](#3.5. 输出预测结果)
  • [4. 随机森林的关键参数](#4. 随机森林的关键参数)
  • [5. 数学原理](#5. 数学原理)
  • [6. 随机森林的优缺点](#6. 随机森林的优缺点)
  • [7. 特征重要性评估](#7. 特征重要性评估)
  • [8. 随机森林的应用](#8. 随机森林的应用)
  • [9. 样例代码](#9. 样例代码)
  • [10. 如何提升随机森林的性能](#10. 如何提升随机森林的性能)
  • [11. 小结](#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=1∑Thi(x))=Tσ2+ρσ2(1−T1)
    ρ ρ ρ 为树间相关系数,随机特征选择可降低 ρ ρ ρ。

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

6. 随机森林的优缺点

  • ✅ 优点:

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

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

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

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

  • ❌ 缺点:

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

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

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

7. 特征重要性评估

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

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

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

8. 随机森林的应用

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

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

9. 样例代码

python 复制代码
# 导入所需的库
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)。

相关推荐
普if加的帕1 小时前
java Springboot使用扣子Coze实现实时音频对话智能客服
java·开发语言·人工智能·spring boot·实时音视频·智能客服
KoiC1 小时前
Dify接入RAGFlow无返回结果
人工智能·ai应用
lilye662 小时前
精益数据分析(20/126):解析经典数据分析框架,助力创业增长
大数据·人工智能·数据分析
盈达科技2 小时前
盈达科技:登顶GEO优化全球制高点,以AICC定义AI时代内容智能优化新标杆
大数据·人工智能
安冬的码畜日常2 小时前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
古希腊掌管学习的神2 小时前
[LangGraph教程]LangGraph04——支持人机协作的聊天机器人
人工智能·语言模型·chatgpt·机器人·agent
FIT2CLOUD飞致云2 小时前
问答页面支持拖拽和复制粘贴文件,MaxKB企业级AI助手v1.10.6 LTS版本发布
人工智能·开源
起个破名想半天了2 小时前
计算机视觉cv入门之答题卡自动批阅
人工智能·opencv·计算机视觉
早睡早起吧2 小时前
目标检测篇---Fast R-CNN
人工智能·目标检测·计算机视觉·cnn
小墙程序员2 小时前
机器学习入门(二)线性回归
机器学习