【机器学习】随机森林算法

随机森林(Random Forest)是一种集成学习算法,它结合了多个决策树的输出,以提高预测的准确性和稳定性。随机森林被广泛应用于分类和回归任务中,尤其适用于数据特征之间存在非线性关系或噪声的情况。

在本文中,我们将详细讲解随机森林的原理,并用Numpy实现一个基本的回归随机森林。最后,我们将展示如何使用Scikit-Learn实现随机森林。

随机森林的基本原理

随机森林是由 多棵决策树 组成的集成模型,通过以下步骤生成:

  1. 样本随机抽样(Bootstrap Sampling)

    • 从原始数据集中随机抽取若干个样本,生成多个不同的数据集(可以重复抽样)。
    • 对每个数据集生成一棵决策树模型。
  2. 特征随机选择(Random Feature Selection)

    • 在每个节点分裂时,从所有特征中随机选择一部分特征进行分割,选择使得分裂效果最好的特征。
    • 这样可以降低决策树之间的相关性,提升模型泛化能力。
  3. 模型集成

    • 对于分类任务,通过“投票”机制(多数表决)确定最终分类结果。
    • 对于回归任务,通过取多个决策树预测值的平均值得到最终预测结果。

随机森林的优点包括:

  • 减少模型的方差,提高泛化性能。
  • 不容易出现过拟合,尤其在数据量大、噪声多的情况下。

构建回归随机森林

我们将分以下步骤逐步实现一个简单的随机森林回归模型。

数据生成

首先,生成一组模拟数据,以便后续测试模型的效果。

import numpy as np
import matplotlib.pyplot as plt# 生成模拟数据
np.random.seed(0)
X = np.random.rand(100, 1) * 10  # 特征
y = 2 * X.flatten() + np.sin(X.flatten()) * 5 + np.random.randn(100) * 0.5  # 目标值

构建单棵决策树

在随机森林中,我们需要基于Bootstrap采样数据构建多棵决策树。这里我们实现回归树的基本构建方法,使用均方误差(MSE)作为分割标准:

# 均方误差(MSE)计算
def mean_squared_error(y):return np.var(y) * len(y)# 数据集分割
def split_dataset(X, y, feature, threshold):left_mask = X[:, feature] <= thresholdright_mask = ~left_maskreturn X[left_mask], y[left_mask], X[right_mask], y[right_mask]# 查找最佳分割特征和分割点
def best_split(X, y):best_mse = float("inf")best_feature, best_threshold = None, Nonefor feature in range(X.shape[1]):thresholds = np.unique(X[:, feature])for threshold in thresholds:_, y_left, _, y_right = split_dataset(X, y, feature, threshold)if len(y_left) == 0 or len(y_right) == 0:continuemse_split = mean_squared_error(y_left) + mean_squared_error(y_right)if mse_split < best_mse:best_mse = mse_splitbest_feature = featurebest_threshold = thresholdreturn best_feature, best_threshold# 决策树类
class RegressionTree:def __init__(self, max_depth=3, min_samples_split=2):self.max_depth = max_depthself.min_samples_split = min_samples_splitself.tree = Nonedef fit(self, X, y, depth=0):if len(y) < self.min_samples_split or depth >= self.max_depth:return np.mean(y)feature, threshold = best_split(X, y)if feature is None:return np.mean(y)left_X, left_y, right_X, right_y = split_dataset(X, y, feature, threshold)left_node = self.fit(left_X, left_y, depth + 1)right_node = self.fit(right_X, right_y, depth + 1)self.tree = {"feature": feature, "threshold": threshold, "left": left_node, "right": right_node}return self.treedef predict_sample(self, x, tree):if not isinstance(tree, dict):return treeif x[tree["feature"]] <= tree["threshold"]:return self.predict_sample(x, tree["left"])else:return self.predict_sample(x, tree["right"])def predict(self, X):return np.array([self.predict_sample(x, self.tree) for x in X])

构建随机森林模型

基于上面的决策树实现,我们可以通过多次 Bootstrap 采样来构建随机森林的模型。通过组合多棵决策树的预测结果,提升模型的稳定性。

class RandomForestRegressor:def __init__(self, n_estimators=10, max_depth=3, min_samples_split=2):self.n_estimators = n_estimatorsself.max_depth = max_depthself.min_samples_split = min_samples_splitself.trees = []def bootstrap_sample(self, X, y):indices = np.random.choice(len(y), len(y), replace=True)return X[indices], y[indices]def fit(self, X, y):self.trees = []for _ in range(self.n_estimators):X_sample, y_sample = self.bootstrap_sample(X, y)tree = RegressionTree(max_depth=self.max_depth, min_samples_split=self.min_samples_split)tree.fit(X_sample, y_sample)self.trees.append(tree)def predict(self, X):tree_predictions = np.array([tree.predict(X) for tree in self.trees])return np.mean(tree_predictions, axis=0)

训练与预测

接下来,我们用随机森林模型拟合数据,并可视化预测结果:

# 初始化并训练随机森林
forest = RandomForestRegressor(n_estimators=50, max_depth=4, min_samples_split=5)
forest.fit(X, y)# 预测并绘制结果
X_test = np.linspace(0, 10, 100).reshape(-1, 1)
y_pred = forest.predict(X_test)plt.scatter(X, y, color="blue", label="训练数据")
plt.plot(X_test, y_pred, color="red", label="随机森林预测")
plt.xlabel("特征")
plt.ylabel("目标值")
plt.title("随机森林回归预测")
plt.legend()
plt.show()

使用 Scikit-Learn 实现随机森林

Scikit-Learn 提供了一个简单易用的 RandomForestRegressor,用于快速实现和测试随机森林模型。我们可以用它来验证我们的手动实现。

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error# 使用Scikit-Learn的随机森林
regressor = RandomForestRegressor(n_estimators=50, max_depth=4, min_samples_split=5, random_state=0)
regressor.fit(X, y)# 预测并计算MSE
y_pred_sklearn = regressor.predict(X_test)
mse = mean_squared_error(y, regressor.predict(X))
print("均方误差:", mse)# 可视化
plt.scatter(X, y, color="blue", label="训练数据")
plt.plot(X_test, y_pred_sklearn, color="green", label="Scikit-Learn 随机森林预测")
plt.xlabel("特征")
plt.ylabel("目标值")
plt.title("Scikit-Learn 随机森林预测示意图")
plt.legend()
plt.show()

总结

本文详细介绍了随机森林的工作原理,从基本概念到使用 Bootstrap 样本构建决策树的过程,手动实现了回归的随机森林算法,并用 Scikit-Learn 的 RandomForestRegressor 进行对比。随机森林算法的优势在于其高效的集成学习策略,有助于提升模型的泛化能力并减少过拟合风险。

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

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

相关文章

十四届蓝桥杯STEMA考试Python真题试卷第二套第三题

来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第三题 通过这道字符串处理的解析,重点学习字典的 get() 方法和 map() 函数的应用。我们同时也给出了“一行代码”的实现方案,令人惊叹的是到两种实现方法的代码行数差不多是10:1。这次,我们更推荐一行代码的实现方式,…

数据结构与算法--回溯法

回溯法 1 括号生成分析&#xff1a; 2 解数独分析代码 回溯法本质是的暴力枚举/遍历法&#xff0c;一般用递归实现。 当我们可以把问题分解为若干个步骤&#xff0c;每个步骤都有若干个选择的时候&#xff0c;若需要列出所有解答形式&#xff0c;则采用枚举法。 1 括号生成 数…

数据集收集器0.3

为了进一步完善代码,使其能够识别更多格式的问答对,并且在遇到无法识别的格式时能够跳过并继续处理下一个,我们可以采取以下措施: 增强正则表达式:支持更多的问答对格式。 增加容错处理:在遇到无法识别的格式时,记录错误并继续处理下一个。 多模式匹配:支持多种问答对…

外卖小程序的研究与开发ssm+论文源码调试讲解

2系统关键技术 2.1微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与普通…

花了6000多考下PMP却不会用?你真的懂PMP实际用法吗?

大家都已经下载了PMP的电子版证书吗&#xff1f;虽然拿到了电子证书&#xff0c;但很多人又开始期待纸质版证书。不要着急&#xff0c;考试后需要6-9个月才能拿到纸质版证书&#xff0c;可能还需要等一段时间。 电子证书和纸质证书具有同样的有效性&#xff0c;需要使用证书时…

Spring面向切面编程

目录 1.AOP概述及Spring AOP实现原理 AOP概述 AOP的应用场景 AOP的作用 Spring AOP概述 Spring AOP的实现原理 Spring AOP中Advice的分类 2. 通过xml配置实现AOP 实现步骤&#xff1a; 新增模块&#xff1a; 导入相关依赖&#xff1a; 新增实体类User 新增业务类UserS…

MySQL 和 PostgreSQL 的对比概述

MySQL 和 PostgreSQL 是两种广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们各自有其特点和优缺点。以下将从多个方面对它们进行详细比较。 1. 介绍 MySQL&#xff1a; MySQL 由瑞典公司 MySQL AB 开发&#xff0c;2008 年被 Sun Microsyst…

[C++] GDB的调试和自动化检测

文章目录 GDB基本使用1. bazel的debug过程2. line-tables-only的使用 Reference GDB基本使用 参考文档&#xff1a; https://zhuanlan.zhihu.com/p/655719314 1. bazel的debug过程 需要带--copt-g --copt-ggdb选项进行编译 // bazel build --stripnever --copt-g --copt-ggd…

urllib3.exceptions.Proxyschemeunknown: Proxy URL had no scheme

这个错误信息 urllib3.exceptions.Proxyschemeunknown: Proxy URL had no scheme, should start with http:// or https:// 表示你在使用 urllib3 库设置代理时&#xff0c;提供的代理 URL 没有包含正确的协议方案&#xff08;scheme&#xff09;。在 URL 中&#xff0c;方案部…

Javaweb选课系统-开源计划-起源-001-完全免费开源

项目部署&#xff0c;效果视频 https://www.bilibili.com/video/BV1LMDUY8Ef7/?spm_id_from333.880.my_history.page.click&vd_source17d16b2e328f19328e077e9cb07565ef项目地址&#xff1a; https://gitee.com/lucky-six/Javaweb-xuanke

微服务架构面试内容整理-微服务与传统单体架构的区别

微服务和传统单体架构的主要区别在于架构设计和服务管理方式: 1. 架构设计: ● 单体架构:整个应用作为一个整体构建,所有功能模块紧密耦合在一起,通常在一个代码库中管理。 ● 微服务架构:应用被拆分为多个独立的服务,每个服务专注于特定的业务功能,可以独立开发和部署…

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

SAP 学习文章

SAP PP模块后台表关系图_sap常用表及关系图-CSDN博客 SAP_PP模块流程_sap中pp模组指令-CSDN博客

Linux云计算 |【第五阶段】PROJECT3-DAY1

主要内容&#xff1a; 跳板机&#xff08;堡垒机&#xff09;的概念、部署JumpeServer 一、跳板机&#xff08;堡垒机&#xff09;的概念 跳板机&#xff08;Jump Server 或 Bastion Host&#xff09;是一种网络安全设备或服务器&#xff0c;也称堡垒机&#xff0c;是一类可作…

宠物空气净化器哪个牌子好?希喂、352两款产品吸力、噪音真实测试

我身为养宠博主&#xff0c;这些年用过不少宠物空气净化器&#xff0c;花费了1w&#xff0c;对很多产品都进行过测评。正值双十一&#xff0c;很多朋友都在问我宠物空气净化器到底有没有必要买&#xff1f;答案毫无疑问是有必要&#xff01; 相比较于其他清理工具&#xff0c;…

Clang-Tidy 是什么?如何让你的代码更干净无瑕

Clang-Tidy&#xff1a;让你的代码更干净&#xff0c;让潜在问题无处遁形 在现代软件开发中&#xff0c;代码质量不再仅仅体现在功能实现上&#xff0c;还包括其可维护性、可读性和潜在问题的检测。clang-tidy 是一款功能强大的静态分析工具&#xff0c;专为 C/C 代码而生&…

Identity (Intentional Equality) vs. Equivalence (Extensional Equality)

在《何谓相等》一文中&#xff0c;已对在类型论中的相等概念进行了描述&#xff0c;即如两对象是同样地构建出来的&#xff0c;那么两对象相等&#xff08;Equals&#xff09;。如果两对象不相同&#xff0c;但经过简化转换后&#xff0c;形成相等的对象&#xff0c;那么&#…

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一个节点可…

【算法】(Python)动态规划

动态规划&#xff1a; dynamic programming。"programming"指的是一种表格法&#xff0c;而非编写计算机程序。通常解决最优化问题&#xff08;optimization problem&#xff09;。将问题拆分成若干个子问题&#xff0c;求解各子问题来得到原问题的解。适用于多阶段…

PySpark本地开发环境搭建

一.前置事项 请注意&#xff0c;需要先实现Windows的本地JDK和Hadoop的安装。 二.windows安装Anaconda 资源&#xff1a;Miniconda3-py38-4.11.0-Windows-x86-64&#xff0c;在window使用的Anaconda资源-CSDN文库 右键以管理员身份运行&#xff0c;选择你的安装路径&#x…