SMOTE过采样应用于文本分类

时间:2019-08-24 15:40:38

标签: python-3.x

我正在研究文本分类,其中我在使用多项朴素贝叶斯分类器来将文章标题预测为各自的主题类别。这些都存储在pandas数据框中,并且是文本列。但是,它们是两个类别,分别包含50,000条记录和30,000条记录。因此,我需要对数据进行过采样,然后应用算法。当我进行过采样时,它会降低模型准确性得分,并给我15%的分数。请告诉我如何改善它。

X_train, X_test, Y_train, Y_test=train_test_split(df['Title'],df['Subjects'], test_size=0.2,random_state=42)

count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)


sm = SMOTE(random_state=2)
X_train_res, y_train_res = sm.fit_sample(X_train_tfidf, Y_train)
print("Shape after smote is:",X_train_res.shape,y_train_res.shape)

nb = Pipeline([('clf', MultinomialNB())])
nb.fit(X_train_res, y_train_res)
y_pred = nb.predict(count_vect.transform(X_test))
print(accuracy_score(Y_test,y_pred))

我希望这样做可以提高模型的准确性。没有过采样的模型精度为62%,过采样后的模型精度为15%,实际上应该更高。

1 个答案:

答案 0 :(得分:0)

实际上,在文本分类任务中,使用SMOTE进行平衡/过采样类别可能会出现问题。这里有一些不错的解释和建议:

https://datascience.stackexchange.com/a/27758

简而言之,SMOTE输出可能不代表“有意义的”替代,并且由于特征空间的大小,其基于最近邻居的方法可能会产生较差的结果。

更多想法:

  • 建议不要使用准确性,而应使用F1或类似语言。
  • 不太可能帮助您,但您是否尝试了欠采样?
  • 对于MultinomialNB分类器,您可以尝试显式设置class_prior
  • 最后,像Forests和Boosting方法之类的其他方法可能更适合于不平衡的数据集。