我使用scikit-learn来分类一些文本,我有10个课程,我使用svm.SVC(kernel='linear',probability=True,class_weight='balanced')
,MultinomialNB()
和tree.DecisionTreeClassifier()
进行分类。
树分类器做得很好,三者的准确度在80-90%之间(对我的应用来说足够了)。
问题是有一些文字不属于10个类中的任何一个,我的意思是应该有一个"其他"或"未找到班级"虽然我找不到这样的方法,但我试图添加该类并用随机文本训练分类器,但结果并不好(50-60%的准确度)。
我试图使用朴素贝叶斯给我clf.predict_proba
函数的概率并定义一个阈值,但那种过度拟合"分类器。
有没有人解决过这样的问题?提前谢谢。
注意:
我使用了1000个文本来训练分类器
答案 0 :(得分:2)
遇到类似问题时,我在训练集中添加了空白数据示例,并标有“未知”类。虽然某些模型的空白功能不能很好地执行,而某些模型却可以(Bernoulli Naive Bayes,随机森林...)。 然后确保(通过使用必要的空行数)在未知类上的召回率为1。 您训练有素的矢量化器将无法识别新文本中的任何输入,而这些输入与训练数据没有什么共同之处(所有功能都为0),然后您的模型会将它们分类为未知。 使用熊猫:
emptyline={ 'Text':'', 'label': 'Unknown'}
for i in range(300):
df=df.append(emptyline, ignore_index=True)
答案 1 :(得分:0)
您可以对输出概率设置阈值,以确定“未知” /“域外”。只要您仅使用训练(或验证)集来确定正确的阈值,并且仅在测试集上对其进行评估-我不会看到过拟合的问题。阈值可以视为决策函数的超参数。它可以使用全局阈值或每个类别的阈值。
这种情况与调整二进制分类中的阈值以获得所需的精度/召回平衡非常相似。