Python Doc2Vec模型训练后准确率低

Python Doc2Vec模型训练后准确率低,python,nlp,data-science,gensim,doc2vec,Python,Nlp,Data Science,Gensim,Doc2vec,我正在尝试训练一个Doc2Vec模型,以便创建一个多标签文本分类器。 为此,我选择了一个包含大约70000篇文章的数据集,每篇文章包含1500到2000个单词。 这些文章分为5类。 在设置输入时,我为文档选择了相应的标签作为标记。 我的做法如下: taged\u article=data.apply(lambda r:TaggedDocument(words=r['article'].split(),tags=[r.labels]),axis=1) 然后,我用以下行代码训练了我的模型: mode

我正在尝试训练一个Doc2Vec模型,以便创建一个多标签文本分类器。
为此,我选择了一个包含大约70000篇文章的数据集,每篇文章包含1500到2000个单词。
这些文章分为5类。
在设置输入时,我为文档选择了相应的标签作为标记。 我的做法如下:
taged\u 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%的准确率和21%的F1分数


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

首先,您几乎肯定不想在自己管理
alpha
时使用自己的循环多次调用
train()
。见:

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

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

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

最后,请注意,
Doc2Vec
类将继承默认的
epochs
值5,但大多数已发布的工作使用10-20个训练时段,并且通常对于较小的数据集,更多的训练时段可能会有所帮助。此外,推理将在模型创建时重用相同的
epoch
集(或默认值),并且(至少)与培训时使用相同数量的
epoch
效果最好,但不清楚您使用的
推理步骤是什么


(作为代码易读性的一个单独问题:您已经将您的模型命名为
model\u dbow
,但是通过使用
dm=1
您实际上使用的是PV-dm模式,而不是PV-dbow模式。)

事实上,我已经使用了默认值alpha,因此我猜它在一些时代之后将变为负值。我将尝试应用你的所有评论,我希望它变得更好。最后一个问题:我可以使用一个包含两个值的列表作为每个文档的标记,例如文档id和它的标签吗?是的,
标记必须是一个列表,但在经典情况下,它是一个只有一个元素的列表,唯一的文档ID。但您可以添加另一个标记,如已知标签。这对整个模型是有帮助还是有伤害,这是你必须测试的。拥有2个标签将在真正的DBOW模式下使训练工作量增加一倍。(如果您希望为每个标签提供一个摘要文档向量,请注意,将向量空间中的复杂类别形状缩减为一个点可能会掩盖类别中各种文档主题的实际范围。)