在进行回归或分类时,预处理数据的正确(或更好)方法是什么?
- 规范化数据 -> PCA -> 训练
- PCA -> 标准化 PCA 输出 -> 训练
- 规范化数据 -> PCA -> 规范化 PCA 输出 -> 训练
以上哪个更正确,或者是预处理数据的“标准化”方式?“标准化”是指标准化、线性缩放或其他一些技术。
在进行回归或分类时,预处理数据的正确(或更好)方法是什么?
以上哪个更正确,或者是预处理数据的“标准化”方式?“标准化”是指标准化、线性缩放或其他一些技术。
您应该在进行 PCA 之前对数据进行规范化。例如,考虑以下情况。我创建了一个X
具有已知相关矩阵的数据集C
:
>> C = [1 0.5; 0.5 1];
>> A = chol(rho);
>> X = randn(100,2) * A;
如果我现在执行 PCA,我会正确地发现主成分(权重向量的行)与坐标轴成一定角度:
>> wts=pca(X)
wts =
0.6659 0.7461
-0.7461 0.6659
如果我现在将数据集的第一个特征缩放 100,直觉上我们认为主成分不应该改变:
>> Y = X;
>> Y(:,1) = 100 * Y(:,1);
但是,我们现在发现主成分与坐标轴对齐:
>> wts=pca(Y)
wts =
1.0000 0.0056
-0.0056 1.0000
要解决此问题,有两种选择。首先,我可以重新调整数据:
>> Ynorm = bsxfun(@rdivide,Y,std(Y))
(奇怪的bsxfun
符号用于在 Matlab 中进行向量矩阵算术 - 我所做的只是减去平均值并除以每个特征的标准差)。
我们现在从 PCA 中得到了合理的结果:
>> wts = pca(Ynorm)
wts =
-0.7125 -0.7016
0.7016 -0.7125
它们与原始数据上的 PCA 略有不同,因为我们现在已经保证我们的特征具有单位标准偏差,而最初情况并非如此。
另一种选择是使用数据的相关矩阵而不是外积来执行 PCA:
>> wts = pca(Y,'corr')
wts =
0.7071 0.7071
-0.7071 0.7071
事实上,这完全等同于通过减去均值然后除以标准差来标准化数据。只是更方便。在我看来,您应该始终这样做,除非您有充分的理由不这样做(例如,如果您想了解每个功能变化的差异)。
您需要首先对数据进行标准化。否则,用于减少维度的 PCA 或其他技术将给出不同的结果。
首先规范化数据。实际上,一些用于执行 PCA 分析的 R 包会在执行 PCA 之前自动标准化数据。如果变量具有不同的单位或描述不同的特征,则必须进行标准化。
答案是第三个选项,因为在执行 pca 之后,我们必须标准化 pca 输出,因为整个数据将具有完全不同的标准。我们必须在 PCA 之前和之后对数据集进行标准化,因为它会更准确。
我在 PCA 目标函数中得到了另一个原因。您是否可以在此链接中看到详细信息,请在 此处输入链接描述 假设 X 矩阵在 PCA 之前已被归一化。