我正在按照本指南尝试使用上面指南中显示的MeanEmbeddingVectorizer和TfidfEmbeddingVectorizer作为输入来创建二进制分类器和多标签分类器。
两个嵌入向量化器都是这样创建的,首先使用gensim库从文档中启动 w2v,然后对文档中的所有给定单词进行向量映射,并通过取与单个单词对应的所有向量的平均值来向量化它们。
这一步完成后,我尝试使用这些嵌入向量器作为几个模型的输入,例如OneVsRestClassifier(SVC)、RandomForestClassifier和ExtraTreesClassifier。因此,就指南中显示的内容而言,所有模型的表现都比我的预期差。
这些是每个模型(二元分类器)的准确度:
randomF_countVect: 0.8898
extraT_countVect: 0.8855
extraT_tfidf: 0.8766
randomF_tfidf: 0.8701
svc_tfidf: 0.8646
svc_countVect: 0.8604
ExtraTrees_w2v: 0.7285
ExtraTrees_w2v_tfidf: 0.7241
多标签分类器也产生了类似的结果。
我不确定我做错了什么。
请注意,我正在处理非常小的文档。其中每个文档由短文本(一两个句子)组成,它们是非英语文档。整个文档总共只有 1163 个唯一词。下面是我的代码。有人可以点亮我吗?
Word2vec 启动
model = Word2Vec([my_tokenizer(item) for item in df['text']], size=100, window=5, min_count=1, workers=2)
w2v = {w: vec for w, vec in zip(model.wv.index2word, model.wv.syn0)}
楷模
svc = Pipeline([("count_vectorizer", vectorizer), ("OneVSRest svc linear", OneVsRestClassifier(SVC(kernel='linear')))])
svc_tfidf = Pipeline([("tfidf_vectorizer", tf_vectorizer), ("OneVSRest svc linear", OneVsRestClassifier(SVC(kernel='linear')))])
randomF = Pipeline([("count_vectorizer", vectorizer), ("RandomForestClassifier", RandomForestClassifier(n_estimators=100))])
randomF_tfidf = Pipeline([("tfidf_vectorizer", tf_vectorizer), ("RandomForestClassifier", RandomForestClassifier(n_estimators=100))])
extraT = Pipeline([("count_vectorizer", vectorizer), ("ExtraTreesClassifier", ExtraTreesClassifier(n_estimators=100))])
extraT_tfidf = Pipeline([("tfidf_vectorizer", tf_vectorizer), ("ExtraTreesClassifier", ExtraTreesClassifier(n_estimators=100))])
etree_w2v = Pipeline([("word2vec vectorizer", MeanEmbeddingVectorizer(w2v)), ("word2vec extra trees", ExtraTreesClassifier(n_estimators=100))])
etree_w2v_tfidf = Pipeline([("tfidf word2vec vectorizer", TfidfEmbeddingVectorizer(w2v)), ("tfidf word2vec extra trees", ExtraTreesClassifier(n_estimators=100))])
all_models = [
("svc", svc),
("svc_tfidf", svc_tfidf),
("randomF", randomF),
("randomF_tfidf", randomF_tfidf),
("extraT", extraT),
("extraT_tfidf", extraT_tfidf),
("etree_w2v", etree_w2v),
("etree_w2v_tfidf", etree_w2v_tfidf)
]
scores = sorted([(name, cross_val_score(model, df['text'], df['product'], cv=kfold).mean())
for name, model in all_models],
key=lambda args: -(args[1]))