我对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_train
和y_train
上运行简单的交叉验证,那么我的准确度会很高。一旦我尝试对我的评估文档进行分类(即使只使用50个随机抽样标签),我的准确度也会非常差,这让我质疑我处理这个问题的方式。
我按照tutorial进行了文件培训。
我的方法是否有意义,尤其是使用infer_vector
重新投影所有培训文档?
答案 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次传递。