我在keras
+ tensorflow
创建了一个基于字符的CNN模型用于文本分类 - 主要使用Conv1D,主要基于:
http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/
该模型在测试数据集上的表现非常出色,准确率达到80%以上。但是,我有误报的问题。其中一个原因可能是最后一层是Dense
层,具有softmax
激活功能。
为了了解模型的执行情况,我使用31个类和1021个样本对数据集进行训练,25%测试数据集的性能为~85%
然而,如果你包含假阴性,那么性能非常糟糕(我没有用假阴性运行另一个测试数据,因为它只是手工测试非常明显) - 每个输入都有相应的预测。例如,句子acasklncasdjsandjas
可以生成类ask_promotion
。
在这种情况下,是否有关于如何处理误报的最佳做法? 我的想法是:
noise
类,其中样本只是一组完全随机的文本。然而,这似乎没有帮助,因为噪音不包含任何模式,因此难以训练模型答案 0 :(得分:1)
这听起来像是不平衡数据的问题,其中两个类具有完全不同的支持(每个类中的实例数)。这个问题在分层分类的任务中尤其重要,在分层分类中,一些具有深层次结构的类往往比其他类具有更多的实例。
无论如何,让我们简单地将问题作为二进制分类,并将该类命名为更多支持Class-A,另一个更少支持Class-B。一般来说,有两种流行的方法来规避这个问题。
欠采样:您按原样修复了B类。然后,您从A类中采样与B类相同的实例。结合这些实例并训练您的分类器。
过度采样:您按原样修复了A类。然后从Class-B中采样与Class-A相同的实例。选择1也是如此。
有关详细信息,请参阅此KDNuggets页面。
https://www.kdnuggets.com/2017/06/7-techniques-handle-imbalanced-data.html
希望这会有所帮助。 :P