我有一组大约 100,000 个训练示例。正例与反例的比例大致为 1:2。真实比率更像是 1:100,因此这代表了负类的主要下采样。它也是一个非常嘈杂的数据集——示例是通过远程监督自动生成的。每个示例代表一组句子,有 700 列。行数可能从 10 到 100(甚至更多)不等。
我在 Tensorflow 中使用卷积神经网络来训练我的模型(模型架构类似于此处描述的模型),仅使用 2 个 epoch,并每 10 步存储损失、f-score、精度和召回率。我在验证集上评估了模型(它也是通过远程监督自动生成的,负类下采样导致 pos:neg 比率约为 1:2)每 100 步。以下是超参数:
batch size: 60 for train, 100 for validation
epochs: 2
convolution filter sizes: 700x5, 700x6, 700x7, 700x8, 700x9, 700x10
number of convolution filters per filter size: 125 (so total of 750 filters)
dropout: 0.5
l2reg: 0.001
lr: 0.001
我看到模型有一些奇怪的行为,我不明白为什么。
我的训练精度、召回率和 f 分数在大约 100 步(6000 个示例)中超过 0.95,然后进入平稳期。损失在大约 200 步内从 0.8 下降到 0.2,然后在 0.1 和 0.4 之间波动。
在验证集上,从我第一次在第 100 步评估它开始,我的准确率、召回率和 f 分数都超过了 0.95。损失从 0.3 小幅下降到 0.2。
当我在真实世界的测试集上进行评估时(没有对负类进行下采样,因此它具有 pos:neg 的真实比率),实际精度和召回率为 0.37 和 0.85。
我的结果对我没有任何意义。我使用 tensorflow 指标来计算训练精度、召回率和 fscore,并使用 scikit-learn 指标来计算验证精度、召回率和 fscore。我在代码中找不到任何错误,但我不明白为什么我应该得到这样的结果,除非有错误。我会理解低精度和召回率 - 类不平衡有利于负类,我的集合很嘈杂。但是,我很困惑为什么我一直有如此误导性的高分……
鉴于我的开发数据集也很嘈杂,并且以与训练集相同的方式生成,开发结果可能只是无用的,并且模型可能过度拟合噪声集。但是我还是不明白为什么这么快分数就这么高了。另外,如果过拟合是问题,你认为我应该让辍学率更高吗?
