在 Matlab 中使用 PCA 和神经网络进行预处理后预测误差较高

Higher Prediction Error in after Preprocessing using PCA with Neural Networks in Matlab

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

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

编辑:(添加了碎石图)

几个月前我遇到了和你一样的问题,但使用的是支持向量机而不是神经网络。所以你得到如此糟糕结果的原因是因为你没有在将数据输入 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 个组成部分。

执行最小最大映射后,您可以按如下方式将其输入神经网络。这假设您要保留 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)));

训练好的神经网络来了。这是带有 PCA 的那个。 这是没有 PCA 的。

请注意,性能因初始值和迭代次数而异。