如何在 Python 中提高不平衡数据集的准确率和召回率
How to improve Precision and Recall on Imbalanced Dataset in Python
我建立了一个监督模型来对医学文本数据进行分类(我的输出预测疾病的积极或消极发生)。数据非常不平衡(130 个阳性病例与 1600 个阴性病例相比,这是可以理解的,因为这种疾病很罕见)。我首先清理了数据(删除了不必要的单词、词形还原等),然后应用了 POS。然后我将 TfidfVectorizer 和 TfidfTransformer 应用到这个清理过的数据。对于分类,我尝试了 SVM 和随机森林,但即使在使用 GridSearchCV 调整它们的参数后(我也做了 class_weight = 'balanced'),阳性数据的准确率和召回率仅为 56% 和 58%。有没有人对如何提高这种低精度和召回率有建议?非常感谢。
这是我当前的 Pipeline(很明显,我 运行 时只使用了其中一个分类器,但我显示了两个只是为了显示它们的参数)。
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')),
])
首先,查看您的 class 支持者看到的数据。测量特征与 class 之间的相关性(Pearson 相关性很好)并检查是否有不相关的特征。例如,单词 patient 通常不被视为停用词,但在医学数据库中,它很可能是一个停用词。
还可以考虑使用更复杂的特征,如二元组或三元组,甚至添加词嵌入(例如,采用 word2vec 或 GloVe 等预训练模型,然后采用平均文本向量)。
N.B.: 如今,文本 class 化主要是通过神经网络和词嵌入完成的。也就是说,您的数据集不是很大,因此更改方法可能不值得(或者出于某种原因您可能不想这样做)。
我建立了一个监督模型来对医学文本数据进行分类(我的输出预测疾病的积极或消极发生)。数据非常不平衡(130 个阳性病例与 1600 个阴性病例相比,这是可以理解的,因为这种疾病很罕见)。我首先清理了数据(删除了不必要的单词、词形还原等),然后应用了 POS。然后我将 TfidfVectorizer 和 TfidfTransformer 应用到这个清理过的数据。对于分类,我尝试了 SVM 和随机森林,但即使在使用 GridSearchCV 调整它们的参数后(我也做了 class_weight = 'balanced'),阳性数据的准确率和召回率仅为 56% 和 58%。有没有人对如何提高这种低精度和召回率有建议?非常感谢。
这是我当前的 Pipeline(很明显,我 运行 时只使用了其中一个分类器,但我显示了两个只是为了显示它们的参数)。
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')),
])
首先,查看您的 class 支持者看到的数据。测量特征与 class 之间的相关性(Pearson 相关性很好)并检查是否有不相关的特征。例如,单词 patient 通常不被视为停用词,但在医学数据库中,它很可能是一个停用词。
还可以考虑使用更复杂的特征,如二元组或三元组,甚至添加词嵌入(例如,采用 word2vec 或 GloVe 等预训练模型,然后采用平均文本向量)。
N.B.: 如今,文本 class 化主要是通过神经网络和词嵌入完成的。也就是说,您的数据集不是很大,因此更改方法可能不值得(或者出于某种原因您可能不想这样做)。