Matlab中神经网络PCA预处理后的预测误差较大

时间:2015-04-17 16:40:01

标签: matlab neural-network pca

我在将训练集输入神经网络之前使用PCA。它将13个功能减少到8个,并训练超过2200个训练集。我得到的MAPE接近2.5 - 2.6%。 如果我用简单的feedforwardnet训练原始数据,我得到的误差为2.1%。

我在不同的问题中遇到类似的情况,我有近50000个训练集,其中PCA给出2.5%的误差,简单的ANN给我~2%的MAPE。 这背后的原因是什么?这是正常现象吗?你能告诉我任何可以减少错误的方法吗?我试图根据天气和以前的负荷数据预测电力负荷需求。

编辑:(添加Scree Plot) enter image description here

1 个答案:

答案 0 :(得分:2)

几个月之前我遇到的问题和你支持SVM而不是NN一样。因此,您获得如此糟糕的结果的原因是因为您在将数据输入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 );

这是Scree情节。您可以保留数据的前5个组成部分。

enter image description here

执行minmax映射后,您可以按如下方式将其提供给NN。这假设您要保留PC 1-5。

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

现在,如果您需要将您的noramlized数据转换回

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的一个。 NN1 这是没有PCA的人。 NN2

请注意,由于初始值和迭代次数,性能不同。