机器学习实战——基于粒子群优化算法(PSO)优化支持向量回归(SVR)模型(附完整代码)

基于粒子群优化算法优化支持向量回归模型(附完整代码)


关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱:xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~



在本文中,我们将详细探讨如何使用粒子群优化(Particle Swarm Optimization, PSO)算法来优化支持向量回归(Support Vector Regression, SVR)模型的参数,并展示这一过程在实际数据预测中的效果。我们将使用Python编程语言,并结合numpypandaspyswarmsklearnmatplotlib等库来实现这一过程。



一、模型理论基础


1. 支持向量回归(SVR)

  支持向量回归是一种用于回归分析的监督学习模型,它是支持向量机(SVM)在回归问题上的扩展。SVR的目标是找到一个函数,使得所有训练数据点尽可能接近该函数,同时允许一定的偏差。SVR的关键参数包括正则化参数C和核函数参数(如γ)。C参数控制模型的复杂度和训练数据的拟合程度,而γ参数影响核函数的宽度,从而影响模型的决策边界。


2. 粒子群优化(PSO)

  粒子群优化是一种基于群体智能的优化算法,模拟鸟群或鱼群的觅食行为。在PSO中,每个粒子代表一个潜在的解决方案,通过不断调整自己的位置和速度来寻找最优解。算法的核心在于每个粒子根据自身的历史最优位置(pBest)和整个群体的历史最优位置(gBest)来更新自己的速度和位置。PSO算法简单、易于实现,且在许多实际问题中表现良好。


二、代码实现


1. 数据预处理

首先,我们加载数据并进行预处理。

import numpy as np  
import pandas as pd  
  
# 加载数据  
data = pd.read_excel(r"数据.xlsx", sheet_name='2022')  
  
# 填充缺失值  
data = data.interpolate()  
data = data.values

2. 特征提取与数据集划分

接下来,我们从数据中提取特征和目标变量,并将数据集划分为训练集和测试集。

from sklearn.model_selection import train_test_split  
  
# 提取特征  
features = data[:, [1, 2, 3, 4, 5, 12]]  
labels = data[:, [6]]  
  
# 划分数据集  
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=47)

3. 定义目标函数

目标函数用于评估给定参数下的SVR模型性能。我们使用均方误差(MSE)作为性能指标,并计算其平方根(RMSE)来评估模型的预测误差。

from sklearn.svm import SVR  
from sklearn.metrics import mean_squared_error  
  
# 定义目标函数  
def fun_svr(params):  # 最小化  
    global rmse_best  
    C, gamma = params  
    if C < 1e-6 or gamma < 1e-6:  
        return 1e10  # 避免参数过小  
  
    model = SVR(C=C, gamma=gamma, kernel='rbf')  
    model.fit(X_train, y_train)  
    y_pred = model.predict(X_test)  
    mse = mean_squared_error(y_test, y_pred)  
    rmse = np.sqrt(mse)  
    if rmse < rmse_best:  
        rmse_best = rmse  
        rmse_list.append(rmse)  
    else:  
        rmse_list.append(rmse_best)  
    return rmse

4. 粒子群优化

使用pyswarm库中的pso函数来寻找最佳参数组合。

from pyswarm import pso  
  
# 参数范围  
lb = [1e-6, 1e-6]  # 下界  
ub = [100, 100]  # 上界  
  
# PSO  
maxiter = 100  # 迭代次数  
swarmsize = 300  # 种群大小  
best_params, _ = pso(fun_svr, lb, ub, swarmsize=swarmsize, maxiter=maxiter, debug=True)

5. 模型训练与预测

使用找到的最佳参数训练最终的SVR模型,并进行预测。

# 提取最佳参数  
best_C, best_gamma = best_params  
  
# 使用最佳参数训练模型  
final_model = SVR(C=best_C, gamma=best_gamma, kernel='rbf')  
final_model.fit(X_train, y_train)  
  
# 预测  
final_y_pred = final_model.predict(X_test)

6. 评估模型性能

计算并打印模型的均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)和平均绝对百分比误差(MAPE)。

from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error  
  
mse = mean_squared_error(y_test, final_y_pred)  
rmse = np.sqrt(mse)  
mae = mean_absolute_error(y_test, final_y_pred)  
mape = mean_absolute_percentage_error(y_test, final_y_pred)  
  
print(f"Best C: {best_C}")  
print(f"Best gamma: {best_gamma}")  
print(f"RMSE: {rmse}")  
print(f"MAE: {mae}")  
print(f"MAPE: {mape}")

7. 结果可视化

绘制PSO迭代图和真实值与预测值的对比图,以直观地展示优化过程和模型性能。

import matplotlib.pyplot as plt  
  
# 绘制PSO迭代图  
plt.figure(figsize=(10, 6))  
plt.plot(rmse_list1, label='RMSE')  
plt.xlabel('迭代次数')  
plt.ylabel('误差')  
plt.title('PSO迭代图')  
plt.show()  
  
# 绘制真实值与预测值的对比图  
plt.figure(figsize=(10, 6))  
plt.plot(y_test, label='真实值')  
plt.plot(final_y_pred, label='预测值')  
plt.xlabel('样本序号')  
plt.ylabel('预测值')  
plt.title('验证集预测结果对比')  
plt.legend()  
plt.grid(True)  
plt.show()



三、完整代码

import numpy as np
import pandas as pd
from pyswarm import pso
from sklearn.svm import SVR
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error, mean_squared_error
import warnings

warnings.filterwarnings("ignore")

# 设置中文字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 加载数据
data = pd.read_excel(r"数据.xlsx", sheet_name='2022')


# 填充缺失值
data = data.interpolate()
data = data.values

# 提取特征  
features = data[:, [1, 2, 3, 4, 5, 12]]
labels = data[:, [6]]

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=47)

# 保存每次迭代的RMSE
rmse_list = []
rmse_best = 1e10


# 定义目标函数
def fun_svr(params):  # 最小化
    global rmse_best
    C, gamma = params
    if C < 1e-6 or gamma < 1e-6:
        return 1e10  # 避免参数过小

    # 构建模型{'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}
    model = SVR(C=C, gamma=gamma, kernel='rbf')
    # 训练模型
    model.fit(X_train, y_train)
    # 预测
    y_pred = model.predict(X_test)
    # 计算均方误差
    mse = mean_squared_error(y_test, y_pred)

    # 记录RMSE
    rmse = np.sqrt(mse)
    if rmse < rmse_best:
        rmse_best = rmse
        rmse_list.append(rmse)
    else:
        rmse_list.append(rmse_best)

    return rmse


# 参数范围
lb = [1e-6, 1e-6]  # 下界
ub = [100, 100]  # 上界

# PSO
maxiter = 100  # 迭代次数
swarmsize = 300  # 种群大小
best_params, _ = pso(fun_svr, lb, ub, swarmsize=swarmsize, maxiter=maxiter, debug=True)

# 提取最佳参数
best_C, best_gamma = best_params

# 使用最佳参数训练模型
final_model = SVR(C=best_C, gamma=best_gamma, kernel='rbf')
final_model.fit(X_train, y_train)

# 预测
final_y_pred = final_model.predict(X_test)

# 计算误差指标
mse = mean_squared_error(y_test, final_y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, final_y_pred)
mape = mean_absolute_percentage_error(y_test, final_y_pred)

print(f"Best C: {best_C}")
print(f"Best gamma: {best_gamma}")
print(f"RMSE: {rmse}")
print(f"MAE: {mae}")
print(f"MAPE: {mape}")

rmse_list1 = rmse_list[::swarmsize][:maxiter]
# 绘制PSO迭代图
plt.figure(figsize=(10, 6))
plt.plot(rmse_list1, label='RMSE')
plt.xlabel('迭代次数')
plt.ylabel('误差')
plt.title('PSO迭代图')
plt.show()

# 绘制真实值与预测值的对比图
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='真实值')
plt.plot(final_y_pred, label='预测值')
plt.xlabel('样本序号')
plt.ylabel('预测值')
plt.title('验证集预测结果对比')
plt.legend()
plt.grid(True)
plt.show()




四、总结

  本文详细介绍了如何使用粒子群优化算法来优化支持向量回归模型的参数。通过定义目标函数、设置参数范围、执行PSO算法、训练最终模型和评估模型性能等步骤,我们成功找到了最优的参数组合,并展示了模型在验证集上的预测效果。结果可视化部分进一步帮助我们直观地理解了优化过程和模型性能。这种方法不仅适用于SVR模型,还可以扩展到其他机器学习模型的参数优化中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter登录界面使用主题

Now, let’s use the theme we initially created in our main function for a simple login screen: 现在&#xff0c;让我们使用最初在主函数中创建的主题来制作一个简单的登录屏幕&#xff1a; Create a Login Screen Widget: Inside the main.dartfile, create a new wid…

尚硅谷 | Nginx | 学习笔记

尚硅谷 | Nginx | 学习笔记 尚硅谷Nginx教程由浅入深&#xff08;一套打通丨初学者也可掌握&#xff09;_哔哩哔哩_bilibili 文章目录 尚硅谷 | Nginx | 学习笔记一、Nginx相关概念1.Nginx是什么2.正向代理和反向代理正向代理反向代理 3.负载均衡和动静分离负载均衡动静分离 二…

[论文阅读]Detecting Pretraining Data from Large Language Models

Detecting Pretraining Data from Large Language Models http://arxiv.org/abs/2310.16789 这篇文章正式提出了Min-k%方法来实现成员推理攻击 贡献 介绍了WIKIMIA动态基准测试。旨在定期自动评估任何新发布的预训练 LLMs。通过利用 Wikipedia 数据时间戳和模型发布日期&am…

C#与C++交互开发系列(十三):在C#中使用C++编写的DLL,导出类的完整指南

前言 在跨平台和跨语言开发中,C++ 和 C# 的互操作性可以帮助我们实现更灵活且高性能的解决方案。C++ DLL 可以封装高效的算法或硬件相关的代码,而在 C# 中调用这些功能则可以大大简化开发。然而,由于 C++ 和 C# 的底层实现不同,导出 C++ 类并在 C# 中使用并不简单。因此,…

精选:HR招聘管理工具Top5使用体验

作为企业招聘者&#xff0c;如何在选择中找到开启高效招聘之门的钥匙&#xff0c;成为了每一位企业招聘管理者必须面对的难题&#xff0c;在面对市场上琳琅满目的招聘工具&#xff0c;你是否也曾感到无头绪&#xff0c;不知所措&#xff1f;每个工具都声称自己拥有独特的优势和…

python之多任务爬虫——线程、进程、协程的介绍与使用(16)

文章目录 1、什么是多任务?1.1 进程和线程的概念1.2 多线程与多进程的区别1.3 并发和并行2、python中的全局解释器锁3、多线程执行机制4、python中实现多线程(threading模块)4.1 模块介绍4.2 模块的使用5、python实现多进行程(Multiprocessing模块)5.1 导入模块5.2 模块的…

Kafka之消费者客户端

1、历史上的二个版本 与生产者客户端一样&#xff0c;在Kafka的发展过程当中&#xff0c;消费者客户端主要有两个大的版本&#xff1a; 旧消费者客户端&#xff08;Old Consumer&#xff09;&#xff1a;基于Scala语言开发的版本&#xff0c;又称为Scala消费者客户端。新消费…

Python 中的 @ 符号是如何工作的!

写在前面 Python 中的 符号是一个非常强大而又灵活的功能&#xff0c;它代表一个叫做"装饰器"的"语法糖"。在本文中&#xff0c;我们将一步步地了解它的工作原理&#xff0c;并通过示例代码加深理解。 基本概念 在 Python 中&#xff0c; 符号通常用于…

2024年9月电子学会青少年软件编程Python等级考试(三级)真题试卷

2024年9月青少年软件编程Python等级考试&#xff08;三级&#xff09;真题试卷 选择题 第 1 题 单选题 以下python表达式的值为True的是&#xff1f;&#xff08; &#xff09; A.all( ,1,2,3) B.any([]) C.bool(abc) D.divmod(6,0) 第 2 题 单选题 下列python代码的…

python项目实战——多协程下载美女图片

协程 文章目录 协程协程的优劣势什么是IO密集型任务特点示例与 CPU 密集型任务的对比处理 I/O 密集型任务的方式总结 创建并使用协程asyncio模块 创建协程函数运行协程函数asyncio.run(main())aiohttp模块调用aiohttp模块步骤 aiofiles————协程异步函数遇到的问题一 await …

【Linux系统编程】——探索Shell:工作原理与运行机制以及Linux的权限管理

文章目录 1. 什么是 Shell&#xff1f;2. Shell 的工作原理3. Shell 的运行机制4. Shell 的应用场景5. Shell 脚本的优缺点Linux权限的概念Linux权限管理文件权限值的表示方法文件访问权限的相关设置方法 目录的权限粘滞位关于权限的总结 1. 什么是 Shell&#xff1f; Shell 是…

Linux下的文件系统(进程与文件)

windows下的文件构成 .内容 .属性 所以&#xff0c; 文件的构成为内容和属性。 文件 内容 属性 推此即彼&#xff0c; linux下的文件构成也是如此。 liunx下&#xff0c;文件 文件的内核数据结构&#xff08;属性&#xff09;内容 深入理解c语言中的文件操作 在c语言中如…

【笔记】LLM位置编码之标准位置编码

标准位置编码 起源原理证明&#xff1a;对于任何固定的偏移量 k k k&#xff0c; P E p o s k PE_{posk} PEposk​可以表示为 P E p o s PE_{pos} PEpos​的线性函数。计算 P E p o s k 与 P E p o s PE_{posk} 与PE_{pos} PEposk​与PEpos​的内积结论 通俗理解缺点 起源 由…

论文笔记:LaDe: The First Comprehensive Last-mile Delivery Dataset from Industry

2023 KDD 1 intro 1.1 背景 随着城市化进程的加快和电子商务的发展&#xff0c;最后一公里配送已成为一个关键的研究领域 最后一公里配送&#xff0c;如图1所示&#xff0c;是指连接配送中心和客户的包裹运输过程&#xff0c;包括包裹的取件和配送除了对客户满意度至关重要外…

诺基亚的裁员风暴

大家好&#xff0c;我是鸭鸭&#xff01; 不知道 80、90 后还记得童年神机诺基亚吗&#xff1f; 虽然诺基亚早就把自家手机业务出售&#xff0c;但依然是一代通信巨头。 鸭鸭最近看到新闻&#xff0c;诺基亚已经在大中华区裁减了近 2000 名员工 。 根据 2023 年底&#xff0…

YOLOv8实战野生动物识别

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对野生动物数据集进行训练和优化&#xff0c;该数据集包含丰富的野生动物图像样本…

9.Linux按键驱动-工作队列

1.思路 1.1在gpio结构体中定义工作队列 1.2 在probe函数中初始化工作队列 1.3.在中断服务程序中调度工作队列 1.4工作队列处理函数&#xff1a; 2.编程 程序&#xff1a; #include <linux/module.h> #include <linux/fs.h> #include <linux/errno.h> #…

C语言程序设计:现代设计方法习题笔记《chapter6》下篇

第七题 square3.c代码 #include<stdio.h>int main() { int i, n, odd, square;printf("This program prints a table of squares.\n");printf("Enter number of entries in table: ");scanf_s("%d", &n);i 1;odd 3;for (square 1;…

数据库课程 第一周

1.数据库的安装与卸载 1.1数据库的卸载&#xff1a; &#xff08;1&#xff09;第一种卸载方式&#xff1a;删除文件目录 &#xff08;2&#xff09;第二种卸载方式&#xff1a;在控制面版中卸载&#xff0c;然后在c盘里找到mysql文件删除 1. 2.在隐藏目录programdata里 1.2…

新王Claude 3.5的6大应用场景

Anthropic AI深夜发布了备受期待的Claude 3.5系列更新&#xff0c;包括了全新升级的Claude 3.5 Sonnet和首发的Claude 3.5 Haiku。 Claude 3.5 Sonnet能够理解细微的指令和上下文&#xff0c;识别并纠正自身错误&#xff0c;还能从复杂数据中生成深入的分析和洞察。 结合最先进…