215个优化算法优化30余个机器学习预测模型,一键更改多/单输入,多/单步预测,Python预测全家桶

上期对Python预测全家桶做了一个整合, 彻底解决小白替换数据困难,模型切换繁琐,网络参数修改复杂的问题。

本期对python预测全家桶再次更新:采用mealpy库(包含215个优化算法)对30余个机器学习模型参数进行优化。

30个机器学习模型包含如下:

CNN_BiLSTM、CNN_BiLSTM_Attention、BiGRU、BiGRU_Attention、
BiLSTM、BiLSTM_Attention、BiTCN_BiGRU、BiTCN_GRU、BiTCN_LSTM、BP
、CNN_BiGRU_Attention、CNN_BiGRU、CNN_GRU_Attention、CNN_GRU、
CNN_LSTM_Attention、CNN_LSTM、GRU、GRU_Attention、LSTM、
LSTM_Attention、TCN、TCN_RNN、TCN_LSTM、TCN_GRU、TCN_BiGRU、
XGBOOST、Transformer、BiLSTM_KAN、GRU_KAN、LSTM_KAN、Transformer_KAN

什么?!一下子对30余个模型进行优化?怎么可能,怎么做到的!

大家可能会经常看到很多博主,各种不同优化算法与不同模型随便组合一下,就是一篇推文,像我这里,一下子综合这么多模型的,毫不客气的说:全网独一份!

本期代码在上一期的基础上,采用mealpy库直接完成对30多个模型库的调用,并将可调的每个模型参数单独写成了函数,上下限范围的设置也包装成了函数,这样直接在主函数即可调用啦!目的就是方便小白也能轻松掌握优化算法优化机器学习模型。

经常写代码的小伙伴肯定会明白此次代码改写的工作量。也能看到,我这里的全家桶是真的一直一直在用心更新的!

接下来先给大家看一下代码主函数,如果你是小白刚接触的,只要读懂以下代码,即可完成优化算法对机器学习模型的调用。

dataset = pd.read_excel("风电场功率预测.xlsx")
# 读取数据
## 开始实验!!只改下面三行即可切换案例!!
## 不会切换案例的看上一期文章
n_in = 8  # 输入前8个时刻的数据
n_out = 1 # 预测未来一个时刻的负荷
valuess = dataset.values[:, -1:]  # 只取第2列数据,要写成1:2;只取第3列数据,要写成2:3,取第2列之后(包含第二列)的所有数据,写成 1:,这时候就是多特征输入
# 确保所有数据是浮动的
valuess = valuess.astype('float32')
# 将values数组中的数据类型转换为float32。
# 这通常用于确保数据类型的一致性,特别是在准备输入到神经网络模型中时。
or_dim = valuess.shape[1]  # 记录特征数据维度
scroll_window = 1  # 如果等于1,下一个数据从第二行开始取。如果等于2,下一个数据从第三行开始取
num_samples = 2000  # 可以设定从数据中取出多少个点用于本次网络的训练与测试。
# 注意这里num_samples并不是数据的行数,因为数据在整理的时候,需要多步预测1步,或者预测多步,那么最后一个样本将会占据多行,因此一般要设置少于数据的行数
train_ratio = 0.8  # 训练集比例
# 调用数据整理的函数,关于测函数的机理是什么,请跳转Shared_def函数中查看data_collation的注释
vp_train, vp_test, vt_train, vt_test, m_out, Ytest = data_collation(valuess, n_in, n_out, or_dim, scroll_window,
                                                                    num_samples, train_ratio)


''' 调用优化算法 '''
# 修改这里的flag即可切换模型
'''
可选flag有:
CNN_BiLSTM、CNN_BiLSTM_Attention、BiGRU、BiGRU_Attention、BiLSTM、BiLSTM_Attention、BiTCN_BiGRU、BiTCN_GRU、BiTCN_LSTM、BP、
CNN_BiGRU_Attention、CNN_BiGRU、CNN_GRU_Attention、CNN_GRU、CNN_LSTM_Attention、CNN_LSTM、GRU、GRU_Attention、LSTM、
LSTM_Attention、TCN、TCN_RNN、TCN_LSTM、TCN_GRU、TCN_BiGRU、XGBOOST、Transformer、BiLSTM_KAN、GRU_KAN、LSTM_KAN、Transformer_KAN、
'''
flag = 'Transformer'
epoch = 8 # 最大迭代次数
pop_size = 5 # 种群数量
##需要替换算法的小伙伴,直接按  Ctrl+R查找替换,将本代码的  GWO 全部替换为别的,比如 PSO,WOA算法等
optimized_model = GWO.OriginalGWO(epoch=epoch, pop_size=pop_size)


# 提取算法名字
optimized_name = optimized_model.name[8:]


def Objfun(x):
    plotloss_, savemodel_, saveexcel_ = False,False,False
    MSe_error, test_pred = fun(x,flag, optimized_name,plotloss_, savemodel_, saveexcel_,vp_train, vp_test, vt_train, vt_test, m_out, n_out, n_in, or_dim,Ytest)
    return MSe_error


lb_,ub_ = LBUB(flag)
problem_dict = {
        "obj_func": Objfun,
        "bounds": FloatVar(lb=lb_, ub=ub_),
        # 分别对应学习率,神经元,CNN核大小,迭代次数,注意CNN核大小设置的时候不能超过每个vp_train的行数!也就是不能超过n_in
        "minmax": "min",
    }


''' Objfun->目标函数, lb->下限, ub->上限 '''




'''求解'''
bestsolution = optimized_model.solve(problem_dict)
# 保存优化结果
savemat('优化后预测结果保存/'+optimized_name+'_optimized_paras.mat', {'trace': optimized_model.history.list_global_best_fit , 'bestx': bestsolution.solution, 'result': bestsolution.target})
# 将优化结果保存到MAT文件中。'trace'记录每次迭代的适应度值,'best'是最优参数,'result'是每次迭代的最优结果。




plt.ion()
plt.figure(figsize=(3, 1.5), dpi=250)
# plt.semilogy(Curve,'r-',linewidth=2)
x=np.arange(0,epoch)+1
x[0]=1
my_x_ticks = np.arange(1, epoch+1, 1)
plt.xticks(my_x_ticks)
plt.plot(x,optimized_model.history.list_global_best_fit ,'r-' ,linewidth=1,label = 'PSO',marker = "x",markersize=3)
plt.xlabel('Iterations', fontsize=5)
# 设置x轴标签为“迭代次数”。
plt.ylabel('fitness', fontsize=5)
# 设置y轴标签为“适应度值”。
plt.title("Iterative curve of optimization algorithm")
plt.savefig('优化后预测结果保存/'+optimized_name+'_'+flag+'优化算法收敛曲线.png')
plt.ioff()  # 关闭交互模式
plt.show()# 显示绘制的图形。




if flag == 'XGBOOST':
    print("请自行取整,最佳参数分别为:", [bestsolution.solution[i] if i > 0 else bestsolution.solution[i] for i in range(3,len(bestsolution.solution))])
else:
    print("请自行取整,最佳参数分别为:", [bestsolution.solution[i] if i > 0 else bestsolution.solution[i] for i in
                                         range(len(bestsolution.solution))])


'''
# ………………………………………………………………利用优化的参数建模……………………………………………………………………………………
'''
tf.random.set_seed(0)# 设置TensorFlow的随机种子,以确保实验的可重复性。
np.random.seed(0)# 设置numpy的随机种子。
best_pop=loadmat('优化后预测结果保存/'+optimized_name+'_optimized_paras.mat')['bestx'].reshape(-1,)


plotloss_, savemodel_, saveexcel_ = True,True,True  #将最佳参数带入,并保存优化后的模型
MApe_error,Optimized_test_pred = fun(best_pop,flag,optimized_name,plotloss_, savemodel_, saveexcel_,vp_train, vp_test, vt_train, vt_test, m_out, n_out, n_in, or_dim,Ytest)


print('优化后的预测结果指标:')


#调用已经写好绘图函数
FLAG = optimized_name+'_'+flag
plot_result(valuess,Optimized_test_pred, Ytest, n_in,n_out,FLAG)

看一下上述主函数的代码,是不是非常的简单易懂,清晰明了。

想修改模型的,直接更改参数flag,想改智能优化算法的直接替换一下原代码的GWO。这样你就可以得到任意你想要的组合啦!

除了修改模型方便这个优点外,本期还增加了以下功能:

  1. 自动保存优化后的预测模型,方便之后直接加载模型进行预测。

    c1ff2809c5afc36998f9ea5b4cff95c5.png

  2. 自动保存各个算法优化不同模型后的预测结果为excel格式,并以算法名字和模型名字来命名,这样大家就好区分,更好做对比了,如下:

    cc0702b9dbd14a761f28d4e84e764452.png

  3. 自动保存优化后的预测结果图,损失函数曲线,优化算法收敛曲线。

    2eeca6a039634b5141829b8fd9acab40.png

    e78ede0b936b819ce0e9ded6a08a03a8.png

  4. 代码目录更是一目了然,小白也是一看就懂:

2b01b26f1b68f0c261285642764d3460.png

接下来让我们简单挑选几个模型进行结果展示吧!

案例1:

采用灰狼算法优化BiTCN_LSTM的超参数(

# 依次为:训练次数,beach_size,学习率,TCN滤波器个数,滤波器核大小,正则化参数,
LSTM隐含层单元个数)
上下限设置如下:
lb = [20, 8, 1e-4, 32, 2, 0.1, 30]
# 依次为:训练次数,beach_size,学习率,TCN滤波器个数,滤波器核大小,正则化参数,LSTM隐含层单元个数
ub = [50, 32, 1e-3, 128, 6, 0.3, 200]
结果:

4a0317826f82d482c50dc23707c7e238.png

1dcc4b050a286baf8d167cddfe21fe29.png

b189bac27a8f98f8e3e4ba7ce8bc77bf.png

案例2:

采用麻雀算法优化BiLSTM_KAN的超参数(

# 依次为:训练次数,beach_size,学习率,LSTM隐含层单元个数,层数)
上下限设置如下:
lb = [20, 8, 1e-4, 30, 2]
 # 依次为:训练次数,beach_size,学习率,隐含层单元个数,层数
 ub = [50, 32, 1e-3, 100, 6]
结果:

2794a1f363abbc1e2d8c5ef48a8d488f.png

8b53811136c374c2460a488eac924fde.png

案例3:

采用鲸鱼算法优化BiLGRU_Attention的超参数(

# 依次为:训练次数,beach_size,学习率,正则化参数,GRU隐含层单元个数)
上下限设置如下:
lb = [20, 8, 1e-4, 0.1, 30]
  # 依次为:训练次数,beach_size,学习率,正则化参数,GRU隐含层单元个数
   ub = [50, 32, 1e-3, 0.3, 200]
结果:

85b64c72e7cefa6719fd8bcee11b020f.png

c6ad0c628b385de9812347806675c603.png

cd1794c77e6a512e59a5a6ad87a1e030.png

代码获取

已将本文代码更新至python预测全家桶。

后续会继续更新一些其他模型……敬请期待!

点击下方卡片关注,获取更多代码



python预测全家桶pip包推荐版如下:

numpy~=1.26.4
matplotlib~=3.8.4
scipy~=1.13.0
xgboost~=2.1.1
torch~=2.3.1
joblib~=1.4.2
keras~=2.15.0
tensorflow~=2.15.0
scikit-learn~=1.4.2
prettytable~=3.10.0
pandas~=2.2.2
mealpy~=3.0.1

推荐使用3.9版本的python哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淘个代码_

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值