我在 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 分数相比也很差。

解决方法

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

选择 min_count=1 是个坏主意。这个算法不能从只出现几次的单词中学到任何有价值的东西。通常人们通过完全丢弃稀有词来获得更好的结果,就像默认的 min_count=5 那样。 (如果您有大量数据,您可能会增加这个值以丢弃更多的词。)

您是否要检查模型的大小或字对字的结果,以确保它按照您的预期运行?尽管您的列被命名为 STEMMED_TOKENS,但我没有看到任何实际的分词,并且 Word2Vec 类希望每个文本都是一个 list-of-strings,不是一个字符串。

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

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

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