Bas*_*Bas 5 python lda topic-modeling scikit-learn perplexity
有很多关于这个具体问题的帖子,但我无法解决这个问题。我一直在 20newgroup 语料库上使用 Sklearn 和 Gensim 实现来试验 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
Run Code Online (Sandbox Code Playgroud)
小示例代码
# 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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
我希望所有的困惑都会减少,但我得到以下输出:
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 实现和研究发表之间的困惑度计算是否存在差异,从而降低了困惑度。
| 归档时间: |
|
| 查看次数: |
1519 次 |
| 最近记录: |