我构建了一个有监督的模型来对医学文本数据进行分类(我的输出预测了疾病的积极或消极发生)。数据非常不平衡(130例阳性病例与1600例阴性病例相比,这是可以理解的,因为这种疾病很罕见)。我首先清理了数据(删除了不必要的单词、词汇化等)。并在事后应用了POS。然后,我对清理后的数据应用了TfidfVectorizer和TfidfTransformer。对于分类,我尝试了支持向量机和随机森林,但即使在使用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')),
])
发布于 2018-07-17 07:50:17
首先,看看你的分类器看到的数据。测量特征和类之间的相关性(Pearson相关性很好),并检查是否有不相关的特征。例如,患者这个词通常不会被认为是一个停用词,但在医学数据库中,它很可能是一个停用词。
还要考虑使用更复杂的特征,如二元语法或三元语法,甚至添加单词嵌入(例如,采用预先训练的模型,如word2vec或GloVe,然后采用平均文本向量)。
注:如今,文本分类主要是通过神经网络和单词嵌入来完成的。也就是说,您的数据集不是很大,因此可能不值得更改方法(或者出于某种原因,您可能不想这样做)。
https://stackoverflow.com/questions/51371356
复制相似问题