机器学习算法系列(十八)-随机森林算法(Random Forest Algorithm)

article/2025/10/13 16:52:02

阅读本文需要的背景知识点:决策树学习算法、一丢丢编程知识

最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱(Serocs),感兴趣的读者欢迎试用与分享,感谢您的支持!serocs.cn

一、引言

  前面一节我们学习了一种简单高效的算法——决策树学习算法(Decision Tree Learning Algorithm),下面来介绍一种基于决策树的集成学习1 算法——随机森林算法2(Random Forest Algorithm)。

二、模型介绍

  有一个成语叫集思广益,指的是集中群众的智慧,广泛吸收有益的意见。在机器学习算法中也有类似的思想,被称为集成学习(Ensemble learning)。

集成学习

  集成学习通过训练学习出多个估计器,当需要预测时通过结合器将多个估计器的结果整合起来当作最后的结果输出。

0.png

图2-1

  图2-1展示了集成学习的基本流程。
  集成学习的优势是提升了单个估计器的通用性与鲁棒性,比单个估计器拥有更好的预测性能。集成学习的另一个特点是能方便的进行并行化操作。

Bagging算法

  Bagging 算法3是一种集成学习算法,其全称为自助聚集算法(Bootstrap aggregating),顾名思义算法由 Bootstrap 与 Aggregating 两部分组成。
  图 2-2 展示了Bagging 算法使用自助取样(Bootstrapping4)生成多个子数据的示例
1.png

图2-2

  算法的具体步骤为:假设有一个大小为 N 的训练数据集,每次从该数据集中有放回的取选出大小为 M 的子数据集,一共选 K 次,根据这 K 个子数据集,训练学习出 K 个模型。当要预测的时候,使用这 K 个模型进行预测,再通过取平均值或者多数分类的方式,得到最后的预测结果。

随机森林算法

  将多个决策树结合在一起,每次数据集是随机有放回的选出,同时随机选出部分特征作为输入,所以该算法被称为随机森林算法。可以看到随机森林算法是以决策树为估计器的Bagging算法。

2.png

图2-3

  图2-3展示了随机森林算法的具体流程,其中结合器在分类问题中,选择多数分类结果作为最后的结果,在回归问题中,对多个回归结果取平均值作为最后的结果。

  使用Bagging算法能降低过拟合的情况,从而带来了更好的性能。单个决策树对训练集的噪声非常敏感,但通过Bagging算法降低了训练出的多颗决策树之间关联性,有效缓解了上述问题。

三、算法步骤

  假设训练集 T 的大小为 N ,特征数目为 M ,随机森林的大小为 K ,随机森林算法的具体步骤如下:

遍历随机森林的大小 K 次:
  从训练集 T 中有放回抽样的方式,取样N 次形成一个新子训练集 D
  随机选择 m 个特征,其中 m < M
  使用新的训练集 D 和 m 个特征,学习出一个完整的决策树
得到随机森林

  上面算法中 m 的选择:对于分类问题,可以在每次划分时使用 M \sqrt{M} M 个特征,对于回归问题, 选择 M 3 \frac{M}{3} 3M 但不少于 5 个特征。

四、优缺点

随机森林算法的优点:

  1. 对于很多种资料,可以产生高准确度的分类器
  2. 可以处理大量的输入变量
  3. 可以在决定类别时,评估变量的重要性
  4. 在建造森林时,可以在内部对于一般化后的误差产生不偏差的估计
  5. 包含一个好方法可以估计丢失的资料,并且如果有很大一部分的资料丢失,仍可以维持准确度
  6. 对于不平衡的分类资料集来说,可以平衡误差
  7. 可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类,也可侦测偏离者和观看资料
  8. 学习过程很快速

随机森林算法的缺点:

  1. 牺牲了决策树的可解释性
  2. 在某些噪音较大的分类或回归问题上会过拟合
  3. 在多个分类变量的问题中,随机森林可能无法提高基学习器的准确性

五、代码实现

使用 Python 实现随机森林分类:

import numpy as np
from sklearn.tree import DecisionTreeClassifierclass rfc:"""随机森林分类器"""def __init__(self, n_estimators = 100, random_state = 0):# 随机森林的大小self.n_estimators = n_estimators# 随机森林的随机种子self.random_state = random_statedef fit(self, X, y):"""随机森林分类器拟合"""self.y_classes = np.unique(y)# 决策树数组dts = []n = X.shape[0]rs = np.random.RandomState(self.random_state)for i in range(self.n_estimators):# 创建决策树分类器dt = DecisionTreeClassifier(random_state=rs.randint(np.iinfo(np.int32).max), max_features = "auto")# 根据随机生成的权重,拟合数据集dt.fit(X, y, sample_weight=np.bincount(rs.randint(0, n, n), minlength = n))dts.append(dt)self.trees = dtsdef predict(self, X):"""随机森林分类器预测"""# 预测结果数组probas = np.zeros((X.shape[0], len(self.y_classes)))for i in range(self.n_estimators):# 决策树分类器dt = self.trees[i]# 依次预测结果可能性probas += dt.predict_proba(X)# 预测结果可能性取平均probas /= self.n_estimators# 返回预测结果return self.y_classes.take(np.argmax(probas, axis = 1), axis = 0)

使用 Python 实现随机森林回归:

import numpy as np
from sklearn.tree import DecisionTreeRegressorclass rfr:"""随机森林回归器"""def __init__(self, n_estimators = 100, random_state = 0):# 随机森林的大小self.n_estimators = n_estimators# 随机森林的随机种子self.random_state = random_statedef fit(self, X, y):"""随机森林回归器拟合"""# 决策树数组dts = []n = X.shape[0]rs = np.random.RandomState(self.random_state)for i in range(self.n_estimators):# 创建决策树回归器dt = DecisionTreeRegressor(random_state=rs.randint(np.iinfo(np.int32).max), max_features = "auto")# 根据随机生成的权重,拟合数据集dt.fit(X, y, sample_weight=np.bincount(rs.randint(0, n, n), minlength = n))dts.append(dt)self.trees = dtsdef predict(self, X):"""随机森林回归器预测"""# 预测结果ys = np.zeros(X.shape[0])for i in range(self.n_estimators):# 决策树回归器dt = self.trees[i]# 依次预测结果ys += dt.predict(X)# 预测结果取平均ys /= self.n_estimatorsreturn ys

六、第三方库实现

scikit-learn5 实现随机森林分类:

from sklearn.ensemble import RandomForestClassifier# 随机森林分类器
clf = RandomForestClassifier(n_estimators = 100, random_state = 0)
# 拟合数据集
clf = clf.fit(X, y)

scikit-learn6 实现随机森林回归:

from sklearn.ensemble import RandomForestRegressor# 随机森林回归器
clf = RandomForestRegressor(n_estimators = 100, random_state = 0)
# 拟合数据集
clf = clf.fit(X, y)

七、示例演示

  图7-1、图7-2 分别展示了使用随机森林算法进行分类与回归的结果,图7-3、图7-4 分别展示了上一节中使用决策学习算法进行分类与回归的结果。可以看到对比上一节中单独未正则化的决策树,其预测的结果相对更加平稳一些。

3.png

图7-1

4.png

图7-2

14.png

图7-3

16.png

图7-4

八、思维导图

5.jpeg

图8-1

九、参考文献

  1. https://en.wikipedia.org/wiki/Ensemble_learning
  2. https://en.wikipedia.org/wiki/Random_forest
  3. https://en.wikipedia.org/wiki/Bootstrap_aggregating
  4. https://en.wikipedia.org/wiki/Bootstrapping_(statistics)
  5. https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
  6. https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html

完整演示请点击下方
Github
Gitee

最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱(Serocs),感兴趣的读者欢迎试用与分享,感谢您的支持!serocs.cn

注:本文力求准确并通俗易懂,但由于笔者也是初学者,水平有限,如文中存在错误或遗漏之处,恳请读者通过留言的方式批评指正


http://chatgpt.dhexx.cn/article/ThrQG7iq.shtml

相关文章

使用jvisualvm通过JMX的方式远程监控JVM的运行情况

公众号&#xff0c;欢迎关注 使用jvisualvm通过JMX的方式远程监控JVM的运行情况&#xff0c;步骤如下 远程服务器的配置 在启动java程序时加上如下几个参数 -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.sslfalse-Dcom.sun.management.jmxremote.authen…

JDK 中 jvisualvm 没有 VisualGC

1、图片描述问题 2、解决方法 &#xff08;1&#xff09;点击菜单栏中 工具 > 插件 &#xff08;2&#xff09;点击 可用插件 > 检查最新版本 出现如下情况表示不成功。 &#xff08;3&#xff09;点击 设置 > 编辑 链接&#xff1a; https://visualvm.github.io/…

JVisualVM 的使用教程

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 一、简介 Java VisualVM 是一个直观的图形用户界面&#xff0c;基于Java 的应用程序&#xff0c;在给定的 Java 虚拟机&#xf…

使用jvisualvm、jmc远程监控JVM

演示环境&#xff1a;jdk1.8 jvisualvm和jmc都是JDK自带的监控工具。jmc监控数据比jvisualvm更加丰富。它们都在JDK bin目录中 首先介绍jvisualvm的使用 打开bin/jvisualvm.exe 本地的JVM进程都已经识别出来了&#xff0c;直接点击即可监控。 为了使jvisualvm功能更加强大&a…

jvisualvm安装Visual GC插件

给jdk自带的jvisualvm安装Visual GC插件&#xff0c;遇到Were sorry the java.net site has closed&#xff08;我们很抱歉java.net网站已经关闭&#xff09; 1、找到新的更新地址 visualvm新访问地址&#xff1a;https://visualvm.github.io/index.html 进入“Plugins”&am…

用jvisualvm分析dump文件

最近有一个java服务的堆内存溢出&#xff0c;然后僵死了&#xff0c;在重启服务之前用jmap命令生成了一份dump文件便于后面分析。 生成dump文件的命令&#xff1a; jmap -dump:formatb,file20170307.dump 16048 file后面的是自定义的文件名&#xff0c;最后的数字是进程的pi…

JvisualVM使用教程

最近正在学习JvisualVm的使用&#xff0c;写一篇博客记录一下。 一 工具准备 1 软件 已经安装JDK及IDEA。 2 插件 2.1 Idea插件 在idea中按住快捷键 shift command A&#xff0c;输入plugins&#xff0c;搜索visualvm&#xff0c;如下图所示&#xff0c;安装插件。 安装…

Jvisualvm设置中文

从官网上下载的Jvisualvm.exe&#xff0c;一般启动后都为英文版。 如果本地电脑中有安装JDK&#xff0c;只要你使用的是JDK1.6 Update7之后的版本&#xff0c;那么它久已经在你的JDK bin目录里了。(该版本为中文版) 直接启动JDK中bin目录下的jvisualvm.exe即可。

Java VisualVM

文章目录 1.Java VisualVM简介&#xff08;Introduction to Java VisualVM&#xff09;1.1 Java VisualVM简介&#xff08;Introduction to Java VisualVM&#xff09;1.2 启动Java VisualVM&#xff08;Starting Java VisualVM&#xff09;1.2.1 Java VisualVM用户目录&#x…

jvisualvm远程连接的三种方式

文章目录 基于jatatd实现远程连接配置安全策略启动jstatd远程连接 基于JMX实现远程访问远程连接 基于SSH的远程连接启动远程应用ssh端口转发 基于jatatd实现远程连接 jstatd是一个基于RMI (Remove Method Invocation)的服务程序&#xff0c;它用于监控基于HotSpot的JVM中资源的…

Jvisualvm监控本地、远程Java进程

Jvisualvm监控本地、远程Java进程 监控本地Java进程监控远端Java进程JMX创建配置文件开启远程监控启动Tomcat创建连接 监控本地Java进程 在命令行输入jvisualvm即可启动jvisualvm 双击某个进程即可打开 监控远端Java进程 Jvisualvm不仅是可以监控本地jvm进程&#xff0c;还可以…

Java VisualVM使用

工具所在位置:windows下jdk安装路径内,如 C:\Program Files\Java\jdk1.8.0_20\bin\ jvisualvm.exe 双击执行; 效果图如下: 可以看到我本机有一个tomcat运行的监控 VisualVM可以根据需要安装不同的插件&#xff0c;每个插件的关注点都不同&#xff0c;有的主要监控GC&#xff0c…

jvisualvm (Java VisualVM)

文章来源:https://blog.csdn.net/a19881029/article/details/8432368 jvisualvm能干什么 监控内存泄露&#xff0c;跟踪垃圾回收&#xff0c;执行时内存、cpu分析&#xff0c;线程分析… jvisualvmg已经被集成在jdk1.6以上的版本中(不是jre)。自身运行需要最低jdk1.6版本&…

jvisualvm监控远程jvm

方式一&#xff1a;JMX 1、服务端添加配置 在tomcat/bin/catalina.sh文件中添加如下配置&#xff1a; export JAVA_OPTS"-Xms256m -Xmx512m -Xss256m -XX:PermSize512m -XX:MaxPermSize1024m -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname192.168.16.239 …

jvisualvm插件安装

jvisualvm插件安装 jvisualvm是我们查看JVM内部结构和JVM调优的重要工具&#xff0c;在java的安装目录的bin目录下。我们安装的Java默认jvisualvm有很多插件是没有安装的。接下来我们来看一下jvisualvm的插件安装。 找到JDK版本对应的插件地址&#xff1a; 访问网址&#xff1a…

JVM调优之JConsole和JVisualVM工具使用

JVM调优过程中&#xff0c;常用JDK自带的两个工具JConsole和JVisualVM&#xff0c;有助于分析问题。下面是两个工具的使用方式。&#xff08;我发现好多小伙伴居然都不知道这么强大的工具&#xff09; 一、JConsole使用。 1、JConsole本地监控启动 首先在JDK的bin目录下&#…

JVisualVM安装Visual GC

1、手动下载 下载地址 VisualVM: Plugins Centers 我现在常用JDK8&#xff0c;我的版本号是91 所以打开网址&#xff0c;选择如下&#x1f447; 选择对应的版本号之后&#xff0c;点击下面那个链接&#xff0c;之后会跳转到一个网页&#xff0c;找到Visual GC&#xff0c;点…

使用jvisualvm远程监控服务器上的jvm

转载文章&#xff1a;原文地址 在测试环境复现出了的研发自测没有发现的疑难问题如性能问题&#xff0c;排除服务器本身的问题之后&#xff0c;研发就需要定位问题。 我们可以直接远程监控测试环境的jvm查看监控进程的运行情况么&#xff1f; 我们可以直接远程dump测试环境的运…

Java jvisualvm简要说明

jvisualvm能干什么&#xff1a;监控内存泄露&#xff0c;跟踪垃圾回收&#xff0c;执行时内存、cpu分析&#xff0c;线程分析... jvisualvm已经被集成在jdk1.6以上的版本中(不是jre)。自身运行需要最低jdk1.6版本&#xff0c;但是可以监控运行在jdk1.4以上版本的java程序 以jd…

Java问题诊断工具——JVisualVM

这篇文章源自一次加班改bug的惨痛经历[,,_,,]:3 负责的一个项目占用不断增加&#xff0c;差点搞崩服务器(╥﹏╥)…… 一下子有点懵&#xff0c;不能立刻确定是哪里导致的问题&#xff0c;所以决定好好研究下这个之前一直被我忽视的问题诊断工具&#x1f527;——JVisualVM 嘿嘿…