随机森林实战:在鸢尾花数据集上与决策树和逻辑斯蒂回归进行对比

前言

集成学习通过组合多个模型的优势,常能获得比单一模型更优的性能,随机森林便是其中的典型代表。它基于 Bagging 思想,通过对样本和特征的双重随机采样,构建多棵决策树并综合其结果,在降低过拟合风险的同时,显著提升了模型的稳定性与泛化能力。

本文将从随机森林的核心原理出发,结合实战案例对比其与单棵决策树、逻辑回归的性能差异,通过可视化拆解森林内部结构,并总结其优缺点与适用场景,帮助读者快速掌握这一强大算法的核心逻辑与应用方法。

1、随机森林介绍

Bagging 思想 + 决策树就诞生了随机森林(Random Forest)。它通过构建多棵决策树并综合其结果,显著提升了模型的泛化能力和稳定性。

随机森林,都有哪些随机?

  • 样本随机:在构建每棵决策树时,采用有放回的随机抽样(bootstrap 抽样)从原始数据集中选取训练样本
  • 特征随机:在每个决策树节点分裂时,随机选择部分特征子集,仅从该子集中寻找最优分裂条件

这种双重随机性使得森林中的每棵树都具有一定的差异性,有效降低了单棵决策树容易过拟合的风险,同时通过多棵树的集体决策提高了预测的准确性和稳定性。

随机森林的工作流程可概括为:

  • 从原始数据集中通过 bootstrap 抽样生成多个不同的训练子集

  • 为每个子集构建一棵决策树,树的每个节点仅使用随机选择的部分特征

  • 对于分类问题,通过投票机制综合所有树的预测结果;对于回归问题,则取所有树预测值的平均值

2、随机森林实战

本章将通过具体的代码实现,在经典的鸢尾花数据集上开展实战实验,直观对比随机森林与单棵决策树、逻辑斯蒂回归的性能差异。

2.1、导包加载数据

import numpy as np
from sklearn import tree
from sklearn import datasets
from sklearn.model_selection import train_test_split
import graphviz
# ensemble 集成
# 随机森林
from sklearn.ensemble import RandomForestClassifier
# 作为对照
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
# 加载数据
X,y = datasets.load_iris(return_X_y=True)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 112)

2.2、普通决策树

score = 0
for i in range(100):X_train,X_test,y_train,y_test = train_test_split(X,y)model = DecisionTreeClassifier()model.fit(X_train,y_train)score += model.score(X_test,y_test)/100
print('随机森林平均准确率是:',score)

单棵决策树的性能受训练数据分割和树结构影响较大,多次运行的结果通常会有较大波动。

2.3、随机森林(运行时间稍长)

score = 0
for i in range(100):X_train,X_test,y_train,y_test = train_test_split(X,y)model = RandomForestClassifier()model.fit(X_train,y_train)score += model.score(X_test,y_test)/100
print('随机森林平均准确率是:',score)

结论:

  • 和决策树对比发现,随机森林分数稍高,结果稳定
  • 随机森林通过集成多棵树的预测,有效降低了模型的方差,减少了过拟合风险
  • 这种稳定性在数据集较小时尤为明显

2.4、逻辑斯蒂回归

import warnings
warnings.filterwarnings('ignore')
score = 0
for i in range(100):X_train,X_test,y_train,y_test = train_test_split(X,y)lr = LogisticRegression()lr.fit(X_train,y_train)score += lr.score(X_test,y_test)/100
print('逻辑斯蒂回归平均准确率是:',score)

结论:

  • 不同算法对特定数据集的适应性不同,逻辑斯蒂回归在鸢尾花数据集上表现优秀
  • 随机森林作为一种强大的通用算法,在各类数据集上通常都能取得良好表现
  • 实际应用中应尝试多种算法并选择最适合当前问题的模型

3、随机森林可视化

3.1、创建随机森林进行预测

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 9)
forest = RandomForestClassifier(n_estimators=100,criterion='gini')
forest.fit(X_train,y_train)
score1 = round(forest.score(X_test,y_test),4)
print('随机森林准确率:',score1)
print(forest.predict_proba(X_test))

随机森林的predict_proba方法返回每个样本属于各个类别的概率,这是通过综合所有决策树的预测结果得到的。

准确率为1.0:

3.2、对比决策树

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 112)
model = DecisionTreeClassifier()
model.fit(X_train,y_train)
print('决策树准确率:',model.score(X_test,y_test))
proba_ = model.predict_proba(X_test)
print(proba_)

准确率为1.0:

总结:

  • 一般情况下,随机森林比决策树更加优秀
  • 随机森林的predict_proba()返回的是概率分布(如 0.97),反映了模型对预测结果的置信度
  • 单棵决策树的predict_proba()返回的是确定值(0 或 1),因为每个样本最终只会落入一个叶节点

3.3、绘制决策树

随机森林由多棵决策树组成,我们可以查看其中的部分树来理解森林的多样性:

# 第一颗树类别
dot_data = tree.export_graphviz(forest[0],filled=True)
graph = graphviz.Source(dot_data)
graph

# 第五十颗树类别
dot_data = tree.export_graphviz(forest[49],filled=True)
graph = graphviz.Source(dot_data)
graph

# 第100颗树类别
dot_data = tree.export_graphviz(forest[-1],filled=True)
graph = graphviz.Source(dot_data)
graph

通过对比可以发现,随机森林中的不同决策树在结构和分裂条件上存在差异,这种多样性是随机森林能够提高预测性能的关键。

4、随机森林总结

随机森林主要步骤:

  • 随机选择样本:采用有放回抽样(bootstrap)从原始数据集中生成多个训练样本集。
  • 随机选择特征:每棵树的每个节点分裂时,仅从随机选择的特征子集中寻找最优分裂条件。
  • 构建决策树:为每个样本集构建一棵决策树,不进行剪枝。
  • 综合结果:分类问题采用多数投票机制,回归问题采用平均值。

优点:

  • 泛化能力强:通过集成多棵树的预测,有效降低了过拟合风险
  • 处理高维数据:特征随机选择机制使模型能高效处理高维度数据
  • 特征重要性评估:可以输出特征重要性分数,辅助特征选择和数据理解
  • 并行计算:树的构建过程相互独立,可并行计算,提高训练效率
  • 对缺失值和异常值不敏感:相比其他算法具有更强的鲁棒性
  • 适用范围广:既可用于分类问题,也可用于回归问题

缺点:

  • 计算成本较高:构建多棵树需要更多计算资源和时间
  • 模型解释性差:虽然单棵树易于解释,但多棵树的集成结果难以直观解释
  • 对噪声数据敏感:对于噪声过大的数据,仍有可能出现过拟合
  • 内存占用较大:存储多棵决策树需要更多内存空间

参数调优关键:

  • n_estimators:森林中树的数量,通常越大性能越好,但计算成本也越高。
  • max_features:每个节点分裂时考虑的最大特征数,控制特征随机性。
  • max_depth:树的最大深度,控制树的复杂度,防止过拟合。
  • min_samples_split:分裂内部节点所需的最小样本数。
  • min_samples_leaf:叶节点所需的最小样本数。

随机森林作为一种强大而实用的算法,在数据挖掘、机器学习竞赛和工业界都有广泛应用,是解决分类和回归问题的首选算法之一。

经过本章的实战对比,随机森林的优势已然清晰:相比单棵决策树,它用集成的力量提升了稳定性与准确率;面对逻辑斯蒂回归,也展现出强劲的竞争力。

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

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

相关文章

(计算机网络)TCP 三握中第三次 ACK 丢失会发生什么?

在 TCP 的三次握手过程中,如果 第三次 ACK 丢失,TCP 是如何保证连接可靠建立的呢?1️⃣ 场景说明第三次 ACK:客户端发送给服务器的 ACK,确认服务器的 SYN-ACK。假设该 ACK 在网络传输过程中丢失。2️⃣ 客户端状态客户…

容智Report Agent2.0重磅发布!重新定义企业数据分析AI时代

在数据成为生产要素之一的今天,很多企业依然面临这样的困境: 想要一份年度财务分析,财务团队可能要忙半个月甚至一个月;想查一个业务指标,要先找出在哪个系统,再申请权限、写SQL、调报表,折腾半…

高阶数据结构---ST表

hello大家好,今天是2025年8月23日,我要来给大家分享的是一个高阶数据结构---ST表。 一:引入 1.RMQ问题: 对于一个长度为 n 的序列,有 m 次查询操作,每次查询为一个区间 [l,r] 的最大值&#…

docker 安装nacos(vL2.5.0)

查找nacos 的所需的镜像版本 https://hub.docker.com/r/nacos/nacos-server/tags 拉取你所需的版本(我们用v2.5.0) docker pull nacos/nacos-server:v2.5.0 注意:因为我们需要挂载外配置文件 直接用volume 挂载目录 缺少初始文件报错 我们…

在github上通过dmca数字版权申诉侵权并删除侵权仓库

DMCA是什么? 《数字千年版权法案》(DMCA)为版权所有者(包括软件开发人员)创建了一个标准化的流程,要求GitHub删除侵权内容。您可以在美国版权局的官方网站上找到有关DMCA的更多信息。有关GitHub如何处理DM…

AI安全监控与人才需求的时间悖论(对AI安全模型、AI安全人才需求的一些思考)

当监控者与被监控者都是AI时,谁来监控监控者?这个看似简单的问题,却揭示了人工智能安全领域的根本性困境。一、问题的提出:当AI监控AI 随着大语言模型和生成式AI的快速发展,AI系统在元认知层面的能力越来越强&#xff…

AI模型部署 - 大型语言模型(LLM)推理部署中的实际显存评估

目录 第一部分:大型语言模型(LLM)推理显存占用的核心原理 1.1 显存占用的主要构成部分 1.2 影响显存占用的关键因素 1.2.1 模型架构:MoE vs. 稠密模型 1.2.2 上下文长度与并发数 1.2.3 部署方式与推理框架 1.2.4 硬件能力 第二部分:显存占用的精确计算方法 2.1 模…

【大语言模型 16】Transformer三种架构深度对比:选择最适合你的模型架构

【大语言模型 16】Transformer三种架构深度对比:选择最适合你的模型架构 关键词:Transformer架构,Encoder-Only,Decoder-Only,Encoder-Decoder,BERT,GPT,T5,模型选择&…

【LeetCode 热题 100】31. 下一个排列

Problem: 31. 下一个排列 文章目录整体思路完整代码时空复杂度时间复杂度:O(N)空间复杂度:O(1)整体思路 这段代码旨在解决经典的 “下一个排列” (Next Permutation) 问题。问题要求重新排列一个整数数组,使其变为字典序上的下一个更大的排列…

【Linux 进程】进程程序替换

文章目录1.进程替换的六个库函数2.execl1.进程替换的六个库函数 使用 man 3 execl 进行查询,3表示 Linux 中的3号手册,即为库函数(例如C标准库中的库函数,printf,malloc) man 1: 用户命令(在sh…

ReasonRank: Empowering Passage Ranking with Strong Reasoning Ability

主要内容总结 本文提出了一种具有强推理能力的列表式段落重排序模型ReasonRank,旨在解决现有重排序模型在推理密集型场景(如复杂问答、数学问题、代码查询等)中表现不佳的问题,核心原因是这类场景缺乏高质量的推理密集型训练数据。 为解决这一问题,研究团队: 设计了自动…

不卡顿、不掉线!稳定可靠的体育赛事直播系统源码解析

在体育和电竞行业,实时直播系统已经成为平台的标配。无论是 OTT、比分直播网站,还是综合类体育社区,用户对直播体验的要求越来越高:不卡顿、不掉线、实时性强。那么,从技术角度出发,一个稳定可靠的 体育赛事…

三菱FX5U PLC访问字变量的某一位

三菱FX5U PLC气缸控制功能块 三菱FX5U气缸控制功能块(完整ST源代码+示例程序)_三菱fx5u标签气缸报警程序功能块-CSDN博客文章浏览阅读560次,点赞5次,收藏2次。如果机器包含100个气缸,我们只需要修改数组的元素数量就可以了,效率非常的高。待续....博途PLC 面向对象系列之“…

Java大厂面试全真模拟:从Spring Boot到微服务架构实战

Java大厂面试全真模拟:从Spring Boot到微服务架构实战 面试场景:某互联网大厂Java后端岗位,候选人谢飞机(水货程序员) 第一轮:基础与框架认知 面试官:你好,谢飞机,先简单…

Unity游戏打包——Mac基本环境杂记

1、安装 Homebrew若未安装,在使用 brew 命令时将提示 zsh: command not found: brew安装命令:/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2、更换终端默认 Shell 为 zsh查看已安装的shell&#…

服务组件体系结构(SCA)全景解析

服务组件体系结构(SCA)全景解析SCA(Service Component Architecture)是 SOA 生态中专门用来“把服务拼起来并跑起来”的规范。它通过语言中立、协议可插拔、装配声明式三大能力,把“接口—实现—协议”彻底解耦&#x…

问:单证硕士含金量是否不足?

很多人认为花几万块钱读一个同等学历申硕,含金量并没有那么高,但事实却并非如此。今天我们从证书和学习的两个方面来聊一下同等学历申硕的含金量到底是如何的。一、单证含金量看以下几点:(1)国家认证与学信网可查 …

0.04% vs 0.1%:精度差一点,逆变器性能差距有多大?

一台光伏逆变器损失的功率可能仅仅源于0.3%的MPPT效率差距。这个足以影响产品竞争力的数字,可能并非算法优劣,而在于测试源头的精度选择:是0.04%还是0.1%?本文通过四大测试场景的量化对比,揭示不同的测试精度如何影响产…

Docker Hub 镜像一键同步至阿里云 ACR

🐳 Docker Hub 镜像一键同步至阿里云 ACR 本脚本用于 从 Docker Hub 拉取镜像并推送到阿里云容器镜像服务(ACR)。 它通过 Python 的 docker SDK 封装了完整流程:拉取 → 重命名 → 登录 → 推送,并在控制台实时输出进度…

软考-系统架构设计师 计算机系统基础知识详细讲解

个人博客:blogs.wurp.top 一、计算机系统组成与多级层次结构 1. 冯诺依曼体系结构 (核心考点) 这是所有现代计算机的理论基础。核心思想是 “存储程序” 。 五大部件:运算器、控制器、存储器、输入设备、输出设备。工作流程:指令驱动。CP…