资源下载:https://download.csdn.net/download/vvoennvv/92410130

 目录

一,概述

        传统的LSTM神经网络在时序预测任务中存在一些问题,比如超参数选择困难、容易陷入局部最优解、训练效率不高等。为了解决这些问题,我们引入了蜣螂优化算法(DBO)作为优化方法,将其与LSTM-Attention神经网络相结合,提出了DBO-LSTM-Attention算法。

        首先,我们来了解一下蜣螂优化算法。蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种模拟蜣螂群体觅食行为的新型元启发式优化算法,它通过模拟蜣螂的滚球、产卵、幼虫觅食和偷窃等行为来寻找最优解。在DBO-LSTM-Attention算法中,我们将蜣螂算法应用于LSTM-Attention神经网络的超参数优化过程中,以提高其预测性能和泛化能力。

DBO-LSTM-Attention算法的流程如下:

(1)数据准备:首先,我们需要准备历史数据作为训练集。

(2)数据预处理:对于训练集中的数据,我们需要进行一些预处理操作,比如去除异常值、归一化等,以提高预测模型的准确性。

(3)网络构建:根据预处理后的训练集,我们构建DBO-LSTM-Attention网络模型。该模型包括输入层、LSTM层、注意力机制层和输出层。

(4)蜣螂算法优化:在LSTM-Attention神经网络的训练过程中,我们引入蜣螂优化算法来优化关键超参数的搜索,主要包括学习率、LSTM神经元个数和批次大小(batch_size)。通过模拟蜣螂的四种行为模式:

1,滚球蜣螂行为:负责全局探索,寻找潜在的优质解空间
2,产卵蜣螂行为:在当前最优解附近进行局部开发
3,小蜣螂行为:基于全局最优解进行精细化搜索
4,偷窃蜣螂行为:增强种群多样性,避免早熟收敛
        通过这四种行为的协同作用,我们可以在超参数搜索空间中找到最优组合,从而提高预测模型的准确性和训练效率。优化目标是最小化综合适应度函数,该函数综合考虑了MSE、MAE和MAPE三个评价指标。

(5)模型评估:在训练完成后,我们需要对模型进行评估。这可以通过将训练集中的一部分数据作为测试集,来计算模型的预测误差和准确率。

二,代码

代码中文注释非常清晰,按照示例数据修改格式,替换数据集即可运行,数据集可以是csv或者excel表格。

部分代码如下:

if __name__ == "__main__":
    warnings.filterwarnings("ignore")  # 取消警告
    # 使用pandas模块的read_csv函数读取名为"电力负荷预测数据.csv"的文件。
    # 参数 'encoding' 设置为 'gb2312',这通常用于读取中文字符,确保文件中的中文字符能够正确读取。
    # 读取的数据被存储在名为 'dataset' 的DataFrame变量中。
    dataset = pd.read_csv("电力负荷预测数据.csv", encoding='gb2312')
    # 下面是读取xlsx的方式,根据实际数据集文件选择是read_csv还是read_excel
    # dataset = pd.read_excel("数据集.xlsx", sheet_name='Sheet1', header=0)
    print(dataset)  # 显示dataset数据

    # 从dataset DataFrame中提取数据。
    # dataset.values将DataFrame转换为numpy数组。
    # [:,1:],逗号前是行,逗号之后是列。这个表示选择所有行(:)和从第二列到最后一列(1:)的数据。
    # 这样做通常是为了去除第一列,这在第一列是索引或不需要的数据时很常见。
    # 只取第2列数据,要写成1:2;只取第3列数据,要写成2:3,取第2列之后(包含第二列)的所有数据,写成 1:
    # 单输入单步预测,就让values等于某一列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
    # 单输入多步预测,就让values等于某一列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
    # 多输入单步预测,就让values等于多列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
    # 多输入多步预测,就让values等于多列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
    values = dataset.values[:, 1:]
    # 如果第一列不是索引,需保留全部列的数据时,则使用下面这句代码,并把上面那句代码屏蔽
    # values = dataset.values[:, :]

    # 确保所有数据是浮点数
    # 将values数组中的数据类型转换为float32。
    # 这通常用于确保数据类型的一致性,特别是在准备输入到神经网络模型中时。
    values = values.astype('float32')

    # 下面是多特征输入,多步预测的案例
    n_in = 5  # 输入前5行的数据
    n_out = 1  # 预测未来2步的数据
    or_dim = values.shape[1]  # 记录特征数据维度
    # 默认是全部数据用于本次网络的训练与测试,也可以设定具体是数值,比如2000,这个数值不能超过实际的数据点
    num_samples = values.shape[0] - n_in - n_out
    # num_samples = 2000
    scroll_window = 1  # 如果等于1,下一个数据从第二行开始取。如果等于2,下一个数据从第三行开始取
    res = data_collation(values, n_in, n_out, or_dim, scroll_window, num_samples)

    # 把数据集分为训练集和测试集
    # 将前面处理好的DataFrame(data)转换成numpy数组,方便后续的数据操作。
    values = np.array(res)

    # 计算训练集的大小。
    # 设置80%作为训练集
    # int(...) 确保得到的训练集大小是一个整数。
    n_train_number = int(num_samples * 0.8)

    # 先划分数据集,在进行归一化,这才是正确的做法!
    Xtrain = values[:n_train_number, :n_in * or_dim]
    Ytrain = values[:n_train_number, n_in * or_dim:]
    Xtest = values[n_train_number:, :n_in * or_dim]
    Ytest = values[n_train_number:, n_in * or_dim:]

    # 对训练集和测试集进行归一化
    m_in = MinMaxScaler()
    vp_train = m_in.fit_transform(Xtrain)  # 注意fit_transform() 和 transform()的区别
    vp_test = m_in.transform(Xtest)  # 注意fit_transform() 和 transform()的区别
    m_out = MinMaxScaler()
    vt_train = m_out.fit_transform(Ytrain)  # 注意fit_transform() 和 transform()的区别
    vt_test = m_out.transform(Ytest)  # 注意fit_transform() 和 transform()的区别

    # 将训练集的输入数据vp_train重塑成三维格式。
    # 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
    vp_train = vp_train.reshape((vp_train.shape[0], n_in, or_dim))

    # 将测试集的输入数据vp_test重塑成三维格式。
    # 结果是一个三维数组,其形状为[样本数量, 时间步长, 特征数量]。
    vp_test = vp_test.reshape((vp_test.shape[0], n_in, or_dim))

    # 调用lstm_attention_model函数来建立LSTM-Attention模型
    model = lstm_attention_model()

    # 训练模型。指定批处理大小为32,训练轮数为50,将25%的数据用作验证集。
    # verbose=2表示在训练过程中会输出详细信息。
    history = model.fit(vp_train, vt_train, batch_size=32, epochs=50, validation_split=0.25, verbose=2)

    # 绘制历史数据
    # 绘制训练过程中的损失曲线。
    # history.history['loss']获取训练集上每个epoch的损失值。
    # 'label='train''设置该曲线的标签为 'train'。
    plt.plot(history.history['loss'], label='Train')
    # 绘制验证过程中的损失曲线。
    # history.history['val_loss']获取验证集上每个epoch的损失值。
    # 'label='Validation''设置该曲线的标签为 'Validation'。
    plt.plot(history.history['val_loss'], label='Validation')
    # Y坐标为Loss
    plt.ylabel('Loss')
    # X坐标为Epoch
    plt.xlabel('Epoch')
    # 显示图例,方便识别每条曲线代表的数据集。
    plt.legend()
    # 图片标题
    plt.title(f"Model Loss")
    # 展示绘制的图像。
    plt.show()

    # 作出预测
    # 使用模型对测试集的输入特征(vp_test)进行预测。
    # yhat是模型预测的输出值。
    yhat = model.predict(vp_test)
    # 将预测值yhat重塑为二维数组,以便进行后续操作。
    # yhat = yhat.reshape(num_samples - n_train_number, n_out)
    # 反归一化
    predicted_data = m_out.inverse_transform(yhat)

    # 调用evaluate_forecasts函数。
    # 传递实际值(inv_y)、预测值(inv_yhat)以及预测的步数(n_out)作为参数。
    # 此函数将计算每个预测步长的RMSE、MAE、MAPE和R2值。
    mse_dic, rmse_dic, mae_dic, mape_dic, r2_dic, table = evaluate_forecasts(Ytest, predicted_data, n_out)

    # 显示预测指标数值
    print(table)

    # 开始优化参数
    # 调用DBO函数进行优化。传入训练和测试数据集,返回最优参数、每次迭代的适应度跟踪和每次迭代的最优结果。
    best, trace, result = DBO(vp_train, vt_train, vp_test, vt_test)
    
    # 将优化结果保存到MAT文件中。'trace'记录每次迭代的适应度值,'best'是最优参数,'result'是每次迭代的最优结果。
    savemat('dbo_LSTM_Attention_para.mat', {'trace': trace, 'best': best, 'result': result})
    
    # 打印最优学习率、LSTM层神经元的数量和batch_size。对于非学习率参数,将其转换为整数。
    print("DBO-LSTM-Attention最优参数 [学习率, 神经元数, batch_size]:", [int(best[i]) if i > 0 else best[i] for i in range(len(best))])
    

。。。。。。

三,运行结果

 资源下载:https://download.csdn.net/download/vvoennvv/92410130

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐