【问题标题】:How to improve Precision and Recall on Imbalanced Dataset in Python如何在 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 并可能要求那里获得更多面向统计数据的答案。

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


【解决方案1】:

首先,查看分类器看到的数据。测量特征和类之间的相关性(皮尔逊相关性很好)并检查是否有不相关的特征。例如,患者这个词通常不被视为停用词,但在医学数据库中,它很可能是一个。

还可以考虑使用更复杂的特征,例如二元组或三元组,甚至添加词嵌入(例如,采用预训练模型,例如 word2vec 或 GloVe,然后采用平均文本向量)。

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

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 2019-08-18
    • 2023-02-10
    • 1970-01-01
    • 2016-06-11
    • 2017-01-04
    • 2018-03-17
    • 2012-09-14
    • 2021-05-17
    相关资源
    最近更新 更多