如何比较 PCA 和 NMF 的预测能力

Posted

技术标签:

【中文标题】如何比较 PCA 和 NMF 的预测能力【英文标题】:How to compare predictive power of PCA and NMF 【发布时间】:2018-06-17 08:05:22 【问题描述】:

我想将算法的输出与不同的预处理数据进行比较:NMF 和 PCA。 为了以某种方式获得可比较的结果,而不是为每个 PCA 和 NMF 选择相同数量的组件,我想选择可以解释例如 95% 的保留方差的数量。

我想知道是否可以识别 NMF 的每个组件中保留的方差。

例如,使用 PCA 可以通过以下方式给出: retainedVariance(i) = eigenvalue(i) / sum(eigenvalue)

有什么想法吗?

【问题讨论】:

我也有同样的问题。 PCA和NMF之间有什么关系吗? 只看一个指标可能还不够。如果在降维算法的输出中发现的关系没有任何意义怎么办?即使它覆盖了 95%。如果您有异常值、噪音并且不使用稳健的方法,则可能会发生这种情况。 我的主要问题是,在使用 NMF 算法时,如何选择组件的数量以保持较大的方差?在 NMF 中,没有特征值或奇异值,只有 X = W*H 【参考方案1】:

TL;DR

您应该循环遍历不同的n_components,并在每次迭代时估计解码后的X 中的explained_variance_score。这将显示您需要多少组件来解释 95% 的方差。

现在我将解释原因。

PCA 和 NMF 之间的关系

NMF 和 PCA 与许多其他无监督学习算法一样,旨在做两件事:

编码输入X为压缩表示H解码 H 回到X',它应该尽可能接近X

他们以某种相似的方式做到这一点:

PCA 和 NMF 中的解码类似:它们输出X' = dot(H, W),其中W 是学习矩阵参数。 编码不同。在 PCA 中,它也是线性的:H = dot(X, V),其中V 也是一个学习参数。在 NMF 中,H = argmin(loss(X, H, W))(仅相对于H),其中lossXdot(H, W) 之间的均方误差,加上一些额外的惩罚。通过坐标下降进行最小化,结果可能在X 中是非线性的。 培训也不同。 PCA 顺序学习:第一个分量在没有约束的情况下最小化 MSE,每个下一个 kth 分量最小化剩余 MSE,但要与前面的分量正交。 NMF 最小化与编码时相同的loss(X, H, W),但现在针对HW

如何衡量降维性能

如果你想衡量一个编码/解码算法的性能,你可以按照通常的步骤:

    X_train 上训练您的编码器+解码器 要衡量样本内性能,请使用您的首选指标(例如 MAE、RMSE 或解释方差)比较 X_train'=decode(encode(X_train))X_train 要衡量算法的样本外性能(泛化能力),请使用看不见的 X_test 执行第 2 步。

让我们试试PCANMF

from sklearn import decomposition, datasets, model_selection, preprocessing, metrics
# use the well-known Iris dataset
X, _ = datasets.load_iris(return_X_y=True)
# split the dataset, to measure overfitting
X_train, X_test = model_selection.train_test_split(X, test_size=0.5, random_state=1)
# I scale the data in order to give equal importance to all its dimensions
# NMF does not allow negative input, so I don't center the data
scaler = preprocessing.StandardScaler(with_mean=False).fit(X_train)
X_train_sc = scaler.transform(X_train)
X_test_sc = scaler.transform(X_test)
# train the both decomposers
pca = decomposition.PCA(n_components=2).fit(X_train_sc)
nmf = decomposition.NMF(n_components=2).fit(X_train_sc)
print(sum(pca.explained_variance_ratio_))

它将打印您解释的 0.9536930834362043 方差比 - PCA 的默认度量,使用其特征值估计。我们可以用更直接的方式来衡量它——通过将度量应用于实际值和“预测”值:

def get_score(model, data, scorer=metrics.explained_variance_score):
    """ Estimate performance of the model on the data """
    prediction = model.inverse_transform(model.transform(data))
    return scorer(data, prediction)

print('train set performance')
print(get_score(pca, X_train_sc))
print(get_score(nmf, X_train_sc))

print('test set performance')
print(get_score(pca, X_test_sc))
print(get_score(nmf, X_test_sc))

给了

train set performance
0.9536930834362043 # same as before!
0.937291711378812 
test set performance
0.9597828443047842
0.9590555069007827

您可以看到 PCA 在训练集上的表现优于 NMF,但在测试集上它们的表现几乎相同。发生这种情况是因为 NMF 应用了大量正则化

HW(学习参数)必须为非负数 H 应尽可能小(L1 和 L2 惩罚) W 应尽可能小(L1 和 L2 惩罚)

这些正则化使 NMF 对训练数据的拟合比可能更差,但它们可能会提高其泛化能力,这在我们的案例中就发生了。

如何选择组件数量

PCA中,这很简单,因为它的组件h_1, h_2, ... h_k 是按顺序学习的。如果添加新组件h_(k+1),则第一个k 不会更改。因此,您可以估计每个组件的性能,并且这些估计不会依赖于组件的数量。这使得 PCA 可以在仅一次拟合数据后输出 explained_variance_ratio_ 数组。

NMF 更复杂,因为它的所有组件都是同时训练的,并且每个组件都依赖于其余所有组件。因此,如果您添加 k+1th 组件,则第一个 k 组件将发生变化,并且您无法将每个特定组件与其解释的方差(或任何其他指标)匹配。

但您可以为每个组件数拟合一个 NMF 的新实例,并比较总解释方差:

ks = [1,2,3,4]
perfs_train = []
perfs_test = []
for k in ks:
    nmf = decomposition.NMF(n_components=k).fit(X_train_sc)
    perfs_train.append(get_score(nmf, X_train_sc))
    perfs_test.append(get_score(nmf, X_test_sc))
print(perfs_train)
print(perfs_test)

这会给

[0.3236945680665101, 0.937291711378812, 0.995459457205891, 0.9974027602663655]
[0.26186701106012833, 0.9590555069007827, 0.9941424954209546, 0.9968456603914185]

因此,需要三个分量(根据训练集性能判断)或两个分量(根据测试集)来解释至少 95% 的方差。请注意,这种情况是不寻常的,并且是由少量的训练和测试数据引起的:通常在测试集上性能会下降一点,但在我的情况下它实际上有所改善。

【讨论】:

谢谢。 PCA 或 SVD 与 NMF 之间是否有直接联系?例如,我知道如果初始矩阵居中,则可以通过 SVD 执行 PCA。但是 PCA 和 NMF 呢? 不,它们没有直接连接。 NMF 具有非负性约束(在 sklearn 实现中,L1 惩罚也是如此),这使得分析解决方案(例如 SVD)通常是不可能的。在某些情况下,NMF 的超平面可能与 PCA 的超平面重合(如果 PCA 解是非负的),但这纯属偶然。即使在相同的超平面(即相同的编码和解码)的情况下,组件本身也可能不同,因为坐标系的旋转和拉伸不同。

以上是关于如何比较 PCA 和 NMF 的预测能力的主要内容,如果未能解决你的问题,请参考以下文章

spss:得到一个多元线性回归模型之后,如何比较预测值和真实值?如何判断模型是不是有预测能力?

邮政编码无处不在(PCA 预测)在 Dynamics 365 移动应用程序中的联系人或帐户表单上不起作用

第50件事 数字预测的2种方法

matlab中自动预测和手动预测的区别

机器不学习:一种提升预测能力的方法-机器学习模型

前沿科技美空军应用人工智能提升飞机预测性维修能力