Class Scikit学习默认类

Class Scikit学习默认类,class,scikit-learn,classification,svm,naivebayes,Class,Scikit Learn,Classification,Svm,Naivebayes,我正在使用scikit学习对一些文本进行分类,我有10个类,我正在使用svm.SVC(kernel='linear',probability=True,class_weight='balanced'),多项式nb()和tree.DecisionTreeClassifier()进行分类 树分类器做得很好,三个分类器的准确率在80-90%之间(这对于我的应用程序来说已经足够了) 问题是,有些文本不属于这10个类中的任何一个,我的意思是应该有一个“其他”或“未找到类”类,但我找不到一种方法来做到这一点

我正在使用scikit学习对一些文本进行分类,我有10个类,我正在使用
svm.SVC(kernel='linear',probability=True,class_weight='balanced')
多项式nb()
tree.DecisionTreeClassifier()
进行分类

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

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

我试着用naive bayes给我的概率来预测clf.predict_proba函数并定义一个阈值,但这有点“过度拟合”分类器

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

注:


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

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

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

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


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

您所说的“有些文本不属于这10类中的任何一类”是什么意思?你的列车组上有标签,对吗?他们的标签是什么?@MMF是对的,你不能只添加随机文本,如果你打算将一些文本分类为“其他”,你必须在训练集中包含这些文本的代表性样本。我还想补充的是,你最好为“其他”设置一个训练集,其大小反映了真实的班级分布(因此,如果你期望10%的“其他”文本),那么训练集也应该包含其他文本的10%。@MMF不,随机文本在测试集中,所以我用这些文本测试分类器,它们被分类到十个类别中的一个,因为我没有“其他”类别你的训练数据应该尽可能接近你的分类器需要分类的数据。如果你试图在每节课上找到100篇课文,那你就错了。取而代之的是,挑选1000个你期望分类器必须分类的随机(理想情况下更多)文档,找到一种方法来获取它们的类标签(手动分类或使用它们预定义的标签),并用它来训练你的分类器。所以也许你会有300个“其他人”,或者30或2个。一个好的样本将与实际分布相匹配,这对于事先估计很重要。