Doc2Vec:将培训文档重新投入模型空间

时间:2017-02-08 09:39:20

标签: python classification gensim word2vec doc2vec

我对Doc2Vec的一个方面感到有点困惑。基本上,我不确定我做的事情是否有意义。我有以下数据集:

train_doc_0      --> label_0
    ...               ...
train_doc_99     --> label_0
train_doc_100    --> label_1
    ...               ...
train_doc_199    --> label_1
    ...               ...
    ...               ...
train_doc_239999 --> label_2399

eval_doc_0
    ...
eval_doc_29

train_doc_n是一个简短的文档,属于某个标签。有2400个标签,每个标签有100个培训文件。 eval_doc_0是评估文档,我想在最后预测他们的标签(使用分类器)。

我使用这些培训文档训练Doc2Vec模型&标签。一旦模型被训练,我使用infer_vector将每个原始训练文档以及我的评估文档(我最终要分类的文档)重新投影到模型的空间中。

结果是一个矩阵:

X_train (240000,300) # doc2vec vectors for training documents
y_train (240000,)    # corresponding labels
y_eval  (30, 300)    # doc2vec vectors for evaluation documents

我的问题如下:如果我在X_trainy_train上运行简单的交叉验证,那么我的准确度会很高。一旦我尝试对我的评估文档进行分类(即使只使用50个随机抽样标签),我的准确度也会非常差,这让我质疑我处理这个问题的方式。

我按照tutorial进行了文件培训。

我的方法是否有意义,尤其是使用infer_vector重新投影所有培训文档?

1 个答案:

答案 0 :(得分:1)

我没有看到任何明显的错误。

评估文件的长度,词汇等是否与培训文件相似?理想情况下,它们是所有可用标记示例的随机选择子集。 (如果完全不同,这可能是交叉验证与保持评估准确性不同的原因。)

在培训Doc2Vec模型时,您是否为每个文档提供了一个唯一ID作为其tags的唯一条目?或者您使用label_n标签作为培训示例的tags?或者两者都有? (其中任何一种都是可辩护的选择,虽然我发现将已知标签混合到通常无监督的Doc2Vec培训中,使其成为半监督,通常有助于mdoels'向量变得更有用作为后来明确监督的分类器的输入。)

当我得到前所未有的超级糟糕的'在意想不到的步骤中的准确性,通常是因为测试例的一些错误的改组或重新排序 - 随机化真实的关系。因此,在代码中以及通过详细查看几个示例,值得加倍检查。

为训练中使用的示例重新推断向量,而不是简单地要求保留在模型中的训练向上的向量,有时会产生更好的向量。但是,许多人观察到,与infer_vector()不同的默认参数,尤其是更多steps,可能更接近于培训期间使用的alpha,可能会改善结果。 (此外,在更简单的PV-DBOW dm=0模式中,推理似乎在更少的步骤中工作得更好.PV-DM,dm=1可能特别需要更多步骤。)

您链接的教程会显示一种做法,在自己调整train()的同时多次调用alpha,这通常是不必要且容易出错的 - 并且特别是不可能在最新的gensim版本中做正确的事情。您可以保留默认alpha / min_alpha,并在iter初始化期间提供首选Doc2Vec值,然后一次调用train()将自动执行许多人通过,并正确地降低学习率。由于默认iter为5,如果您没有设置它,则每次调用train()都会执行5次传递 - 因此执行您自己的外部循环10将意味着50次传递,并且该教程中的代码,由于某些奇怪的原因,每个循环两个调用train()将意味着100次传递。