基于LSTM-Adaboost的电力负荷预测,附MATLAB代码

今天为大家带来一期基于LSTM-Adaboost的电力负荷预测。代码中的LSTM可以替换为任意的机器学习算法。

原理详解

LSTM-AdaBoost负荷预测模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。

LSTM-AdaBoost模型算法流程如下:

基于LSTM-Adaboost的电力负荷预测,附MATLAB代码_第1张图片

基于LSTM-Adaboost的电力负荷预测,附MATLAB代码_第2张图片

通过Adaboost算法便把许多个弱预测器集成为一个强预测器,最后通过强预测器对弱预测器的结果进行加权,得到最终结果。LSTM-Adaboost网络模型流程图如图所示:

基于LSTM-Adaboost的电力负荷预测,附MATLAB代码_第3张图片


内容详解

①对电力负荷数据进行处理

本次数据包含负荷值,温度,湿度,风速,压强,降水量,能见度,水汽压和体感温度,部分数据截图如下:

基于LSTM-Adaboost的电力负荷预测,附MATLAB代码_第4张图片

选取1200个样本作为训练集,每个样本组成为:当天24个小时的全部数据,因此训练集的输入数据大小为1200*216,其中216=24*9,24代表24个小时,9代表9个特征。训练集的输出数据大小为:1200*1。1代表未来一小时的负荷值。

选取200个样本作为测试集,同理,测试集的输入数据大小为200*216,训练集的输出数据大小为:200*1。

②采用LSTM-Adaboost对电力负荷数据进行训练和预测

LSTM的预测结果如下:

基于LSTM-Adaboost的电力负荷预测,附MATLAB代码_第5张图片

可以看到,未优化的LSTM的预测效果不是很理想,MSE指标为64.7033,误差较大!

LSTM-Adaboost模型的预测效果如下:(本次实验选用了10个LSTM弱分类器)

基于LSTM-Adaboost的电力负荷预测,附MATLAB代码_第6张图片

误差对比图如下:

基于LSTM-Adaboost的电力负荷预测,附MATLAB代码_第7张图片

可以看到LSTM-Adaboost预测效果有了明显提升,LSTM-Adaboost的MSE误差为26.6652,相比于之前的64.7033有了很大提升!

部分代码

clear
close all
clc
data =  readmatrix('data.csv');
data = data(:,2:10);
w=1;                  % w是滑动窗口的大小
s=24;                  % 选取前24小时的所有数据去预测未来一小时的数据
m = 1200;            %选取m个样本作训练集
n = 200;             %选取n个样本作测试集
input_train=[];    %选取1月1日-1月10日,1月2日-1月11日,1月3日-1月12日…………3月1日到3月10日的数据作为训练集的输入
for i =1:m
    xx = data(1+w*(i-1):w*(i-1)+s,:);
    xx =xx(:);
    input_train = [input_train,xx];
end
output_train =[];  %选取1月11日,1月12日,1月13日…………3月11日的数据作为训练集的输出
output_train = data(2:m+1,1)';


input_test=[];  %选取3月2日到3月11日的数据作为测试集的输入
for i =m+1:m+n
    xx = data(1+w*(i-1):w*(i-1)+s,:);
    xx =xx(:);
    input_test = [input_test,xx];
end
output_test = data(m+2:m+n+1,1)';


%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%% 获取输入层节点、输出层节点个数
inputnum=size(input_train,1);
outputnum=size(output_train,1);
disp('/')
disp('LSTM神经网络结构...')
disp(['输入层的节点数为:',num2str(inputnum)])
disp(['输出层的节点数为:',num2str(outputnum)])


numFeatures = inputnum;   %特征为一维
numResponses = outputnum;  %输出也是一维
numHiddenUnits1 = 25;   %创建LSTM回归网络,指定LSTM层的隐含单元个数。可调
layers = [ ...
    sequenceInputLayer(numFeatures)    %输入层
    lstmLayer(numHiddenUnits1, 'OutputMode', 'sequence')
    fullyConnectedLayer(numResponses)    %为全连接层,是输出的维数。
    regressionLayer];      %其计算回归问题的半均方误差模块 。即说明这不是在进行分类问题。
 
%指定训练选项,求解器设置为adam, 1000轮训练。
%梯度阈值设置为 1。指定初始学习率 0.01,在 125 轮训练后通过乘以因子 0.2 来降低学习率。
options = trainingOptions('adam', ...
    'MaxEpochs',1000, ...
    'GradientThreshold', 1, ...
    'InitialLearnRate',0.01, ...      
    'LearnRateSchedule','piecewise', ...%每当经过一定数量的时期时,学习率就会乘以一个系数。
    'LearnRateDropFactor', 0.01, ...
    'LearnRateDropPeriod',600, ...      %乘法之间的纪元数由" LearnRateDropPeriod"控制。可调
    'Verbose',0,  ...  %如果将其设置为true,则有关训练进度的信息将被打印到命令窗口中。默认值为true。
    'Plots','training-progress');    %构建曲线图 将'training-progress'替换为none
net0 = trainNetwork(inputn,outputn,layers,options); 
an0 = predict(net0,inputn_test);  
%预测结果反归一化与误差计算
test_simu0=mapminmax('reverse',an0,outputps); %把仿真得到的数据还原为原始的数量级
%误差指标
error0 = output_test - test_simu0;
mse0=mse(output_test,test_simu0)
%% 标准LSTM神经网络作图
figure
plot(output_test,'b-','markerfacecolor',[0.5,0.5,0.9],'MarkerSize',6)
hold on
plot(test_simu0,'r--','MarkerSize',6)
title(['mse误差:',num2str(mse0)])
legend('真实y','预测的y')
xlabel('样本数')
ylabel('负荷值')

代码获取

完整代码获取,后台回复关键词:

LSTM

你可能感兴趣的:(lstm,matlab,机器学习,人工智能,rnn)