机器学习 之 决策树与随机森林的实现

引言

随着互联网技术的发展,垃圾邮件过滤已成为一项重要的任务。机器学习技术,尤其是决策树和随机森林,在解决这类问题时表现出色。本文将介绍随机森林的基本概念,并通过一个具体的案例——筛选垃圾电子邮件——来展示随机森林的实际应用。

随机森林简介

随机森林是一种基于决策树的集成学习方法,它通过构建多个决策树并综合它们的预测结果来提高准确性和防止过拟合。随机森林的工作原理主要包括以下几个步骤:

  1. 自助采样:从原始数据集中通过有放回的方式抽取多个子样本集。
  2. 构建决策树:在每个子样本集上独立地构建一棵决策树。
  3. 随机特征选择:在构建每棵树的过程中,每个节点的分裂都是从所有特征的一个随机子集中选出最优特征。
  4. 投票机制:对于分类任务,每棵树都会对新样本给出一个预测类别,最终的预测类别是所有树预测结果的多数表决结果。

随机森林的优点包括:

  • 鲁棒性:由于使用了多棵决策树,单棵树的错误不会影响整体预测结果。
  • 易于实现:随机森林的实现相对简单,并且不需要太多的参数调整。
  • 并行计算:每棵树可以独立构建,这使得随机森林非常适合于并行计算环境。
  • 特征重要性:可以评估特征的重要性,帮助选择最具影响力的特征。
实验数据介绍

本次实验使用的数据集名为 spambase.xlsx。数据集包含了用于识别垃圾邮件的特征,其中包括:

  • 单词频率 (Word_freq_makeWord_freq_address, 等):特定单词在邮件中出现的频率。
  • 字符频率 (Char_freq1Char_freq2, 等):特定字符在邮件中出现的频率。
  • 大写字母连续长度统计 (Capital_run_length_averageCapital_run_length_longest, 等):大写字母连续出现的平均长度和最长长度。
  • 标签 (label):邮件是否为垃圾邮件,0表示非垃圾邮件,1表示垃圾邮件。

实例:随机森林实现垃圾邮件筛选
加载数据

首先,我们需要使用Pandas库加载Excel文件中的数据。

import pandas as pd# 读取数据
df = pd.read_csv('spambase.csv')# 分割特征和标签
X = df.iloc[:, :-1]  # 特征列
y = df.iloc[:, -1]   # 标签列
划分数据集

接着,我们将数据集分为训练集和测试集。

from sklearn.model_selection import train_test_split# 划分数据集
xtrain, xtest, ytrain, ytest = \train_test_split(X, y, test_size=0.2, random_state=100)
构建随机森林模型

现在,我们使用RandomForestClassifier类构建一个随机森林模型,并设置相关的超参数

from sklearn.ensemble import RandomForestClassifier# 创建随机森林分类器
rf = RandomForestClassifier(n_estimators=108,  # 决策树的数量max_features=0.8,  # 最大特征数量比例random_state=0     # 随机种子
)# 训练模型
rf.fit(xtrain, ytrain)
模型评估

最后,我们将评估模型在训练集和测试集上的表现。

from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix# 定义混淆矩阵函数
def cm_plot(y, yp):cm = confusion_matrix(y, yp)plt.matshow(cm, cmap=plt.cm.Blues)plt.colorbar()for x in range(len(cm)):for y in range(len(cm)):plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')plt.ylabel('True label')  # 真实标签plt.xlabel('Predicted label')  # 预测标签return plt# 在训练集上进行预测
train_predicted = rf.predict(xtrain)# 输出训练集上的分类报告
print("Training Set Classification Report:")
print(metrics.classification_report(ytrain, train_predicted))# 绘制训练集上的混淆矩阵
cm_plot(ytrain, train_predicted).show()# 在测试集上进行预测
test_predicted = rf.predict(xtest)# 输出测试集上的分类报告
print("Test Set Classification Report:")
print(metrics.classification_report(ytest, test_predicted))# 绘制测试集上的混淆矩阵
cm_plot(ytest, test_predicted).show()
 输出结果:

训练集各指标报告:

训练集混淆函数: 

预测集各指标报告:

预测集混淆矩阵

结论

随机森林是一种强大的机器学习算法,能够有效地处理分类和回归任务。通过上述代码,我们已经成功地使用随机森林对spambase.xlsx数据集进行了训练和评估。从输出的分类报告和混淆矩阵中可以看出模型的性能情况。随机森林因其简单易用和高效的特点,在许多实际应用中都取得了很好的效果。

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

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

相关文章

【OpenGL】xcode+glfw画三角形

环境搭建 1. 执行brew install glfw 2. 项目中Build Settings中header Search Paths中添加glfw的include路径 3. 项目中Build Phases中的Link Binary With Libraries中添加glfw的lib文件(路径/opt/homebrew/Cellar/glfw/3.4/lib/libglfw.3.4.dylib)及…

数据结构之内核链表,栈,队列

今天主要学习了内核链表,顺序栈,链式栈,顺序队列,链式队列的相关内容。 一.内核链表 内核链表和之前的单向,双向链表有所不同的是内核链表的结构是数据包含节点,特点如下: 1.一种链表结构能够操…

谷歌的 GameNGen:无需游戏引擎,人工智能模拟 “毁灭战士“,开辟新天地

谷歌公司的研究人员创建了一个神经网络,可以在不使用传统游戏引擎的情况下生成经典射击游戏《毁灭战士》的实时游戏,从而实现了人工智能领域的一个重要里程碑。这个名为 GameNGen 的系统标志着人工智能向前迈出了重要一步,它能在单芯片上以每…

c语言(二叉树)

第4章 二叉树和BST 树与二叉树 基本概念 树是一种非线性结构,其严格的数学定义是:如果一组数据中除了第一个节点(第一个节点称为根节点,没有直接前驱节点)之外,其余任意节点有且仅有一个直接前驱&#xff…

Python相关系数导图

🎯要点 量化变量和特征关联绘图对比皮尔逊相关系数、斯皮尔曼氏秩和肯德尔秩汽车性价比相关性矩阵热图大流行病与资产波动城镇化模型预测交通量宝可梦类别特征非线性依赖性捕捉向量加权皮尔逊相关系数量化图像相似性 Python皮尔逊-斯皮尔曼-肯德尔 皮尔逊相关系…

Node.js原生开发脚手架工具(下)

前言 在现代软件开发中,脚手架工具成为提高开发效率和一致性的关键利器。使用Node.js原生开发自己的脚手架工具不仅能帮助自动化常见任务,还能根据具体需求进行高度定制。Node.js的异步非阻塞特性和丰富的模块系统使其成为构建这种工具的理想选择。本篇文…

★ 算法OJ题 ★ 力扣202 - 快乐数

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--快乐数~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 题⽬告诉我们&#xff0c;当我们不断重复操作…

Java设计模式之外观模式详细讲解和案例示范

1. 引言 在软件开发过程中&#xff0c;复杂的系统往往包含许多子系统和模块&#xff0c;随着系统功能的增加&#xff0c;模块之间的交互也变得更加复杂。这种复杂性可能会导致系统的可维护性和扩展性降低。外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式…

java同步概念

同步&#xff08;Synchronization&#xff09;在Java多线程编程中是一个既重要又复杂的概念。它涉及到如何确保多个线程在访问共享资源时能够保持数据的一致性和完整性&#xff0c;避免出现竞态条件&#xff08;Race Condition&#xff09;等问题。 同步的基本概念 同步的主要目…

深入解析体育馆蓝牙导航系统的技术实现与应用

技术爱好者与开发者们&#xff0c;您是否在大型体育馆内常常为找不到洗手间、休息区或观赛区而烦恼&#xff1f;随着科技的进步&#xff0c;我们团队倾力打造了体育馆蓝牙导航系统&#xff0c;专为解决这一痛点而生。本系统利用先进的蓝牙信标技术和精准的室内定位算法&#xf…

YOLO | YOLO目标检测算法(YOLO-V1)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 YOLO目标检测算法 YOLO V1概述&#xff08;2016&#xff09; YOLO V1概述&#xff08;2016&#xff09; 经典的One-stage方法 YOLO&#xff1a;You Only Look Once 把…

【河北航空-注册安全分析报告-无验证方式导致安全隐患】

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

ZaKi:Ingonyama的Prover market基础设施

1. 引言 Ingonyama团队预计在不久的将来会出现大量去中心化证明市场&#xff08;Prover market&#xff09;。这些市场的独特之处在于高可用性和高性能的基础设施&#xff0c;以及强大的安全性和透明度保障。 2. 证明市场的出现 零知识 (ZK) Rollups&#xff0c;如 Starknet…

【如何用本机的Navicat远程连接到ubuntu服务器上的mysql】

文章目录 版本一、ubuntu服务器安装mysql5二、远程连接——mysql配置1.创建新mysql用户2.修改配置文件3.查看端口是否开启 三、远程连接——Navicat 版本 mysql:5.7.32 服务器&#xff1a;ubuntu20.04 PC:win10 一、ubuntu服务器安装mysql5 因为ubuntu20.04默认mysql其实是my…

命令模式详解

命令模式 简介:命令模式将一个请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 人话: 总体来说, 就是一个命令类, 一个执行类, 命令类包括执行类, 然后在外部添加一个总的管…

【数模修炼之旅】10 遗传算法 深度解析(教程+代码)

【数模修炼之旅】10 遗传算法 深度解析&#xff08;教程代码&#xff09; 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法&#xff0c;大家可以关注这个专栏&#xff0c;持续学习哦&#xff0c;对于大家的能力提高会有极大的帮助。 1 遗传算法介绍及应用 …

Zookeeper官网Java示例代码解读(一)

2024-08-22 1. 基本信息 官网地址&#xff1a; https://zookeeper.apache.org/doc/r3.8.4/javaExample.html 示例设计思路 Conventionally, ZooKeeper applications are broken into two units, one which maintains the connection, and the other which monitors data. I…

在随机点实现凸包包围游戏地区

讲解视频在连接点之后&#xff0c;想起来两年前看数学书&#xff0c;记住凸包二字&#xff0c;连接敌人外围点&#xff0c;意外找到凸包算法_哔哩哔哩_bilibili //author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞…

USB3202N多功能数据采集卡16位模拟量250K频率LabVIEW采集卡

品牌&#xff1a;阿尔泰科技 系列&#xff1a;多功能数据采集卡 概述&#xff1a; USB3202N多功能数据采集卡&#xff0c;LabVIEW无缝连接&#xff0c;提供图形化API函数&#xff0c;提供8通道&#xff08;RSE、NRSE&#xff09;、4通道&#xff08;DIFF&#xff09;模拟量输…

《HelloGitHub》第 101 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…