【问题标题】:Low accuracy rate after training Doc2Vec model训练Doc2Vec模型后准确率低
【发布时间】:2020-11-17 13:52:56
【问题描述】:

我正在尝试训练 Doc2Vec 模型以创建多标签文本分类器。
为了做到这一点,我选择了一个包含大约 70000 篇文章的数据集,每篇文章包含 1500 到 2000 个单词。
这些文章分为 5 类。
在设置我的输入时,我选择了我的文档的标签作为相应的标签。 我已经这样做了: tagged_article = data.apply(lambda r: TaggedDocument(words=r['article'].split(), tags=[r.labels]), axis=1)
然后我用以下行代码训练了我的模型:

model_dbow = Doc2Vec(dm=1, vector_size=300, negative=5, min_count=10, workers=cores)
model_dbow.build_vocab([x for x in tqdm(tagged_article.values)])

print("Training the Doc2Vec model for ", no_epochs, "number of epochs" )
for epoch in range(no_epochs):
     model_dbow.train(utils.shuffle([x for x in tqdm(tagged_article.values)]),total_examples=len(tagged_article.values), epochs=1)
     model_dbow.alpha -= 0.002
     model_dbow.min_alpha = model_dbow.alpha   

之后我创建了一个逻辑回归模型来预测每篇文章的标签。

为此,我创建了以下函数:\

def vec_for_learning(model, tagged_docs):
sents = tagged_docs.values
targets, regressors = zip(*[(doc.tags[0], model.infer_vector(doc.words, steps=inference_steps)) for doc in tqdm(sents)])
return targets, regressors

y_train, X_train = vec_for_learning(model_dbow, tagged_article)

logreg = LogisticRegression(solver='lbfgs',max_iter=1000)
logreg.fit(X_train, y_train)

不幸的是,我得到了一个非常糟糕的结果。事实上,我的准确率是 22%,F1 分数是 21%

你能解释一下为什么我会得到这些糟糕的结果吗?

【问题讨论】:

    标签: python nlp data-science gensim doc2vec


    【解决方案1】:

    首先,您几乎肯定不想在自己管理alpha 时使用自己的循环多次调用train()。见:My Doc2Vec code, after many loops of training, isn't giving good results. What might be wrong?

    由于您没有显示您的 no_epochs 值,我不能确定您正在做绝对最糟糕的事情 - 最终将 alpha 递减到负值 - 但您可能会这样做。尽管如此,仍然不需要那个容易出错的循环。 (而且,您可能想联系向您推荐此代码模板的任何来源,并让他们知道他们正在推广一种反模式。)

    使用仅有的 5 个已知标签作为文档标签可能也是一个错误。这意味着该模型本质上只学习了 5 个文档向量,就好像所有文章只是 5 个巨型文本的片段一样。虽然有时使用(或添加)已知标签作为标签很有帮助,但更经典的训练方式Doc2Vec 为每个文档提供了一个唯一的 ID,因此该模型正在学习(在您的情况下)大约 70,000 个不同的文档向量,并且可以更丰富地对所有文档和标签跨越的各种不规则形状的文档可能性空间进行建模。

    虽然您的数据的大小肯定可以与显示Doc2Vec 算法价值的已发表作品相当,但您的语料库并不庞大(并且不清楚您的词汇量可能有多大和多样性)。因此,对于您拥有的数据的数量/种类而言,300 个维度可能过大,或者min_count=10 在修剪不太重要和采样率较低的单词时过于激进(或不够激进)。

    最后,请注意 Doc2Vec 类将继承默认的 epochs 值 5,但大多数已发表的作品使用 10-20 个训练 epoch,并且通常使用较小的数据集甚至更多可能会有所帮助。此外,推理将在模型创建时重用相同的epochs 设置(或默认设置),并且在(至少)与训练相同数量的epochs 下效果最佳 - 虽然目前尚不清楚您正在使用什么inference_steps

    (作为代码易读性的一个单独问题:您已将模型命名为 model_dbow,但使用 dm=1 您实际上是在使用 PV-DM 模式,不是 PV-DBOW 模式.)

    【讨论】:

    • 事实上我已经使用了alpha的默认值,所以我猜它会在一些时期后变成负数。我会尝试应用你所有的评论,我希望它变得更好
    • 最后一个问题:例如,我可以使用包含两个值的列表作为每个文档的标签吗?例如 document_id 及其标签?
    • 是的,tags 必须是一个列表,但在经典情况下,它是一个只有一个元素的列表,即唯一的文档 ID。但是您可以添加另一个标签,例如已知标签。这是否有助于或损害整个模型是您必须测试的。在真正的 DBOW 模式下,拥有 2 个标签基本上会使训练工作量翻倍。 (如果您希望提供这些是为每个标签获取单个摘要文档向量,请注意,将向量空间中的复杂类别形状减少到仅一个点可能会掩盖不同文档主题的实际范围在类别内。)
    猜你喜欢
    • 2020-04-07
    • 2023-03-17
    • 2021-10-13
    • 2020-02-11
    • 2020-10-17
    • 2018-09-18
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多