在使用PCA预处理后用神经网络在Matlab较高的预测误差

问题描述 投票:2回答:1

我使用PCA喂养训练集到神经网络前。它减少了13个功能下降到8和火车超过2200套的培训。我这得到梅普接近2.5 - 2.6%。如果我训练用简单的feedforwardnet的原始数据,我得到的2.1%更低的误差。

我从一个类似的情况在不同的问题的痛苦,在那里我有接近50000点训练集合,其中PCA给出2.5%的误差,简单的人工神经网络给了我〜2%MAPE。这背后有什么原因?这是一个正常现象?你能不能给我任何方式,我可以减少误差?我试图预测天气和先前的负载数据的基础上,电力负荷需求。

编辑:(加碎石图)

matlab neural-network pca
1个回答
2
投票

我有同样的问题,因为你回来几个月前但支持向量机,而不是神经网络。那么,为什么你要这样的效果差的原因是因为你还没有喂养它到PCA功能之前标准化您的数据。您可以使用Matlab的mapminmax function做到这一点。由于mapminmax noramlizes行,你需要做的输入的转置和输出如下。

[normX,PS] = mapminmax( X' );
normX = normX';
max( normX )   % Returns 1
min( normX )   % Returns -1

要绘制的碎石图,您可以使用此代码。

[C,~,~,~,explained] = pca( normX );
figure; plot( explained );

这是碎石图。你也许可以让您的数据的前5个组件。

执行完最小最大映射,您可以按如下喂到你的神经网络。这是假设你想保持PC 1-5。

trainX = normX * C(:,1:5);

现在,如果你需要改变你的标准化数据回

returnedX = mapminmax( 'reverse', normX', PS );
returned = returnedX';

总的来说你的代码应该如下

% Normalize Data
[normX,PS] = mapminmax( X' );
normX = normX';
max( normX )   % Returns 1
min( normX )   % Returns -1

% Perform PCA
[C,~,~,~,explained] = pca( normX );
figure; plot( explained );

% Transform Data
trainX = normX * C(:,1:5);

编辑:性能我用来测试性能的代码如下。

clear all
load input
load output

% Normalize Data
[normX,PS] = mapminmax( X' );
normX = normX';
max( normX )   % Returns 1
min( normX )   % Returns -1

% Perform PCA
[C,~,~,~,explained] = pca( normX );
figure; plot( explained );

% Transform Data
trainX1 = normX(1:1826,:) * C(:,1:5);
trainX2 = X(1:1826,:);
trainY = dailyPeakLoad(1:1826);
testX1 = normX(1827:end,:) * C(:,1:5);
testX2 = X(1827:end,:);
testY = dailyPeakLoad(1827:end);

netFeb = newfit(trainX1', trainY', 35);
netFeb.performFcn = 'mae';
netFeb = trainlm(netFeb, trainX1', trainY');
forecastLoadFeb = sim(netFeb, testX1')';
errFeb = testY - forecastLoadFeb;
errpct = abs(errFeb)./testY*100;
MAPEFeb = mean(errpct(~isinf(errpct)));

netFeb2 = newfit(trainX2', trainY', 35);
netFeb2.performFcn = 'mae';
netFeb2 = trainlm(netFeb2, trainX2', trainY');
forecastLoadFeb2 = sim(netFeb2, testX2')';
errFeb2 = testY - forecastLoadFeb2;
errpct2 = abs(errFeb2)./testY*100;
MAPEFeb2 = mean(errpct(~isinf(errpct2)));

训练有素的NN在这里。这是一个与PCA。这是一个没有PCA的一个。

需要注意的是性能,因为初始值和迭代次数的不同。

© www.soinside.com 2019 - 2024. All rights reserved.