我在 ML 算法上应用了 W2V。它为 NB 给出了负值误差,并为所有其他算法给出了 0.48 的精度。怎么来的?

I applied W2V on ML Algorithms. It gives error of negative value for NB and gives 0.48 accuracy for for all the other algorithms. How come?

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 class 期望每个文本都是 列表-strings不是一个字符串。

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

鉴于二元class化模型总是可以通过简单地class用更常见的class验证每个示例来获得至少 50% 的准确度,任何准确度结果都会降低超过 50% 应该立即引起对您过程中主要问题的怀疑,例如:

  • 示例和标签未对齐
  • insufficient/unrepresentative训练数据
  • 由于数据准备或调用错误,有些步骤 运行 根本没有