Scikit-Learn中NMF(又称NNMF)测试集的重建错误



我使用scikit-learn的NMF(又名NNMF)对自然语言数据进行主题提取。我正在尝试优化簇数(又称组件)。为此,我需要计算重建误差。但是,使用Scikit-Learn,我只看到一种在训练集上计算此指标的方法。但是我有兴趣将这些指标用于测试集。有任何建议吗?

很容易模仿外部数据上的Sklearn机制。

此处使用函数_beta_divergence(X, W, H, self.beta_loss, square_root=True)

在API-DOC中概述了如何获得W, 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是关于重建的,因此您可以基于与nmf.inverse_transform(nmf.transform(X_orig))进行比较的想法来构建所有喜欢的指标: X_orig

相关内容

  • 没有找到相关文章

最新更新