上期对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。这样你就可以得到任意你想要的组合啦!
除了修改模型方便这个优点外,本期还增加了以下功能:
-
自动保存优化后的预测模型,方便之后直接加载模型进行预测。

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

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


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

接下来让我们简单挑选几个模型进行结果展示吧!
案例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]
结果:



案例2:
采用麻雀算法优化BiLSTM_KAN的超参数(
# 依次为:训练次数,beach_size,学习率,LSTM隐含层单元个数,层数)
上下限设置如下:
lb = [20, 8, 1e-4, 30, 2]
# 依次为:训练次数,beach_size,学习率,隐含层单元个数,层数
ub = [50, 32, 1e-3, 100, 6]
结果:


案例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]
结果:



代码获取
已将本文代码更新至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哦!

被折叠的 条评论
为什么被折叠?



