【问题标题】:Checking model overfit of doc2vec with infer_vector()使用 infer_vector() 检查 doc2vec 的模型过拟合
【发布时间】:2020-10-26 12:28:46
【问题描述】:

我的目标是作为第一步从列 df["text"] 创建文档嵌入,然后作为第二步将它们与其他变量一起插入 XGBoost Regressor 模型以进行预测。这对 train_df 非常有效。
我目前正在尝试通过在看不见的 test_df 上使用 infer_vector() 推断向量来评估我训练有素的 Doc2Vec 模型,然后再次使用它进行预测。但是,结果非常糟糕。我得到了一个非常大的错误(RMSE)。 我假设,这意味着 Doc2Vec 严重过度拟合? 我实际上不确定这是否是评估我的 doc2vec 模型的正确方法(通过 infer_vector)? 如何防止doc2vec过拟合?

请在下面找到我的代码,用于从模型中推断向量:

vectors_test=[]
for i in range(0, len(test_df)):
    vecs=model.infer_vector(tokenize(test_df["text"][i]))
    vectors_test.append(vecs)
vectors_test= pd.DataFrame(vectors_test)
test_df = pd.concat([test_df, vectors_test], axis=1)

然后我使用我的 XGBoost 模型进行预测:

np.random.seed(0)
test_df= test_df.reindex(np.random.permutation(test_df.index))

y = test_df['target'].values
X = test_df.drop(['target'], axis=1).values

y_pred = mod.predict(X)
pred = pd.DataFrame()
pred["Prediction"] = y_pred
rmse = np.sqrt(mean_squared_error(y,y_pred))
print(rmse)

另请参阅我的 doc2vec 模型的训练:

doc_tag = train_df.apply(lambda train_df: TaggedDocument(words=tokenize(train_df["text"]), tags= [train_df.Tag]), axis = 1)

# initializing model, building a vocabulary 

model = Doc2Vec(dm=0, vector_size=200, min_count=1, window=10, workers= cores) 

model.build_vocab([x for x in tqdm(doc_tag.values)])

# train model for 5 epochs 

for epoch in range(5): 
    model.train(utils.shuffle([x for x in tqdm(doc_tag.values)]), total_examples=len(doc_tag.values), epochs=1)

【问题讨论】:

    标签: python testing nlp gensim doc2vec


    【解决方案1】:

    如果不知道您的 XGBoost 模型正在接受什么训练以预测什么,或者不知道某些步骤的训练数据的类型/数量,很难推测为什么一组特定的输入表现不佳。 (例如,XGBoost 模型的数据、参数或与任务不匹配的训练同样可能。)

    但是,一些观察:

    • 您通常不应该在自己的循环中多次调用train()。请参阅My Doc2Vec code, after many loops of training, isn't giving good results. What might be wrong? 以了解此处常见问题的讨论。 (你的没有那么明显,但是在你的 5 个单独的 train()s 中没有正确处理学习率 - 实际上你的日志输出中甚至应该有一些错误。)

    • 类似地:在这类模型中使用像1 这样小的min_count 通常是个坏主意:这些罕见的词,没有足够多的例子来真正理解,只是注入特殊的噪音,稀释了影响的影响其他有意义的周围标记。

    • 大多数已发表的工作训练 Doc2Vec 模型进行 10-20 个 epochs - 您只使用 5 个。(而且,对于较小的数据集或较小的文本,通常更多的 epochs 会有所帮助。)推理也将默认为配置的 epochs创建模型的时间——这里只有 5 个——但更多的时期通常是有益的。

    • 目前尚不清楚您的训练文本的大小及其独特的词汇量,但如果模型相对较大(就vector_size 或总生存词汇量而言)与训练数据相比,Doc2Vec 最有可能过度拟合。然后,该模型有很多机会从本质上“记住”训练集的特性,而不是更通用的模式,这些模式仍然对训练外的数据有用。 (例如,min_count=1,如果它保留了许多单例单词,每个单词只出现在一个文本中,则为模型提供了许多“角落和缝隙”,在这些“角落和缝隙”中,以不太可能帮助其他示例的方式改进其训练目标。)如果您的训练数据“小”,您可能需要使用较小的 vector_size 和较大的 min_count 以避免过度拟合,然后可能需要更多的 epochs 以确保足够的训练。

    • infer_vector 基本上会忽略任何不在其词汇表中的单词 - 因此您应该查看该集中表现不佳的一些特定文本,并检查它们的大部分单词是否存在。但还要注意:由于Doc2Vec 是一种无监督方法,因此可以建立一个合理的案例来训练它以学习所有可用数据的文本模式,包括“测试”集中的文本。然后,对于所有示例中的单词,更有可能有一些单词数据,至少超过min_count 阈值。 (当然,实际的监督预测器本身只能在预测器训练期间未提供所需答案的测试示例上进行公平评估。但它仍然可以从使用所有文本数据的无监督步骤中接收其特征。)

    • Doc2Vec 模型的过度拟合或其他训练问题(但不是整体质量)的粗略检查是从训练过的相同文本中重新推断文档向量,并检查模型的批量训练集向量 (model.docvecs) 用于这些重新推断向量的最近邻居。如果重新推断向量的最近邻通常不是相同文本的批量训练向量——或者更一般地说,多次重新推断相同文本不会产生彼此“接近”的向量——那么关于模型训练或推理不足:过度拟合、训练不足、数据不足或参数不明智。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多