我正在使用来自 scikit-learn 的 NMF(又名 NNMF)对自然语言数据进行主题提取。我正在尝试优化集群(又名组件)的数量。为此,我需要计算重建误差。然而,使用 scikit-learn 我只看到了一种在训练集上计算这个指标的方法。但我有兴趣为测试集获取这些指标。有什么建议么?
问问题
1944 次
1 回答
2
在外部数据上模拟 sklearn 的机制很容易。
此处使用函数计算此误差度量_beta_divergence(X, W, H, self.beta_loss, square_root=True)
。
API-docsW, H
中概述了有关如何获取的事实。
假设我们得到了sklearn >= 0.19
(在哪里引入),我们可以简单地复制用法。
这是一个完整的演示:
from sklearn.datasets import fetch_20newsgroups_vectorized
from sklearn.decomposition import NMF
from sklearn.decomposition.nmf import _beta_divergence # needs sklearn 0.19!!!
""" Test-data """
bunch_train = fetch_20newsgroups_vectorized('train')
bunch_test = fetch_20newsgroups_vectorized('test')
X_train = bunch_train.data
X_test = bunch_test.data
X_train = X_train[:2500, :] # smaller for demo
X_test = X_test[:2500, :] # ...
""" NMF fitting """
nmf = NMF(n_components=10, random_state=0, alpha=.1, l1_ratio=.5).fit(X_train)
print('original reconstruction error automatically calculated -> TRAIN: ', nmf.reconstruction_err_)
""" Manual reconstruction_err_ calculation
-> use transform to get W
-> ask fitted NMF to get H
-> use available _beta_divergence-function to calculate desired metric
"""
W_train = nmf.transform(X_train)
rec_error = _beta_divergence(X_train, W_train, nmf.components_, 'frobenius', square_root=True)
print('Manually calculated rec-error train: ', rec_error)
W_test = nmf.transform(X_test)
rec_error = _beta_divergence(X_test, W_test, nmf.components_, 'frobenius', square_root=True)
print('Manually calculated rec-error test: ', rec_error)
输出:
('original reconstruction error automatically calculated -> TRAIN: ', 37.326794668961604)
('Manually calculated rec-error train: ', 37.326816210011778)
('Manually calculated rec-error test: ', 37.019526486067413)
备注: fp-math 可能会引起一些微小的错误,但我懒得检查它的确切来源。较小的问题表现得更好,上面的问题是巨大的,至少在 n_features 方面。
请记住,所使用的这种计算和函数是开发人员决定的某种形式,这可能具有合理的基础理论。但总的来说,我会说:由于 MF 完全是关于重建,您可以根据比较的想法构建您喜欢的所有指标: X_orig
with nmf.inverse_transform(nmf.transform(X_orig))
.
于 2017-10-02T00:10:37.250 回答