我正在使用scikit learn对一些文本进行分类,我有10个班级,我正在使用svm.SVC(kernel='linear',probability=True,class_weight='balanced')、MultinomialNB()和tree.DecisionTreeClassifier()进行分类。
树分类器做得很好,三个分类器的准确率都在80-90%(这对我的应用程序来说已经足够了)。
问题是有一些文本不属于这10个类别中的任何一个,我的意思是应该有一个“Other”或"Not class found“类别,但我找不到这样做的方法,我尝试添加该类别并使用随机文本训练分类器,但结果并不是那么好(50-60%的准确率)。
我试图使用朴素贝叶斯给我的概率与clf.predict_proba函数,并定义一个阈值,但这是一种“过度拟合”分类器。
有没有人解决过这样的问题?提前谢谢。
备注:
我使用了1000个文本来训练分类器
发布于 2020-01-10 22:17:42
当遇到类似的问题时,我在训练集中添加了空数据示例,并标记为“未知”类。WHile一些模型没有很好地执行空功能,一些模型做到了(伯努利朴素贝叶斯,随机森林...)。确保(通过使用必要数量的空行)未知类别的召回率为1。您经过训练的矢量器将不会识别与训练数据没有任何共同之处的新文本中的任何输入(所有特征均为0),然后您的模型将对它们进行未知分类。使用pandas:
emptyline={ 'Text':'', 'label': 'Unknown'}
for i in range(300):
df=df.append(emptyline, ignore_index=True)发布于 2020-01-10 23:35:29
您可以对输出概率设置阈值,以确定未知/“域外”。只要你只使用训练(或验证)集来确定正确的阈值,并且只在测试集上对其进行评估-我就不会看到过度拟合的问题。阈值可以看作是决策函数的超参数。它可以使用全局阈值或每个类的阈值。
这种情况非常类似于调整二进制分类中的阈值,以获得所需的精度/召回率平衡。
https://stackoverflow.com/questions/40108905
复制相似问题