【问题标题】:Reducing false positive in CNN (Conv1D) text classification model减少 CNN (Conv1D) 文本分类模型中的误报
【发布时间】:2018-02-22 12:16:03
【问题描述】:

我在keras + tensorflow上创建了一个基于char的CNN模型用于文本分类——主要使用Conv1D,主要基于:

http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/

该模型在测试数据集上的表现非常好,准确率超过 80%。但是我有误报的问题。原因之一可能是最后一层是具有softmax 激活函数的Dense 层。

为了了解模型的性能,我使用包含 31 个类别和 1021 个样本的数据集来训练模型,在 25% 的测试数据集上性能约为 85%

但是,如果包含假阴性,则性能会很差(我没有运行另一个带有假阴性的测试数据,因为手动测试很明显)- 每个输入都有相应的预测。例如一个句子acasklncasdjsandjas 可以产生一个类ask_promotion

在这种情况下如何处理误报是否有任何最佳做法? 我的想法是:

  1. 实现一个noise 类,其中样本只是一组完全随机的文本。然而,这似乎没有帮助,因为噪声不包含任何模式,因此很难训练模型
  2. 将 softmax 替换为不需要所有输出概率为 1 的东西,这样无论其他值如何,小值都可以保持较小。我对此进行了一些研究,但没有太多关于更改此特定案例的激活函数的信息

【问题讨论】:

  • 您能否发布混淆矩阵或提供更多关于类数、类平衡以及哪些类有误报(如果不是全部)的详细信息
  • @AhmedS 我在问题中添加了更多详细信息。

标签: tensorflow machine-learning nlp keras convolution


【解决方案1】:

这听起来像数据不平衡的问题,其中两个类具有完全不同的支持(每个类中的实例数)。这个问题在层次分类的任务中尤为重要,其中一些层次较深的类往往比其他类拥有更多的实例。

无论如何,让我们将问题简单地称为二进制分类,并将支持更多的类命名为 A 类,而将另一个支持较少的类命名为 B 类。一般来说,有两种流行的方法可以规避这个问题。

  1. 欠采样:您按原样修复 B 类。然后,您从 Class-A 中抽取与 Class-B 相同数量的实例。结合这些实例并用它们训练您的分类器。

  2. 过采样:您按原样修复 A 类。然后,您从 Class-B 中抽取与 Class-A 相同数量的实例。选择 1 也是如此。

有关详细信息,请参阅此 KDNuggets 页面。

https://www.kdnuggets.com/2017/06/7-techniques-handle-imbalanced-data.html

希望这会有所帮助。 :P

【讨论】:

  • 我已经在进行分层数据拆分之前进行过采样,因此数据已经很平衡了。
猜你喜欢
  • 2021-04-14
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2015-12-16
相关资源
最近更新 更多