如何在 Python 中提高不平衡数据集的精度和召回率
Posted
技术标签:
【中文标题】如何在 Python 中提高不平衡数据集的精度和召回率【英文标题】:How to improve Precision and Recall on Imbalanced Dataset in Python 【发布时间】:2018-12-24 13:32:03 【问题描述】:我建立了一个监督模型来对医学文本数据进行分类(我的输出预测疾病的阳性或阴性发生率)。数据非常不平衡(130 例阳性病例与 1600 例阴性病例相比,这是可以理解的,因为这种疾病很少见)。我首先清理了数据(删除了不必要的单词、词形还原等),然后应用了 POS。然后,我将 TfidfVectorizer 和 TfidfTransformer 应用于这些清理过的数据。对于分类,我尝试了 SVM 和随机森林,但即使在使用 GridSearchCV 调整参数后(我还设置了 class_weight = 'balanced'),正面数据的准确率和召回率也只有 56% 和 58%。有人对如何提高这种低精度和召回率有建议吗?非常感谢。
这是我当前的流水线(显然我在运行它时只使用其中一个分类器,但我同时显示它们只是为了显示它们的参数)。
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')),
])
【问题讨论】:
我建议您查看Cross Validated SE 并可能要求那里获得更多面向统计数据的答案。 【参考方案1】:首先,查看分类器看到的数据。测量特征和类之间的相关性(皮尔逊相关性很好)并检查是否有不相关的特征。例如,患者这个词通常不被视为停用词,但在医学数据库中,它很可能是一个。
还可以考虑使用更复杂的特征,例如二元组或三元组,甚至添加词嵌入(例如,采用预训练模型,例如 word2vec 或 GloVe,然后采用平均文本向量)。
N.B.:现在的文本分类主要是通过神经网络和词嵌入来完成的。也就是说,您的数据集不是很大,因此更改方法可能不值得(或者您可能出于某种原因不想这样做)。
【讨论】:
以上是关于如何在 Python 中提高不平衡数据集的精度和召回率的主要内容,如果未能解决你的问题,请参考以下文章
如何在不平衡的数据中解释具有中等精度和召回率的高 AUC-ROC?