在 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 的。
请注意,性能因初始值和迭代次数而异。
我在将训练集输入神经网络之前使用 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 的那个。
请注意,性能因初始值和迭代次数而异。