Scikit-学习默认课程

时间:2016-10-18 12:55:44

标签: class scikit-learn classification svm naivebayes

我使用scikit-learn来分类一些文本,我有10个课程,我使用svm.SVC(kernel='linear',probability=True,class_weight='balanced')MultinomialNB()tree.DecisionTreeClassifier()进行分类。

树分类器做得很好,三者的准确度在80-90%之间(对我的应用来说足够了)。

问题是有一些文字不属于10个类中的任何一个,我的意思是应该有一个"其他"或"未找到班级"虽然我找不到这样的方法,但我试图添加该类并用随机文本训练分类器,但结果并不好(50-60%的准确度)。

我试图使用朴素贝叶斯给我clf.predict_proba函数的概率并定义一个阈值,但那种过度拟合"分类器。

有没有人解决过这样的问题?提前谢谢。

注意:

我使用了1000个文本来训练分类器

2 个答案:

答案 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)

您可以对输出概率设置阈值,以确定“未知” /“域外”。只要您仅使用训练(或验证)集来确定正确的阈值,并且仅在测试集上对其进行评估-我不会看到过拟合的问题。阈值可以视为决策函数的超参数。它可以使用全局阈值或每个类别的阈值。

这种情况与调整二进制分类中的阈值以获得所需的精度/召回平衡非常相似。