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

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

时间:2024-10-28 22:15:51浏览次数:8  
标签:plt PSO rmse 优化 gamma test SVR final best

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


关于作者


作者:小白熊

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

联系邮箱[email protected]

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



在本文中,我们将详细探讨如何使用粒子群优化(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模型,还可以扩展到其他机器学习模型的参数优化中。

标签:plt,PSO,rmse,优化,gamma,test,SVR,final,best
From: https://blog.csdn.net/m0_59197405/article/details/143315324

相关文章

  • 基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率
    1.程序功能描述基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出ACO优化的收敛曲线,规划路径结果和每一条路径的满载率。2.测试软件版本以及运行结果展示MATLAB2022a版本运行3.核心程序fori=1:Iterationiis_best=0;forj=1:Npop%蚂蚁搜索一次......
  • 【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)
    ......
  • 【MySql进阶及常见方案】mysql索引底层原理和优化手段
    mysql索引底层原理和优化手段不管业务怎么发展,数据最终都要存储到数据库中,所以数据库是必不可少的一个环节。而随着业务逐渐壮大,并发越来越高,数据库很容易成为整个链路的短板。而调优的第一步,都是从sql语句、索引入手。先得保证单个数据库执行没问题,才会有更高层次的分库......
  • httpsok:自动续期SSL证书的最佳选择!
    一、引言        在数字化时代,网站的安全性至关重要,而SSL证书是保护用户数据、提升网站信誉的关键。然而,证书的续期往往令人头痛。今天,我们为你介绍一款高效的SSL证书自动续期工具——httpsok,让你的证书管理变得轻松无忧。二、什么是httpsok?httpsok是一款专为网站......
  • 使用 EXPLAIN 分析结果优化 SQL 查询
    使用EXPLAIN分析结果优化SQL查询是数据库性能调优中的一项重要技能。EXPLAIN语句能够展示数据库查询优化器对SQL查询的处理计划,从而帮助开发者识别查询中的瓶颈和低效部分。本文将详细介绍如何使用EXPLAIN分析结果来优化SQL查询。一、什么是EXPLAINEXPLAIN语......
  • 从限流削峰到性能优化,谈抽奖系统架构实践【转】
    抽奖是一个典型的高并发场景应用,平时流量不多,但遇到大促活动,流量就会暴增,今年的周年庆期间的日均UV就超过百万。在过去的一年里,负责过这个项目的多次重构工作,期间各种踩坑无数,就以此文当做总结,来聊聊我们是如何架构这个高并发系统吧。整体设计详解在我看来,能提高服务器应对并发......
  • NPM 包开发与优化全面指南
    前言Hey,我是Immerse系列文章首发于【Immerse】,更多内容请关注该网站转载说明:转载请注明原文出处及版权声明!1.理解NPM包的结构1.1package.json文件:包的核心package.json文件是NPM包的中央配置,定义了包的各个方面,从基本元数据到复杂的发布配置。{"name":"m......
  • 改进的鲸鱼算法(IWOA)优化BP神经网络原理及Matlab代码复现
    目录0引言1数学模型2模型性能提升3Maltab代码3.1伪代码3.3IWOA-BP0引言为了缓解WOAQ易陷入局部最优和收敛精度低的问题,武泽权等人提出一种改进的鲸鱼优化算法(IWOA)。该算法通过准反向学习方法来初始化种群,提高种群的多样性;然后将线性收敛因子修改为非线性收......
  • 改进的鲸鱼算法(IWOA)优化支持向量机原理及Matlab代码复现
    目录0引言1数学模型2模型性能提升3Maltab代码3.1伪代码3.3IWOA-SVM/SVR0引言为了缓解WOAQ易陷入局部最优和收敛精度低的问题,武泽权等人提出一种改进的鲸鱼优化算法(IWOA)。该算法通过准反向学习方法来初始化种群,提高种群的多样性;然后将线性收敛因子修改为非......
  • 【办公类-53-14】2024年9月周计划系列优化(5天、6天、7天模版)
    11月为了迎接普及普惠督导抽查,所有班级资料都要做到第11周。我拿出去年的周计划代码,重新批量一下。这学期做代码有一个难点——并非全部5天,“国庆节”的4-5周是7天教案放在一个WORD模版上5天模版(一横三竖=4页)节日写法7天模版(一横四竖=5页)而原版的周计划里面也有6天7......