首页 > 解决方案 > 我在 ML 算法上应用了 W2V。它为 NB 提供了负值的误差,并为所有其他算法提供了 0.48 的准确度。怎么会?

问题描述

from gensim.models import Word2Vec
import time
# Skip-gram model (sg = 1)
size = 1000
window = 3
min_count = 1
workers = 3
sg = 1

word2vec_model_file = 'word2vec_' + str(size) + '.model'
start_time = time.time()
stemmed_tokens = pd.Series(df['STEMMED_TOKENS']).values
# Train the Word2Vec Model
w2v_model = Word2Vec(stemmed_tokens, min_count = min_count, size = size, workers = workers, window = window, sg = sg)
print("Time taken to train word2vec model: " + str(time.time() - start_time))
w2v_model.save(word2vec_model_file)

这是我写的代码。我将此文件应用于所有 ML 算法进行二进制分类,但所有算法都给出相同的结果 0.48。怎么可能?而且这个结果与 BERT 和 TFIDF 分数相比也很差。

标签: pythonlogistic-regressionrandom-forestword2vecnaivebayes

解决方案


1000 维的向量size非常少见,需要大量数据来训练。例如,著名的GoogleNews向量是针对 300 万个单词的,在大约 1000 亿个语料库单词上进行训练——但仍然只有 300 个维度。您STEMMED_TOKENS的数据可能不足以证明 100 维向量的合理性,更不用说 300 或 1000。

选择min_count=1是一个坏主意。该算法无法从只出现几次的单词中学习任何有价值的东西。通常人们会通过完全丢弃稀有词来获得更好的结果,默认情况下min_count=5会这样做。(如果你有很多数据,你可能会增加这个值来丢弃更多的词。)

您是否正在检查模型的大小或逐字逐句的结果,以确保它符合您的预期?尽管您的列被命名STEMMED_TOKENS,但我没有看到任何实际的拆分为标记,并且Word2Vec该类希望每个文本都是字符串列表而不是字符串。

最后,如果没有看到将富含词向量的数据提供给其他分类步骤的所有其他选择,则可能(甚至可能)存在其他错误。

鉴于二分类模型总是可以通过简单地使用更常见的类别对每个示例进行分类来获得至少 50% 的准确度,任何低于 50% 的准确度结果都应该立即引起对过程中主要问题的怀疑,例如:

  • 示例和标签的错位
  • 训练数据不足/不具代表性
  • 由于数据准备或调用错误,一些步骤根本没有运行

推荐阅读