【发布时间】:2017-02-27 18:23:43
【问题描述】:
我正在使用 scikit-learn 对一些文本进行分类,我有 10 个类,我正在使用 svm.SVC(kernel='linear',probability=True,class_weight='balanced')、MultinomialNB() 和 tree.DecisionTreeClassifier() 进行分类。
树分类器做得很好,三者的准确率在 80-90% 之间(这对我的应用程序来说已经足够了)。
问题是有些文本不属于这 10 个类中的任何一个,我的意思是应该有一个“Others”或“Not Class found”类,但我找不到方法,我已尝试添加该类并使用随机文本训练分类器,但结果不是那么好(50-60% 的准确率)。
我正在尝试使用朴素贝叶斯通过clf.predict_proba 函数给我的概率并定义一个阈值,但这有点“过度拟合”分类器。
有没有人解决过这样的问题?提前致谢。
注意事项:
我使用了 1000 个文本来训练分类器
【问题讨论】:
-
“有些文本不属于 10 个类别”是什么意思?你把它们放在你的火车上,标签是对的吗?他们的标签是什么?
-
@MMF 是对的,你不能只添加随机文本,如果你打算将一些文本分类为“其他”,你必须在训练集中包含这些文本的代表性样本跨度>
-
我还要补充一点,你最好有一个“其他”的训练集,它的大小反映了真实的类分布(所以如果你期望 10% 的“其他”,那么训练集应该包含 10%其他人也是如此)。
-
@MMF 不,随机文本在测试集中,所以我用这些文本测试了分类器,它们被归为十个类别之一,因为我没有“其他”类。
-
您的训练数据应尽可能接近分类器必须分类的数据。如果你试图找到每节课的 100 篇课文,那你就错了。取而代之的是选择 1000 个您希望分类器必须分类的随机(最好是更多)文档,找到一种方法来获取它们的类标签(手动分类或使用它们的预定义标签),然后用它来训练你的分类器。所以也许你会有 300 个“其他人”,或者 30 或 2 个。一个好的样本会匹配真实的分布,这对于之前的估计很重要。
标签: class scikit-learn classification svm naivebayes