用Python实现9大回归算法详解——08. 随机森林回归算法

news2024/9/20 10:39:55

1. 随机森林回归的基本概念

随机森林回归(Random Forest Regression)是一种集成学习方法,基于多棵决策树的组合来进行预测。它通过引入随机性来构建多棵独立的决策树,并将这些树的预测结果进行平均,从而提升模型的泛化能力并降低过拟合的风险。

随机森林回归的核心思想是通过引入两种随机性来创建一个强大的预测模型:

  1. 样本随机性:通过从原始数据集中有放回地随机抽取样本(即自助法或Bootstrap)来生成不同的训练数据集。
  2. 特征随机性:在构建每棵决策树时,随机选择部分特征来进行分裂。

2. 随机森林回归的算法流程

(1)样本抽取: 从原始数据集中有放回地随机抽取多个样本,生成多个子数据集。

样本抽取公式:

D^{(b)} = \{ (\mathbf{x}_i, y_i) \mid i \in S_b \}

其中 S_b​ 是第 b 个子数据集的样本索引集合。

(2)决策树构建: 对于每个子数据集,使用决策树算法构建回归树。在每个节点分裂时,随机选择一部分特征,选择最佳特征进行分裂。

特征选择公式:

\text{Split Feature} = \arg\min_{j \in \text{Random Subset}} \sum_{i=1}^{m} \left( y_i - \hat{y}_i \right)^2

(3)集成预测: 所有树训练完成后,对新输入的数据点,分别使用每棵决策树进行预测,然后对所有预测结果进行平均,得到最终的预测值。

最终预测公式:

\hat{y}^{(b)}(\mathbf{x}) = \frac{1}{|L_b(\mathbf{x})|} \sum_{i \in L_b(\mathbf{x})} y_i

其中,\hat{y}^{(b)}(\mathbf{x}) 是第 b 棵决策树的预测结果。

3. 随机森林回归的数学表达

随机森林回归的基本公式包括:

(1)样本抽取: 从原始数据集中有放回地随机抽取样本生成子数据集:

D^{(b)} = \{ (\mathbf{x}_i, y_i) \mid i \in S_b \}

其中:

  • D^{(b)} 是第 b 个子数据集。
  • S_b​ 是第 b 个子数据集的样本索引集合。

(2)决策树的训练: 对于每棵决策树,利用随机抽取的特征集合进行分裂,生成回归树。 特征选择:

\text{Split Feature} = \arg\min_{j \in \text{Random Subset}} \sum_{i=1}^{m} \left( y_i - \hat{y}_i \right)^2

其中:

  • j 是特征索引。
  • m 是当前节点中的样本数。
  • y_i 是第 i 个样本的真实值。
  • \hat{y}_i 是根据特征 j 进行分裂后的预测值。

(3)最终预测: 对于新数据点的预测结果是所有决策树预测结果的平均值:

\hat{y} = \frac{1}{B} \sum_{b=1}^{B} \hat{y}^{(b)}(\mathbf{x})

其中:

  • \hat{y}​ 是输入样本 \mathbf{x} 的最终预测值。
  • B 是决策树的数量。
  • \hat{y}^{(b)}(\mathbf{x}) 是第 b 棵树的预测值

4. 随机森林回归的优缺点

优点

  1. 高准确度:随机森林通过结合多棵决策树,显著提升了模型的预测准确度。
  2. 抗过拟合:由于引入了随机性,随机森林相比单棵决策树更加抗过拟合,能够更好地泛化到未见的数据。
  3. 能够处理高维数据:随机森林在特征维度较高的情况下仍然能够有效工作。

缺点

  1. 计算复杂度高:由于随机森林需要训练多棵决策树,因此计算成本较高,尤其是在数据量大时。
  2. 模型解释性较差:随机森林的集成机制使得模型难以解释,不容易理解每个特征对预测结果的影响。

5. 随机森林回归案例

我们将通过一个具体的案例来展示如何使用随机森林回归进行预测,并对结果进行详细分析。

5.1 数据加载与预处理

我们使用加利福尼亚州房价数据集(California Housing Dataset)进行回归预测。

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 加载加利福尼亚州房价数据集
housing = fetch_california_housing()
X, y = housing.data, housing.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

解释

  • 数据加载:我们选择加利福尼亚州房价数据集,该数据集包含加利福尼亚州的房屋特征数据,用于预测房屋的价格中位数。
  • 数据划分:将数据集划分为训练集和测试集,80% 的数据用于训练,20% 的数据用于测试。
5.2 模型训练与预测

我们使用 RandomForestRegressor 进行模型训练,并对测试集进行预测。

# 定义随机森林回归模型
rfr = RandomForestRegressor(n_estimators=100, random_state=42)

# 训练模型
rfr.fit(X_train, y_train)

# 对测试集进行预测
y_pred = rfr.predict(X_test)

解释

  • 模型定义RandomForestRegressor 是随机森林回归的实现,我们指定 n_estimators=100 来训练 100 棵决策树。
  • 模型训练:使用训练集数据进行模型训练,构建随机森林模型。
  • 模型预测:训练完成后,使用模型对测试集进行预测,得到预测值。
5.3 模型评估与结果分析

我们使用均方误差(MSE)和决定系数(R^2)来评估模型的性能。

# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

输出:

均方误差 (MSE): 0.2553684927247781
决定系数 (R²): 0.8051230593157366

解释

  • 均方误差 (MSE):模型的预测误差为 0.255,表明模型对测试集的预测较为准确。
  • 决定系数 (R²):模型的 R^2 值为 0.805,说明模型能够解释 80.5% 的目标变量方差,模型拟合效果较好。
5.4 特征重要性分析

随机森林还可以用于评估特征的重要性。我们可以输出每个特征的重要性得分,并进行可视化展示。

import matplotlib.pyplot as plt
import numpy as np

# 输出特征重要性
importances = rfr.feature_importances_
indices = np.argsort(importances)[::-1]

# 打印每个特征的重要性
for f in range(X.shape[1]):
    print(f"特征 {f + 1}: {housing.feature_names[indices[f]]} ({importances[indices[f]]})")

# 可视化特征重要性
plt.figure()
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), [housing.feature_names[i] for i in indices], rotation=90)
plt.xlim([-1, X.shape[1]])
plt.show()

 输出:

特征 1: MedInc (0.5248714775266793)
特征 2: AveOccup (0.1384428140532659)
特征 3: Latitude (0.08893574160843591)
特征 4: Longitude (0.08862881090121001)
特征 5: HouseAge (0.05459321807686177)
特征 6: AveRooms (0.04427184750632705)
特征 7: Population (0.030649781480378356)
特征 8: AveBedrms (0.0296063088468417)

 

解释

  • 特征重要性:随机森林通过计算每棵树中某个特征对分裂的重要性,来衡量该特征的重要性得分。重要性得分越高,说明该特征对最终预测结果的贡献越大。
  • 可视化:通过条形图的形式,展示各个特征的重要性,帮助理解哪些特征对预测房价最重要。
5.5 结果可视化

我们还可以通过绘制预测值与实际值的散点图,来进一步验证模型的表现。

# 绘制预测值与实际值的散点图
plt.scatter(y_test, y_pred, color="blue", alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel("Actual")
plt.ylabel("Predicted")
plt.title("Random Forest Regression: Actual vs Predicted")
plt.show()

 

可视化解释

  • 散点图:横轴表示测试集的实际房价,纵轴表示模型预测的房价。每个点代表一个测试样本的预测结果。
  • 红色虚线:表示理想情况下,预测值应与实际值完全一致的参考线(即 y = x 的线)。
  • 分析:如果大多数散点分布在红色虚线附近,说明模型的预测效果良好。分布越集中,预测的准确性越高。
5.6 参数调优

为了进一步提升模型性能,我们可以通过网格搜索(Grid Search)来调优随机森林的超参数,如树的数量(n_estimators)、最大深度(max_depth)等。

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'bootstrap': [True, False]
}

# 实例化随机森林回归模型
rfr = RandomForestRegressor(random_state=42)

# 进行网格搜索
grid_search = GridSearchCV(estimator=rfr, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("最佳参数:", grid_search.best_params_)

解释

  • 参数网格:我们定义了多个超参数的组合来构建参数网格,包括树的数量、最大深度、分裂节点所需的最小样本数等。
  • 网格搜索:通过 5 折交叉验证(cv=5),网格搜索从参数网格中找到最佳的参数组合。
  • 输出最佳参数:模型训练完成后,输出最佳的参数组合,这些参数可以用于构建性能更优的模型。

6. 总结

随机森林回归是一种强大的回归算法,通过结合多棵决策树的预测结果来提升模型的性能。它能够有效处理高维数据,并具有较强的抗过拟合能力。通过合理调优模型的参数,随机森林回归可以在各种回归任务中表现出色。尽管计算复杂度较高,但其强大的泛化能力和稳定性使其成为许多回归任务中的首选算法之一。

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

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

相关文章

streeapptest 工具编译看 + 测试rk3568

首先来了解一下 stressappteset 网上的资料 压力测试不就是 内存的接口测试吗? 网上找了些资料,基本没有这个工具对于 磁盘网络的测试。 我的理解,压力测试应该指的就是 CPU内存的测试吧。 然后是 关于这个 软件的编译。 首先是下载 git c…

避雷!Springer、Cell等出版社旗下17本SCI/SSCI被剔除,含3本on hold期刊!

2024年8月19日,科睿唯安本年度第八次更新Web of Science核心期刊目录。 图片来源:科睿唯安 与上次更新(2024年7月)相比,此次更新后的SCIE、SSCI期刊目录共17本期刊发生变动,详情如下: 图片来源…

用ComfyUI打造一键换装神器,轻松搭建本地工作流!

前言 最近快手推出了一个一键换装的模型,还原度还挺高的,效果也很不错,于是自己上手用ComfyUI也搭建了一套这样的工作流,练练手,搭建出来之后发现效果也还挺不错的,分享给大家: 我们先来看看快…

基于插件机制、SPI与事件驱动的系统设计

时间:2024年08月26日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频地址:https://xima.tv/1_F4V6FW?_sonic0 希望大家帮个忙!如果大家有工作机会,希望帮小蒋内推一下,小蒋希…

【html+css 绚丽Loading】 000018 五行伸缩剑

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 &#x1f495…

苹果手机忘记密码怎么办?解锁技巧分享

在数字时代,手机几乎成了我们生活的必需品,尤其是苹果手机,以其卓越的性能和流畅的体验赢得了众多用户的喜爱。然而,偶尔的疏忽可能导致我们忘记手机的锁屏密码,这时该怎么办呢?别担心,本文将为…

UWB Tag钥匙防丢器,精准定位测距,一键找回!告别钥匙遗失焦虑

在这个快节奏的时代,我们每天穿梭于家、办公室、商场之间,手中的钥匙串仿佛成了连接生活各个角落的纽带。但你是否也曾有过这样的经历:匆忙间,那串沉甸甸的钥匙似乎在某个不经意的瞬间与你“不辞而别”,留下的是无尽的…

10个企业网络安全建议,解决99%的网络安全问题

互联网时代,企业做好网络安全防护非常重要,一旦网络受到恶意攻击,可能会对企业造成一大笔不必要的经济损失。 那么互联网企业该如何做好网络安全防护呢?小墨在这里有10个建议: 1. 做好基础网络安全监测与防御 加…

【通俗理解】生物信息学数据分析——火山图、富集分析与PPI网络构建

【通俗理解】生物信息学数据分析——火山图、富集分析与PPI网络构建 关键词提炼 #火山图 #富集分析 #PPI网络 #R语言 #生物信息学 第一节:火山图、富集分析与PPI网络的核心概念 1.1 火山图 火山图是一种用于展示基因表达差异分析结果的图形,横轴表示…

视频美颜SDK与直播美颜插件的集成策略与性能优化方案详解

如何有效集成美颜技术,并在确保高性能的同时,实现优化,已成为开发者们亟待解决的问题。本文将从集成策略与性能优化两方面,详细解析视频美颜SDK与直播美颜插件的开发实践。 一、视频美颜SDK与直播美颜插件的集成策略 美颜SDK通常…

打工人 Excel 插件 - 电子表格智能辅助插件正版购买

接下来要给大家介绍的是:打工人 Excel 插件,支持 Win 平台,可用于增强 Office 和 WPS 表格功能,是我们提高工作效率、早日下班的神器! 在工作表处理方面,这款插件能让你轻松你轻松搞定字数 / 地址拆分、正…

手机快充头哪个牌子好?倍思65W伸缩线充电器交出优秀答卷

手机电池的持久续航能力显著影响我们的工作效率和日常生活。在众多手机快充头品牌中挑选一款既高效又安全的产品,对许多人来说是一大挑战。对于“手机快充头哪个牌子好”这一问题,或许在了解倍思65W氮化镓伸缩线充电器后,可以找到满意的答案。 极速充电,效率倍增—— 倍思65W…

程序员失业跑滴滴,意外自学AI绘画成主业,月入过万不是梦!

一、突如其来的裁员 那是一个阴沉的下午,我像往常一样,在公司忙碌着。突然,HR叫我去会议室,告诉我由于公司业务调整,我所在的部门被整体裁撤。作为一名程序员,我从未想过自己会面临失业的困境。拿着那份补偿…

陕西黄河壶口瀑布大型山水交响演出《黄河大合唱》2024年演出季开演

《黄河大合唱》宣传短片 近日,陕西黄河壶口瀑布大型山水交响演出《黄河大合唱》2024年演出季开演,新版演出时长45分钟,采用国内首个巨型机械艺术水幕实景剧场形式,通过“文化科技”的融合手段,呈现《黄河大合唱》的创作…

推荐一个适合做项目的物联网平台 ThingsKit

在当今的数字化时代,物联网(IoT)已经成为推动社会进步和产业升级的重要力量。物联网平台作为连接物理世界和数字世界的桥梁,扮演着至关重要的角色。在众多物联网平台中,ThingsKit凭借其强大的功能、灵活的架构和广泛的…

2024年了,你还在手动打字?Top4懒人技巧,让你秒变高效达人!

在忙碌的现代工作环境里,我们经常需要处理大量的信息,比如会议记录、客户谈话或者远程合作时的录音。录音是个好东西,因为它能帮我们记下所有重要的细节。但问题来了,这么多录音文件,怎么才能快速把它们变成文字呢&…

SQL Server 进行中文查询时加 “N”

背景 使用 SQL Server 做模糊查询时,无法查出内容,找原因很久发现需要在中文内容查询前加 “N” 才能查出内容,遂记录。 解决 其他使用场景 写存储控制的时候,错误信息提醒也会用到 “N”。 总之中文内容直接进公式的都加上 “N…

debian12 - systemctl 根据状态值判断服务启动成功的依据

文章目录 debian12 - systemctl 根据状态值判断服务启动成功的依据概述笔记用配置好的原版debian12试试状态值。实验结论END debian12 - systemctl 根据状态值判断服务启动成功的依据 概述 和同学讨论问题,说到服务的运行状态。 拿ssh服务为例。 查询ssh服务状态 …

H7-TOOL脱机烧录的UID加密操作方法,支持一键生成目标板C代码,方便大家轻松操作(2024-08-20,已发布)

UID加密使用比较方便,对应的C代码模板已经做好,使用TOOL上位机生成后,直接复制粘贴到自己的工程即可使用。返回1表示解密成功,返回0表示失败。 【UID加密原理】 1、烧录器在烧录芯片时,按照指定的算法将UID码编码为…

Spring Core常见错误及解决方案

Spring Core常见错误及解决方案 一些Spring Core错误及解决方案,出自极客时间傅健老师《Spring编程常见错误50例》 https://time.geekbang.org/column/intro/100077001 Bean定义 隐式扫描不到Bean的定义 如果我们定义这样的目录结构,实际上访问对应接…