如何在Python中提高精度和召回不平衡数据集

时间:2018-07-16 23:38:16

标签: python machine-learning scikit-learn nlp precision-recall

我建立了一个监督模型来对医学文本数据进行分类(我的输出预测疾病的阳性或阴性)。数据非常不平衡(130例阳性病例与1600例阴性病例相比,这是可以理解的,因为这种疾病很少见)。我首先清理了数据(删除了不必要的单词,词形修饰等),然后再应用POS。然后,我将TfidfVectorizer和TfidfTransformer应用于此清除的数据。对于分类,我同时尝试了SVM和随机森林,但即使使用GridSearchCV调整了正数据,也仅对正数据实现了56%的精度和58%的查全率(我也使class_weight ='balanced')。是否有人对如何提高这种低精度和召回率有任何建议?非常感谢。

这是我当前的管道(显然,我在运行它时仅使用其中一个分类器,但我只是为了显示其参数而显示了它们)。

pipeline = Pipeline([ 

('vectors', TfidfVectorizer(ngram_range = (2,3),norm = 'l1', token_pattern = r"\w+\b\|\w+" ,min_df = 2, max_features = 1000).fit(data['final'])),

('classifier', RandomForestClassifier(n_estimators = 51, min_samples_split = 8, min_samples_leaf = 2, max_depth = 14, class_weight= 'balanced')),

('classifier', SVC(C = 1000, gamma = 1, class_weight = 'balanced', kernel='linear')),

])

1 个答案:

答案 0 :(得分:2)

首先,查看分类器正在查看的数据。测量要素与类别之间的相关性(Pearson相关性很好),并检查您是否具有不相关的要素。例如,患者一词通常不被视为停用词,但是在医学数据库中,很可能是一个停用词。

还考虑使用更复杂的功能,例如双字母组或三字母组,甚至添加单词嵌入(例如,采用诸如word2vec或GloVe之类的预训练模型,然后采用平均文本向量)。

N.B .:如今,文本分类主要是通过神经网络和词嵌入进行的。也就是说,您的数据集不是很大,因此更改方法可能不值得(或者由于某些原因您可能不想这样做)。