如何在 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 中提高不平衡数据集的精度和召回率的主要内容,如果未能解决你的问题,请参考以下文章

如何计算分层 K 折交叉验证的不平衡数据集的误报率?

如何在不平衡的数据中解释具有中等精度和召回率的高 AUC-ROC?

在 RandomForest 中,特征选择精度永远不会提高到 %0.1 以上

mllib 如何在内部对不平衡数据集的类进行加权?

如何计算聚类中的精度和召回率?

如何提高机器学习的分类精度