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

随机森林(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_errorrf_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 pltplt.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 GridSearchCVparam_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88055.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题 1:MyBatis-plus-3.5.9 的分页功能修复

问题 1:MyBatis-plus-3.5.9 的分页功能修复 使用 Sw‏agger 接口文档‎依次对上述接口进行测 试,发现 listU⁡serVOByPage 接口有一些问题! 分页好像没有生效,还是查出了全部数据: 由于我们用的是 MyBatis Plus 来操…

Qt 如何提供在线帮助

Qt 如何提供在线帮助一、概述二、工具提示、状态提示和"Whats This?"帮助1、工具提示(Tool Tips)添加工具提示到控件富文本工具提示全局工具提示设置延迟显示控制自定义工具提示窗口禁用工具提示工具提示与状态栏联动特点:2、状态提示(Status Tips)3、&q…

Typecho站点关闭插件开发全指南:从原理到实现

文章目录 开发Typecho站点关闭插件:从原理到实现一、背景与需求分析二、插件设计思路2.1 技术选型2.2 功能模块设计三、插件开发实现3.1 插件基础结构3.2 插件主文件实现3.3 核心功能实现3.4 后台管理界面3.5 关闭页面模板四、插件配置完善4.1 配置表单实现4.2 定时任务处理五…

详细解析 .NET 依赖注入的三种生命周期模式

文章目录一、Transient(瞬时生命周期)原理使用方式核心特性适用场景优势劣势二、Scoped(作用域生命周期)原理使用方式核心特性适用场景优势劣势三、Singleton(单例生命周期)原理使用方式核心特性适用场景优…

软件工程经济与伦理

前言 各位帅哥美女,能看到这篇博客的都有口福了,学习这门课程就像遨游在大份的海洋,一不小心就吃上一口。能看到这篇博客说明我们是有缘人可以点赞收藏一下,这篇博客可以在你无比饥饿的时候给你送上一坨!(香…

AI 体验走查 - 火山引擎存储的 AI UX 探索之路

01 概述 火山引擎存储技术团队驱动 AI 自主完成用户体验走查 / 可用性测试的执行与评价,帮助业务改善交互体验。 立项“故事走查”的背景诉求和 AI 机遇 如何搭建“AI 评价”能力,精准识别交互问题 让交互体验故事走查变为技术产品,讲解系…

【世纪龙科技】汽车零部件检验虚拟实训室-助力汽车职教实训

在汽车产业加速向电动化、智能化转型的背景下,职业院校汽车专业教学面临新的挑战:传统实训受限于设备数量不足、操作风险高、标准化程度低等问题,导致学生实践机会有限,技能掌握不扎实。如何让学生在有限资源下高效掌握零部件检验…

MySQL常用操作 查看表描述以及表结构、连接数及缓存和性能指标

查看表描述以及表结构查看数据库名SHOW DATABASES; SELECT DATABASE(); SELECT DATABASE() AS current_database;查看数据库中表的列表SHOW TABLES; SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA your_database_name; SELECT TABLE_NA…

音视频学习(三十六):websocket协议总结

概述项目描述标准RFC 6455使用端口默认 80(ws),443(wss)基于协议TCP特性全双工、低开销、持久连接、可穿透代理特点 全双工通信: WebSocket 允许客户端和服务器之间建立一个持久的连接,并且数据…

docker版本nacos的搭建

1.下载镜像2.拷贝出容器中对应的配置文件,logs,data,conf3.编写yaml配置文件version: 3.8 services:nacos-server:image: nacos/nacos-server:v2.4.0container_name: nacos-serverrestart: unless-stoppedports:- "8848:8848" # …

【机器学习深度学习】 如何解决“宏平均偏低 / 小类识别差”的问题?

目录 🧩 场景 一、先问清楚:小类差,到底差在哪? 二、对症下药:六大优化策略(分类任务专用) ✅ 1. 处理类别不平衡(最常见) ✅ 2. 优化数据质量 ✅ 3. 更强的模型结…

数据结构 --- 栈

栈 --- stack前言一、栈结构二、相关方法1.初始化2.入栈3.出栈4.判空5.获取栈顶元素6.获取栈大小7.销毁前言 栈是一个特殊的线性表,遵循一个先进后出的特性,即操作数据(入栈,出栈)只能从栈顶操作,栈底是一…

【uniapp】---- 在 HBuilderX 中使用 tailwindcss

1. 前言 接手了一个uniapp的微信小程序项目,因为在上一个 taro 的项目中使用的 tailwindcss,感觉比较方便,又不想动项目中原来的代码,因此就配置 tailwindcss,在新创建的子包中使用。 2. 分析 vue2 版本的 uni-app 内置的 webpack 版本为 4 , postcss 版本为 7, 所以还是…

Spring Boot + Easy Excel 自定义复杂样式导入导出

tips&#xff1a;能用模板就用模板&#xff0c;当模板不适用的情况下&#xff0c;再选择自定义生成 Excel。官网&#xff1a;https://easyexcel.opensource.alibaba.com安装<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</arti…

Spark从入门到实战:安装与使用全攻略

目录一、Spark 简介1.1 Spark 的概念1.2 Spark 的优势1.3 Spark 的应用场景二、安装前准备2.1 硬件要求2.2 软件要求2.3 下载 Spark三、Spark 安装步骤3.1 解压安装包3.2 配置环境变量3.3 配置 spark-env.sh3.4 配置 slaves 文件&#xff08;分布式模式&#xff09;3.5 启动 Sp…

Python 进程间的通信:原理剖析与项目实战

在 Python 编程中,当涉及多进程编程时,进程间的通信(Inter-Process Communication,简称 IPC)是一个重要的课题。多个进程在运行过程中,常常需要交换数据、传递状态或协同工作,这就离不开进程间通信机制。本文将深入讲解 Python 进程间通信的原理,并结合实际项目案例,展…

神经网络之BP算法

一、正向传播正向传播&#xff08;Forward Propagation&#xff09;是神经网络中数据从输入层流向输出层的过程。输入数据通过各层的权重和激活函数逐层计算&#xff0c;最终得到预测输出。数学表示&#xff1a; 对于第 ( l ) 层的神经元&#xff0c;其输出计算如下&#xff1a…

Ubuntu 版本号与别名对照表(部分精选)

Ubuntu 的别名遵循 形容词 动物名 的命名规则&#xff0c;且两个单词首字母相同&#xff0c;按字母表顺序循环使用&#xff08;从 Ubuntu 6.06 开始&#xff09;。 &#x1f4c5; Ubuntu 版本号与别名对照表&#xff08;部分精选&#xff09; 版本号别名 (开发代号)发布时间…

实验03-Spark批处理开发

使用Spark Shell探索RDD 启动并使用Scala Spark Shell 在终端窗口&#xff0c;启动Scala Spark shell&#xff1a; spark-shell --master local查看对象&#xff1a; scala> sc scala> spark输入spark.[TAB]然后可以看到所有可用的方法。 读并显示文本文件 查看文本…

【R语言】Can‘t subset elements that don‘t exist.

Error in select(): ℹ In argument: all_of(label_col). Caused by error in all_of(): ! Cant subset elements that dont exist. ✖ Element Label doesnt exist. Run rlang::last_trace() to see where the error occurred.原文中文解释涉及关键词Error in select()报错发生…