【问题标题】:Scikit-learn default classScikit-learn 默认类
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-27
      • 2018-02-03
      • 2019-02-02
      • 2019-12-26
      • 2016-08-17
      • 2015-02-20
      • 2016-05-22
      • 2015-03-21
      • 2016-10-17
      相关资源
      最近更新 更多