当前位置:   article > 正文

粒子群算法调参支持向量回归进行预测(PSO-SVR)Python实现

pso-svr

目录

一、算法简介

二、示例

1.导入库包、数据以及数据预处理

2.利用粒子群算法调优参数gamma和C

3.模型训练与预测

4.对模型进行性能评估

5.结果展示

 三、代码总结

SVR.py

PSO_SVR.py


一、算法简介


SVR(支持向量回归)是一种有效的非线性回归方法,它可以通过寻找一组最优参数来拟合数据。粒子群算法是一种优化算法,可以用于找到最佳的SVR参数。

以下是使用粒子群算法进行SVR参数调优的步骤:

  1. 确定SVR模型的核函数和参数范围。常用的核函数有线性核、多项式核和高斯径向基核。参数范围包括核函数参数、正则化参数等。

  2. 定义粒子群算法的目标函数。在SVR预测中,通常使用均方误差(MSE)或均方根误差(RMSE)作为目标函数。

  3. 初始化粒子群的位置和速度。每个粒子表示一组参数,位置表示参数的值,速度表示参数的变化方向和速率。初始化时,可以随机生成一组粒子,并将其位置和速度随机分配在参数范围内。

  4. 计算每个粒子的适应度。将每个粒子的位置作为SVR模型的参数,运行模型并计算相应的目标函数值。

  5. 更新粒子的位置和速度。根据每个粒子的适应度和全局最优粒子的位置,更新每个粒子的速度和位置。其中,全局最优粒子是历史上适应度最好的粒子。

  6. 重复步骤4和5,直到满足收敛条件。收敛条件可以是达到最大迭代次数、目标函数值小于某一阈值等。

  7. 将全局最优粒子的位置作为SVR模型的最优参数,重新运行模型并进行预测。

通过这种方法,可以找到最优的SVR参数,从而获得更准确的预测结果。


二、示例

本示例共涉及两个py文件,SVR.py和PSO_SVR.py

其中,PSO_SVR.py为粒子群算法调参的过程。

两者的关系为SVR.py调用PSO_SVR.py


1.导入库包、数据以及数据预处理

导入库包

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib as mpl
  4. import matplotlib.pyplot as plt
  5. ## 设置属性防止中文乱码
  6. mpl.rcParams['font.sans-serif'] = [u'SimHei']
  7. mpl.rcParams['axes.unicode_minus'] = False

导入数据、数据预处理

  1. #读取数据
  2. data = pd.read_excel()
  3. data = np.array(data)
  4. #划分特征值与目标值
  5. X =data[:,1:-1]
  6. y =data[:,-1]
  7. #将数据标准化
  8. from sklearn.preprocessing import StandardScaler
  9. # 创建一个标准化器对象
  10. scaler = StandardScaler()
  11. # 使用标准化器拟合和转换数据集
  12. X = scaler.fit_transform(X)
  13. # 将数据集划分为训练集和测试集
  14. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2.利用粒子群算法调优参数gamma和C

为了代码简单好理解,PSO_SVR.py文件,编写粒子群算法相关函数

用主代码文件调用此py文件,最后返回调参完成的SVR模型

  1. import numpy as np
  2. from sklearn.svm import SVR
  3. from matplotlib import pyplot as plt
  4. import pyswarms as ps
  5. np.random.seed(42)
  6. # 适应度函数
  7. def fitness_function(params, X, y, xt, yt):
  8. C, gamma = params
  9. svm_model = SVR(kernel='rbf', gamma=gamma, C=C)
  10. svm_model.fit(X, y)
  11. y_pred = svm_model.predict(xt)
  12. mse = np.mean((yt - y_pred) ** 2)
  13. return mse
  14. # 优化函数
  15. def optimize_svm(X, y, xt, yt, n_particles=100, n_iterations=100):
  16. def _fitness_function(params):
  17. fitness_values = []
  18. for p in params:
  19. fitness = fitness_function(p, X, y, xt, yt)
  20. fitness_values.append(fitness)
  21. return fitness_values
  22. # 参数边界
  23. bounds = (np.array([0.1, 0.01]), np.array([50.0, 10.0]))
  24. options = {'c1': 0.5, 'c2': 0.3, 'w': 0.9}
  25. cost_history = np.zeros(n_iterations)
  26. # 运行优化器进行参数优化
  27. optimizer = ps.single.GlobalBestPSO(n_particles=n_particles, dimensions=2, bounds=bounds, options=options)
  28. best_cost, best_params = optimizer.optimize(_fitness_function, iters=n_iterations)
  29. # 在每次迭代前保存代价值
  30. for i, cost in enumerate(optimizer.cost_history):
  31. cost_history[i] = cost
  32. # 根据优化结果建立最终的SVM模型
  33. C, gamma = best_params
  34. svm_model = SVR(kernel='rbf', gamma=gamma, C=C)
  35. svm_model.fit(X, y)
  36. print('最优参数:', best_params)
  37. # 绘制代价值变化曲线
  38. plt.plot(range(n_iterations), cost_history)
  39. plt.xlabel('Iteration')
  40. plt.ylabel('Cost')
  41. plt.title('Cost Function Evolution')
  42. plt.show()
  43. return svm_model

3.模型训练与预测

  1. #调用PSO_SVR.py文件
  2. import PSO_SVR
  3. #获取返回的调参后的模型
  4. svr = PSO_SVR.optimize_svm(X_train,y_train,X_test,y_test)
  5. #训练
  6. svr.fit(X_train, y_train)
  7. #预测
  8. result = svr.predict(X_test)

4.对模型进行性能评估

  1. #计算模型在测试数据上的得分,通常使用R^2(决定系数)作为评估指标。
  2. score = svr.score(X_test, y_test)
  3. #存储测试数据的真实标签和预测结果
  4. y_testRON = []
  5. resultRON = []
  6. for i in range(len(result)):
  7. y_testRON.append(y_test[i])
  8. resultRON.append(result[i])
  9. # 计算了模型在训练数据上的得分。
  10. score_train = svr.score(X_train, y_train)
  11. result_train = svr.predict(X_train)
  12. #存储训练数据的真实标签和预测结果
  13. y_trainRON = []
  14. resultRON_train = []
  15. for i in range(len(result_train)):
  16. y_trainRON.append(y_train[i])
  17. resultRON_train.append(result_train[i])
  18. ##可视化
  19. fig = plt.figure()
  20. fig.subplots_adjust(hspace=0.4)
  21. plt.subplot(2, 1, 1)
  22. plt.plot(np.arange(len(result_train)), y_trainRON, "bo-", label="True value 冲蚀速率 -train")
  23. plt.plot(np.arange(len(result_train)), resultRON_train, "ro-", label="Predict value 冲蚀速率 -train")
  24. plt.title(f"train_SVM---R^2:{score_train}")
  25. plt.legend(loc="best")
  26. plt.subplot(2, 1, 2)
  27. plt.plot(np.arange(len(result)), y_testRON, "bo-", label="True value 冲蚀速率")
  28. plt.plot(np.arange(len(result)), resultRON, "ro-", label="Predict value 冲蚀速率")
  29. plt.title(f"test_SVM---R^2:{score}")
  30. plt.legend(loc="best")
  31. plt.show()
  32. ##可视化标准误差
  33. # test
  34. RON = np.array(resultRON)
  35. # train
  36. RONtrain = np.array(resultRON_train)
  37. RE_RONtest = abs(y_testRON - RON) / y_testRON
  38. RE_RONtrain = abs(y_trainRON - RONtrain) / y_trainRON
  39. plt.figure()
  40. plt.plot(np.arange(len(RE_RONtrain)), RE_RONtrain, "ro-", label="RE value 冲蚀速率 -train")
  41. plt.plot(np.arange(len(RE_RONtrain), len(RE_RONtrain) + len(RE_RONtest)), RE_RONtest, "bo-",
  42. label="RE value 冲蚀速率 -test")
  43. plt.title('Relative Error')
  44. plt.legend(loc="best")
  45. plt.show()

5.结果展示

 三、代码总结


SVR.py

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib as mpl
  4. import matplotlib.pyplot as plt
  5. ## 设置属性防止中文乱码
  6. mpl.rcParams['font.sans-serif'] = [u'SimHei']
  7. mpl.rcParams['axes.unicode_minus'] = False
  8. #读取数据
  9. data = pd.read_excel()
  10. data = np.array(data)
  11. #划分特征值与目标值
  12. X =data[:,1:-1]
  13. y =data[:,-1]
  14. #将数据标准化
  15. from sklearn.preprocessing import StandardScaler
  16. # 创建一个标准化器对象
  17. scaler = StandardScaler()
  18. # 使用标准化器拟合和转换数据集
  19. X = scaler.fit_transform(X)
  20. # 将数据集划分为训练集和测试集
  21. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  22. #调用PSO_SVR.py文件
  23. import PSO_SVR
  24. #获取返回的调参后的模型
  25. svr = PSO_SVR.optimize_svm(X_train,y_train,X_test,y_test)
  26. #训练
  27. svr.fit(X_train, y_train)
  28. #预测
  29. result = svr.predict(X_test)
  30. #计算模型在测试数据上的得分,通常使用R^2(决定系数)作为评估指标。
  31. score = svr.score(X_test, y_test)
  32. #存储测试数据的真实标签和预测结果
  33. y_testRON = []
  34. resultRON = []
  35. for i in range(len(result)):
  36. y_testRON.append(y_test[i])
  37. resultRON.append(result[i])
  38. # 计算了模型在训练数据上的得分。
  39. score_train = svr.score(X_train, y_train)
  40. result_train = svr.predict(X_train)
  41. #存储训练数据的真实标签和预测结果
  42. y_trainRON = []
  43. resultRON_train = []
  44. for i in range(len(result_train)):
  45. y_trainRON.append(y_train[i])
  46. resultRON_train.append(result_train[i])
  47. ##可视化
  48. fig = plt.figure()
  49. fig.subplots_adjust(hspace=0.4)
  50. plt.subplot(2, 1, 1)
  51. plt.plot(np.arange(len(result_train)), y_trainRON, "bo-", label="True value 冲蚀速率 -train")
  52. plt.plot(np.arange(len(result_train)), resultRON_train, "ro-", label="Predict value 冲蚀速率 -train")
  53. plt.title(f"train_SVM---R^2:{score_train}")
  54. plt.legend(loc="best")
  55. plt.subplot(2, 1, 2)
  56. plt.plot(np.arange(len(result)), y_testRON, "bo-", label="True value 冲蚀速率")
  57. plt.plot(np.arange(len(result)), resultRON, "ro-", label="Predict value 冲蚀速率")
  58. plt.title(f"test_SVM---R^2:{score}")
  59. plt.legend(loc="best")
  60. plt.show()
  61. ##可视化标准误差
  62. # test
  63. RON = np.array(resultRON)
  64. # train
  65. RONtrain = np.array(resultRON_train)
  66. RE_RONtest = abs(y_testRON - RON) / y_testRON
  67. RE_RONtrain = abs(y_trainRON - RONtrain) / y_trainRON
  68. plt.figure()
  69. plt.plot(np.arange(len(RE_RONtrain)), RE_RONtrain, "ro-", label="RE value 冲蚀速率 -train")
  70. plt.plot(np.arange(len(RE_RONtrain), len(RE_RONtrain) + len(RE_RONtest)), RE_RONtest, "bo-",
  71. label="RE value 冲蚀速率 -test")
  72. plt.title('Relative Error')
  73. plt.legend(loc="best")
  74. plt.show()

PSO_SVR.py

  1. import numpy as np
  2. from sklearn.svm import SVR
  3. from matplotlib import pyplot as plt
  4. import pyswarms as ps
  5. np.random.seed(42)
  6. # 适应度函数
  7. def fitness_function(params, X, y, xt, yt):
  8. C, gamma = params
  9. svm_model = SVR(kernel='rbf', gamma=gamma, C=C)
  10. svm_model.fit(X, y)
  11. y_pred = svm_model.predict(xt)
  12. mse = np.mean((yt - y_pred) ** 2)
  13. return mse
  14. # 优化函数
  15. def optimize_svm(X, y, xt, yt, n_particles=100, n_iterations=100):
  16. def _fitness_function(params):
  17. fitness_values = []
  18. for p in params:
  19. fitness = fitness_function(p, X, y, xt, yt)
  20. fitness_values.append(fitness)
  21. return fitness_values
  22. # 参数边界
  23. bounds = (np.array([0.1, 0.01]), np.array([50.0, 10.0]))
  24. options = {'c1': 0.5, 'c2': 0.3, 'w': 0.9}
  25. cost_history = np.zeros(n_iterations)
  26. # 运行优化器进行参数优化
  27. optimizer = ps.single.GlobalBestPSO(n_particles=n_particles, dimensions=2, bounds=bounds, options=options)
  28. best_cost, best_params = optimizer.optimize(_fitness_function, iters=n_iterations)
  29. # 在每次迭代前保存代价值
  30. for i, cost in enumerate(optimizer.cost_history):
  31. cost_history[i] = cost
  32. # 根据优化结果建立最终的SVM模型
  33. C, gamma = best_params
  34. svm_model = SVR(kernel='rbf', gamma=gamma, C=C)
  35. svm_model.fit(X, y)
  36. print('最优参数:', best_params)
  37. # 绘制代价值变化曲线
  38. plt.plot(range(n_iterations), cost_history)
  39. plt.xlabel('Iteration')
  40. plt.ylabel('Cost')
  41. plt.title('Cost Function Evolution')
  42. plt.show()
  43. return svm_model

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/557401
推荐阅读
相关标签
  

闽ICP备14008679号