为SVM准备数据,对PCA降维前后的数据进行归一化是否有效

数据挖掘 机器学习 支持向量机 降维 libsvm
2022-02-18 16:18:34

对数据集进行归一化,使用 PCA 降维,然后对降维数据进行归一化是否有效。假设这是在训练数据上执行的,是否应该使用相同的 PCA 系数来减少测试数据的维度。测试和训练数据是否应该使用相同的最大和最小归一化值。我已经包含了我正在使用的代码的简化示例,它可以描述我说得更好。提前致谢。

%% Prepare Training Data


% Normalise training data
mindata=min(TRAINDATA); maxdata=max(TRAINDATA);
TRAINDATA = ((TRAINDATA-repmat(mindata,[size(TRAINDATA,1),1]))./(repmat(maxdata,[size(TRAINDATA,1),1])-repmat(mindata,[size(TRAINDATA,1),1])) - 0.5 ) *2;

% Perform PCA
mTRAINDATA = mean(mean(TRAINDATA));
TRAINDATA = TRAINDATA - mTRAINDATA;
[Cpca,~,~,~,~]=princomp(TRAINDATA,'econ');
EigenRange = 1:2;
Cpca = Cpca(:,EigenRange);
TRAINDATA = TRAINDATA*Cpca;
TRAINDATA = TRAINDATA + mTRAINDATA;

% Normalise training data second time
mindata2=min(TRAINDATA); maxdata2=max(TRAINDATA);
TRAINDATA = ((TRAINDATA-repmat(mindata2,[size(TRAINDATA,1),1]))./(repmat(maxdata2,[size(TRAINDATA,1),1])-repmat(mindata2,[size(TRAINDATA,1),1])) - 0.5 ) *2;



%% Prepare Test Data

% Normalise using first normalisation values from training data
TESTDATA = ((TESTDATA-repmat(mindata,[size(TESTDATA,1),1]))./(repmat(maxdata,[size(TESTDATA,1),1])-repmat(mindata,[size(TESTDATA,1),1])) - 0.5 ) *2;

% Perform PCA
mTESTDATA = mean(mean(TESTDATA));
TESTDATA = TESTDATA - mTESTDATA;
TESTDATA = TESTDATA*Cpca;
TESTDATA = TESTDATA + mTRAINDATA;

% Normalise using second normalisation values from training data
TESTDATA = ((TESTDATA-repmat(mindata2,[size(TESTDATA,1),1]))./(repmat(maxdata2,[size(TESTDATA,1),1])-repmat(mindata2,[size(TESTDATA,1),1])) - 0.5 ) *2;
2个回答

根据您选择的语言,您可能需要也可能不需要自己规范化数据 - 例如,其中的e1071R会自动为您执行此操作。由于这是基于“libsvm”库构建的,因此可能也是这种情况 - 库文档是您最好的来源。至于归一化值,您绝对应该将训练集中的相同 [min,max] 值用于测试集。另外,我建议先减少数据的维度,而不是在运行 svm 之前进行规范化。hth

就 PCA 组件而言,您应该为测试数据使用相同数量的 PCA。这背后的逻辑是,训练数据发生的测试数据应该发生相同的转换。我在这里假设您的训练和测试数据是独立绘制的。

事实上,在应用 PCA 之前标准化数据很重要。它背后有一门科学,它计算变量的重要性,如果你不进行标准化,它会给数值高的值赋予高权重,因此在 PCA 之前进行标准化很重要。如果你想在它之上应用 SVM,规范化就可以了。

基本原则是任何过程的比例都应该保持不变,因此在标准化后,您应该使用相同的最大和最小比例。