用Python实现随机森林回归

article/2025/10/3 8:28:46

1 介绍

使用Scikit-Learn模块在Python实现任何机器学习算法都比较简单,并且不需要了解所有细节。这里就对如何进行随机森林回归在算法上进行概述,在参数上进行详述。希望对你的工作有所帮助。
这里,将介绍如何在Python中构建和使用Random Forest回归,而不是仅仅显示代码,同时将尝试了解模型的工作原理。

1.1 随机森林概述

随机森林是一种基于集成学习的监督式机器学习算法。集成学习是一种学习类型,可以多次加入不同类型的算法或相同算法,以形成更强大的预测模型。随机森林结合了多个相同类型的算法,即多个决策的树木,故名“随机森林”。

1.2 理解决策树

决策树是随机森林的构建块,它本身就是个直观的模型。我们可以将决策树视为询问有关我们数据问题的流程图。这是一个可解释的模型,因为它决定了我们在现实生活中的做法:在最终得出决定之前,我们会询问有关数据的一系列问题。

随机森林是由许多决策树组成的整体模型。通过对每个决策树的预测平均来进行预测。就像森林是树木的集合一样,随机森林模型也是决策树模型的集合。这使随机森林成为一种强大的建模技术,它比单个决策树要强大得多。
随机森林中的每棵树都在对数据子集进行训练。其背后的基本思想是在确定最终输出时组合多个决策树,而不是依赖于各个决策树。每个决策树都有很高的方差,但是当我们将所有决策树并行组合在一起时,由于每个决策树都针对特定样本数据进行了完美的训练,因此结果方差很低,因此输出不依赖于一个决策树而是多个决策树木。对于回归问题,最终输出是所有决策树输出的平均值。

1.3 随机森林工作过程概述

  1. 从数据集中随机选择N个样本子集。
  2. 基于这N个样本子集构建决策树。
  3. 选择算法中所需树的棵数,然后重复步骤1和2。

对于回归问题,森林中的每棵树都将预测Y值(输出)。通过取森林中所有决策树预测值的平均值来计算最终值。

1.4 Bootstrapping&Bagging

Bootstrapping

Bootstrapping算法,指的就是利用有限的样本资料经由多次重复抽样。如:在原样本中有放回的抽样,抽取n次。每抽一次形成一个新的样本,重复操作,形成很多新样本。
随机森林就是采用在每个随机样本上训练决策树。尽管每棵树相对于一组特定的训练数据可能有很大的差异,但总体而言,整个森林的方差都很小。

Bagging

随机森林在不同的随机选择的样本子集上训练每个决策树,然后对预测取平均以进行整体预测。这个过程被称为Bagging。

2 随机森林优缺点

2.1 随机森林回归的优点

在机器学习领域,随机森林回归算法比其他常见且流行的算法更适合回归问题。

  1. 要素和标签之间存在非线性或复杂关系。
  2. 它对训练集中噪声不敏感,更利于得到一个稳健的模型。随机森林算法比单个决策树更稳健,因为它使用一组不相关的决策树。
  3. 避免产生过拟合的模型。

2.2 随机森林的缺点

  1. 随机森林的主要缺点在于其复杂性。由于需要将大量决策树连接在一起,因此它们需要更多的计算资源。
  2. 由于其复杂性,与其他同类算法相比,它们需要更多的时间进行训练。

2.3 随机森林的过拟合问题

欠拟合、合适与过拟合,如下图所示。当出现过拟合情况时候,对于训练数据模型表现良好,测试数据模型表现肯定较差。机器学习是比较容易出现过拟合的。对于随机森林的过拟合问题分为两派,会产生过拟合与不会过拟合。

在这里插入图片描述
不会过拟合:
在Leo Breiman(随机森林算法的创建者)论文《Random Forests》中的表述:
在这里插入图片描述
在这里插入图片描述
会过拟合:
问题描述,一部分数据(数据的90%)作为训练样本,一部分(10%)作为测试样本,发现训练样本的R2一直在0.85,而测试样本R2都只有0.5几,高的也就0.6几。
对于这个问题,也很有可能是自变量与因变量之间本身关系就很低产生了过拟合假象。

3 使用随机森林回归实践

在本节中,我们将研究如何使用Scikit-Learn将随机森林用于解决回归问题。

3.1 问题描述

根据汽油税(美分),人均收入(美元),高速公路(以英里为单位)和人口所占比例来预测美国48个州的汽油消耗量(百万加仑)。
为了解决这个回归问题,采用Scikit-Learn 中的随机森林算法。

3.2 样本数据

例子数据集可在以下位置获得(需要KeXueShangWang才可以打开):
https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_/view
在这里插入图片描述

3.3 代码

相关的解释说明都在代码中进行了注释

import pandas as pd
import numpy as np# 导入数据,路径中要么用\\或/或者在路径前加r
dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')# 输出数据预览
print(dataset.head())# 准备训练数据
# 自变量:汽油税、人均收入、高速公路、人口所占比例
# 因变量:汽油消耗量
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values# 将数据分为训练集和测试集
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=0)# 特征缩放,通常没必要
# 因为数据单位,自变量数值范围差距巨大,不缩放也没问题
from sklearn.preprocessing import StandardScalersc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)# 训练随机森林解决回归问题
from sklearn.ensemble import RandomForestRegressorregressor = RandomForestRegressor(n_estimators=200, random_state=0)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)# 评估回归性能
from sklearn import metricsprint('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:',np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

输出结果

  Petrol_tax  Average_income  Paved_Highways  Population_Driver_licence(%)  Petrol_Consumption
0         9.0            3571            1976                         0.525                 541
1         9.0            4092            1250                         0.572                 524
2         9.0            3865            1586                         0.580                 561
3         7.5            4870            2351                         0.529                 414
4         8.0            4399             431                         0.544                 410
Mean Absolute Error: 48.33899999999999
Mean Squared Error: 3494.2330150000003
Root Mean Squared Error: 59.112037818028234

4 Sklearn随机森林回归参数详解

要了解sklearn.ensemble.RandomForestRegressor每个参数的意义,我们需要从函数定义入手,具体介绍还得看官网介绍:

sklearn.ensemble.RandomForestRegressor(
n_estimators=100, *, 				# 树的棵树,默认是100
criterion='mse', 					# 默认“ mse”,衡量质量的功能,可选择“mae”。
max_depth=None, 					# 树的最大深度。
min_samples_split=2, 				# 拆分内部节点所需的最少样本数:
min_samples_leaf=1, 				# 在叶节点处需要的最小样本数。
min_weight_fraction_leaf=0.0, 		# 在所有叶节点处的权重总和中的最小加权分数。
max_features='auto', 				# 寻找最佳分割时要考虑的特征数量。
max_leaf_nodes=None, 				# 以最佳优先方式生长具有max_leaf_nodes的树。
min_impurity_decrease=0.0, 			# 如果节点分裂会导致杂质的减少大于或等于该值,则该节点将被分裂。
min_impurity_split=None, 			# 提前停止树木生长的阈值。
bootstrap=True, 					# 建立树木时是否使用bootstrap抽样。 如果为False,则将整个数据集用于构建每棵决策树。
oob_score=False, 					# 是否使用out-of-bag样本估算未过滤的数据的R2。
n_jobs=None, 						# 并行运行的Job数目。
random_state=None, 					# 控制构建树时样本的随机抽样
verbose=0, 							# 在拟合和预测时控制详细程度。
warm_start=False, 					# 设置为True时,重复使用上一个解决方案,否则,只需拟合一个全新的森林。
ccp_alpha=0.0,
max_samples=None)					# 如果bootstrap为True,则从X抽取以训练每个决策树。

5 随机森林可视化

5.1 代码

import sklearn.datasets as datasets
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.decomposition import PCA# 导入数据,路径中要么用\\或/或者在路径前加r
dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')# 输出数据预览
print(dataset.head())# 准备训练数据
# 自变量:汽油税、人均收入、高速公路、人口所占比例
# 因变量:汽油消耗量
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=0)
regr = RandomForestRegressor()
# regr = RandomForestRegressor(random_state=100,
#                              bootstrap=True,
#                              max_depth=2,
#                              max_features=2,
#                              min_samples_leaf=3,
#                              min_samples_split=5,
#                              n_estimators=3)
pipe = Pipeline([('scaler', StandardScaler()), ('reduce_dim', PCA()),('regressor', regr)])
pipe.fit(X_train, y_train)
ypipe = pipe.predict(X_test)from six import StringIO
from IPython.display import Image
from sklearn.tree import export_graphviz
import pydotplus
import os# 执行一次
# os.environ['PATH'] = os.environ['PATH']+';'+r"D:\CLibrary\Graphviz2.44.1\bin\graphviz"
dot_data = StringIO()
export_graphviz(pipe.named_steps['regressor'].estimators_[0],out_file=dot_data)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('tree.png')
Image(graph.create_png())

5.2 GraphViz’s executables not found报错解决方案

参考博文
在这里插入图片描述

5.3 InvocationException: GraphViz’s executables not found 解决方案

参考博文

在这里插入图片描述

5.4 随机森林可视化

X[0], X[1], X[2], X[3], X[4]…分别为对应的自变量。 从结构化可以看到mse逐渐减小。这里一共是12层树,实际工作中可能远大于这里的例子。
在这里插入图片描述

5.5 变量重要性

通过变量重要性评价,可以删除那些不重要的变量,并且性能不会受到影响。另外,如果我们使用不同的机器学习方法(例如支持向量机),则可以将随机森林特征重要性用作一种特征选择方法。

为了量化整个随机森林中所有变量对模型的贡献,我们可以查看变量的相对重要性。 Skicit-learn中返回的重要性表示包含特定变量可以提高预测。 重要性的实际计算超出了本文的范围,这里仅对模型输出重要性数值进行使用。

# Get numerical feature importances
importances = list(regr.feature_importances_)
# List of tuples with variable and importance
print(importances)# Saving feature names for later use
feature_list = list(dataset.columns)[0:4]feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]
# Sort the feature importances by most important first
feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)
# Print out the feature and importances 
# [print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances];# Import matplotlib for plotting and use magic command for Jupyter Notebooksimport matplotlib.pyplot as plt
# Set the style
# plt.style.use('fivethirtyeight')
# list of x locations for plotting
x_values = list(range(len(importances)))
print(x_values)
# Make a bar chart
plt.bar(x_values, importances, orientation = 'vertical')
# Tick labels for x axis
plt.xticks(x_values, feature_list,rotation=6)
# Axis labels and title
plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');
plt.show()

在这里插入图片描述

参考
https://stackabuse.com/random-forest-algorithm-with-python-and-scikit-learn/
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
https://towardsdatascience.com/random-forest-in-python-24d0893d51c0
添加链接描述


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

相关文章

DS和[address]

8086CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元,则一个字要用两个地址连续的内存单元来存放,这个字的低位存放低地址单元中,高位字节存…

a's'da's'd

1:原理ffmpeg读取出来一个包如果是视频包放入视频包队列,如果是音频包放入音频包队列。视频:从视频队列中取出一个包解码根绝帧率或pts等等算出一帧数据的持续时间将这一帧数据放入VideoPicture这个结构体的bmp中,这只是内存,还未…

微信公众号内置浏览器缓存清理

微信公众号的H5页面访问后,会缓存js、css等数据,如果更新了脚本文件,前端一段时间内容反复刷新都无法生效。 使用过程中,更新代码但是H5不能及时更新,推荐以下几种方式: 方法一: 微信->“我…

微信浏览器缓存清理

微信其实内嵌了一个QQ浏览器,只是这个浏览器没有菜单界面,看上去无法清理微信内置浏览器的缓存。 方法一: 1、随便打开一个聊天窗口,输入debugx5.qq.com 并发送 2、点击自己发送的地址debugx5.qq.com,打开debug 调试…

Android手机微信内置浏览器缓存怎么清理?

有很多时候我们的网站需要在微信上打开进行测试,一次次的修改不像是浏览器一样可以随时清理缓存,不清理缓存的话这样会对测试运行结果有影响,那如何清理缓存呢? 注意:此功能只能适用于安卓微信 1、专门的清理缓存的网…

微信内置浏览器清理缓存方法(适用于安卓手机)

用微信内置浏览器打开这个网页debugx5.qq.com ,就会有清除缓存的选项,如下图

微信内置浏览器清除缓存、cookie、local storage清除(安卓手机)

项目需要做一个openIdADFS混合模式的登录,开发的时候发现点问题,需要清除cookie和local storage进行修改。 于是稍微研究了一下,安卓手机如何清除缓存、cookie和local storage。 本人使用的手机是华为Mate 20Pro,微信版本8.0.3.…

h5、微信浏览器、微信公众号清理缓存的常用方法

h5浏览器特别是微信公众号存在缓存的问题,让我们在测试、产品、用户面前彻底丢了面子,他们会问。为什么会有缓存?别人的产品可以做到,为什么我们的不可以? 下面提供几种方案可以尝试处理h5浏览器缓存的问题。 一、普…

清除微信浏览器缓存

转载自https://chenhuichao.com/2016/04/07/mobile/wechat-clean-cache/ 在做微信移动页面开发时,若需要清除缓存,对于Android和iOS平台的清除方法如下: iOS iOS的微信浏览器中自带刷新按钮。点击微信右上角的菜单->刷新,&am…

微信公众号开发,清除微信内置浏览器缓存

在做微信开发的时候(主要是微信内网页或者比较大型的手机网站)的时候,更改了页面代码,但是微信内置浏览器有缓存,还是之前的效果,影响调试,而且还死活清除不掉!!&#xf…

微信内置浏览器禁止缓存的问题

解决方案1&#xff1a; 调试阶段或者频繁更新的页面加入以下头信息&#xff1a; <meta http-equiv"Cache-Control" content"no-cache, no-store, must-revalidate" /> <meta http-equiv"Pragma" content"no-cache" /> &l…

微信内置浏览器缓存清理及关闭微信默认的X5内核

之前做过很多公众号的项目&#xff0c;项目写完后给客户看项目&#xff0c;客户一而再再而三的修改元素向左挪1px&#xff0c;向右挪2px。改好之后让客户看&#xff0c;客户说我特泽发克&#xff0c;你啥都没有修改&#xff0c;你竟然骗我&#xff01;&#xff01;&#xff01;…

微信内的浏览器缓存清理方法

安卓清除缓存方案&#xff1a; android版微信内置浏览器&#xff08;X5内核&#xff09; 在安卓版微信内打开链接 http://debugx5.qq.com 拉到调试页面的最底端&#xff0c;勾选上所有的缓存项目&#xff0c;点击清除。 苹果清除缓存方案&#xff1a; ios版微信内置浏览器&am…

解决微信浏览器缓存问题

微信浏览器处理缓存方式&#xff1a; 1.头部处理缓存信息。 <meta http-equiv"Cache-Control" content"no-cache, no-store, must-revalidate" /> <meta http-equiv"Pragma" content"no-c…

微信内置浏览器缓存清理

之前做过很多公众号的项目&#xff0c;项目写完后给客户看项目&#xff0c;客户一而再再而三的修改元素向左挪1px&#xff0c;向右挪2px。改好之后让客户看&#xff0c;客户说我特泽发克&#xff0c;你啥都没有修改&#xff0c;你竟然骗我&#xff01;&#xff01;&#xff01;…

h5清理微信浏览器网页缓存

前言&#xff1a; 缓存这个问题的出现&#xff0c;真真切切的感受到微信浏览器这鬼东西对前端程序员充满了恶意&#xff0c;捋捋自己的发型&#xff0c;甚是恐慌&#xff08;顿时有种想转php的冲动&#xff0c;有木有&#xff09;。 解决方案&#xff1a; 出现缓存问题导致用户…

清理微信浏览器网页缓存的办法

微信开发是件非常蛋疼的事情&#xff0c;微信网页的缓存是更加蛋疼的东西&#xff0c;今天遇到的问题&#xff1a;一个页面在web开发工具上可以正常授权并获取到openid&#xff0c;放在手机上就死活不行&#xff0c;网上找来的办法如下&#xff1a; 使用微信内置的浏览器打开“…

微信H5、网页、内置Web浏览器 清理缓存,微信浏览器缓存

目录 一、写在前面&#xff1a; 1、浏览器缓存带来的好处&#xff1a; 2、浏览器缓存带来的弊端&#xff1a; 二、如何清除微信浏览器的缓存&#xff1a; 1、在IOS环境下手动清除微信缓存&#xff1a; 2、在Android环境下手动清除微信缓存&#xff1a; 三、清除微信浏览…

Spring AOP实现原理简介

AOP联盟标准 AOP联盟将AOP体系分为三层&#xff0c;从三层结构可以看出&#xff0c;AOP实现方式有很多种&#xff0c;包括反射、元数据处理、程序处理、拦截器处理等&#xff0c;通过本节学习&#xff0c;你就会看到Spring AOP的实现使用的是Java语言本身的特性&#xff0c;即J…

Spring 面向切面编程 第4关:AOP实现原理-CgLib动态代理

目录 任务描述 相关知识 代理模式(Proxy) AOP实现的两种方式 CGLIB动态代理步骤 模拟AOP实现 代理类说明 编程要求 测试说明 参考代码 任务描述 我们知道&#xff0c;Spring AOP的主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么…