今天为大家带来一期基于LSTM-Adaboost的电力负荷预测。代码中的LSTM可以替换为任意的机器学习算法。
原理详解
LSTM-AdaBoost负荷预测模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。
LSTM-AdaBoost模型算法流程如下:
通过Adaboost算法便把许多个弱预测器集成为一个强预测器,最后通过强预测器对弱预测器的结果进行加权,得到最终结果。LSTM-Adaboost网络模型流程图如图所示:
内容详解
①对电力负荷数据进行处理
本次数据包含负荷值,温度,湿度,风速,压强,降水量,能见度,水汽压和体感温度,部分数据截图如下:
选取1200个样本作为训练集,每个样本组成为:当天24个小时的全部数据,因此训练集的输入数据大小为1200*216,其中216=24*9,24代表24个小时,9代表9个特征。训练集的输出数据大小为:1200*1。1代表未来一小时的负荷值。
选取200个样本作为测试集,同理,测试集的输入数据大小为200*216,训练集的输出数据大小为:200*1。
②采用LSTM-Adaboost对电力负荷数据进行训练和预测
LSTM的预测结果如下:
可以看到,未优化的LSTM的预测效果不是很理想,MSE指标为64.7033,误差较大!
LSTM-Adaboost模型的预测效果如下:(本次实验选用了10个LSTM弱分类器)
误差对比图如下:
可以看到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