4

关于这个特定问题有很多帖子,但我无法解决这个问题。我一直在用 Sklearn 和 Gensim 实现在 20newgroup 语料库上试验 LDA。文献中描述了困惑通常会随着主题数量的增加而减少,但我得到了不同的结果。

我已经尝试过不同的参数,但总的来说,当增加主题数量时,测试集的困惑度会增加,而训练集的困惑度会降低。这可能表明该模型在训练集上过度拟合。但是在使用其他文本数据集时会出现类似的模式。此外,专门使用该数据集的研究的困惑度有所降低。(例如ng20 困惑

我已经对 SkLearn、Gensim 和 Gensim Mallet 包装器进行了实验,所有包都显示了不同的困惑度值(这是可以预料的,因为 LDA 是随机初始化的 + 不同的推理算法),但常见的模式是每个包的困惑度确实增加,这与文献中的许多论文相矛盾。

# imports for code sample
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.decomposition import LatentDirichletAllocation

小示例代码

# retrieve the data
newsgroups_all = datasets.fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'), shuffle = True)
print("Extracting tf features for LDA...")
tf_vectorizer_train = CountVectorizer(max_df=0.95, min_df=2,stop_words='english')
X = tf_vectorizer_train.fit_transform(newsgroups_all.data)
X_train, X_test = train_test_split(X,  test_size=0.2, random_state=42)
k = N
lda = LatentDirichletAllocation(n_components = k, doc_topic_prior = 1/k, topic_word_prior = 0.1)
lda.fit(X_train)
perp_test = lda.perplexity(X_test)
perp_train = lda.perplexity(X_train)

我希望所有的困惑都会减少,但我得到以下输出:

k = 5,训练困惑度:5531.15,测试困惑度:7740.95

k = 10,训练困惑度:5202.80,测试困惑度:8805.57

k = 15,训练困惑度:5095.42,测试困惑度:10193.42

编辑:运行 5 折交叉验证(从 10-150,步长:10)并平均每折的困惑度后,创建以下图。似乎训练集的困惑度仅在 1-15 个主题之间降低,然后在进入更高主题数时略有增加。测试集的困惑度不断增加,几乎是线性的。sklearn/gensim 实现和研究发表的困惑度降低之间的困惑度计算是否存在差异。

训练和测试困惑度

4

0 回答 0