Scikit-learn default class



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

树分类器做得很好,三个分类器的准确率在80- 90%(这对我的应用程序来说已经足够了)。

问题是有一些文本不属于10个类中的任何一个,我的意思是应该有一个"其他"或"未找到类"类,但我找不到一种方法来做到这一点,我试图添加该类并使用随机文本训练分类器,但结果不是那么好(50-60%的准确率)。

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

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

指出:

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

当面对类似的问题时,我在训练集中添加了空数据示例,标记为"未知"类。虽然有些模型不能很好地执行空特征,但有些模型可以(伯努利朴素贝叶斯,随机森林……)。然后确保(通过使用必要数量的空行)未知类的召回为1。经过训练的矢量器将无法识别与训练数据没有任何共同之处的新文本中的任何输入(所有特征为0),然后您的模型将对其进行未知分类。使用熊猫:

emptyline={ 'Text':'', 'label': 'Unknown'}
for i in range(300): 
    df=df.append(emptyline, ignore_index=True)

您可以对输出概率设置阈值,以确定Unknown/"out of domain"。只要您只使用训练(或验证)集来确定正确的阈值,并且只在测试集上对其进行评估,我就不会看到过度拟合问题。阈值可以看作是决策函数的超参数。它可以使用全局阈值,或者每个类的阈值。

这个场景非常类似于在二进制分类中调整阈值以获得所需的精度/召回率平衡。

相关内容

  • 没有找到相关文章

最新更新