提高神经网络中的召回率

机器算法验证 神经网络 精确召回
2022-03-30 09:04:51

我在 Octave 中构建了一个神经网络,使用多个特征来预测产品是否匹配。该网络有 8 个输入特征,1 个具有 8 个节点的隐藏层,输出匹配或不匹配。我采用特征正则化并用于fmuncg执行梯度下降。

我用 30,000 个示例对其进行了训练,其中 +/-10% 的训练集是正匹配的。

这是我的问题:网络上的精度非常好,大约 92%。召回率非常低,不到 10%。在正则化中使用 lambda 并没有多大帮助,在fmuncg.

我不想平衡训练集,因为这会大大减少我的数据。还有什么我可以做的吗?

这是我的成本函数:

J = (-1/m)*sum(sum(y1.*log(r)+(1-y1).*log(1-r)))+ (lambda/(2*m))*((su​​m (sum(nTheta1.*nTheta1))+sum(sum(nTheta2.*nTheta2))));

有没有办法可以改变它,以更多地惩罚假阴性?

2个回答

你的第二个问题已经回答了;因此,我将尝试回答您的第一个问题“我还能做些什么吗?”:

由于时间是最有价值的商品,我建议花时间确定原因,而不是随机改变直觉(精确度和召回率并不总是回答关于偏差和方差的问题,也不是选择用于分类的模型的适当性。因为这样的:

在您的神经网络实现中,确定您是否具有高偏差或方差(例如,请参见此处),即您的高精度和低召回率是由于拟合不足高偏差还是过度拟合高方差您的正样本作为解决这些问题的方法与高方差的不同,即:

  • 获得更多训练示例 - 修复高方差
  • 尝试较小的功能集 - 修复高方差
  • 增加 lambda - 修复高方差
  • 添加功能 - 修复高偏差
  • 添加多项式特征 - 修复高偏差
  • 减少 lambda - 修复高偏差

检查分类错误的案例可以帮助确定模型未能正确分类这些案例的原因(在 2d 图上绘制和着色特征有时会有所帮助(特征缩放/压缩可能有用/在某些情况下可以使这成为可能)。

其他不错的选择包括在您的神经网络上使用不同的架构、不同的算法或修改功能如下:

考虑将您的问题视为异常检测,即在规范化数据时(选择特征的函数,以便获得高斯分布,即:x

  • f1(x)=log(x+c)
  • f(x)2=x.1/2
  • ...
  • f8(x)=x.1/3

(通过绘制直方图检查)多元高斯模型也可能对具有某种相关性的新特征有价值(例如,参见此处)。

可以应用密度检测算法,它可能比神经网络更适合您的需求(可以在上面的 Wikipedia 和此公开文章中找到该公式,如果使用此方法创建 3 个子集也是可能的在您的 +- 27 000neg 和 +- 3000pos 示例中略有不同,即允许您的训练集有 60% 的负例(16 200)并且它没有正例,允许您的交叉验证集有(5400 neg和 1500 pos)和你的测试集有(5400 neg 和 1500pos)。

您可以使用交叉验证集自动选择阈值,并允许您调整系统并调整它。

由于成功的衡量标准考虑了不同的评估格式和计数(有时查看项目如何以不同的衡量标准分类可以帮助您更清楚地想象问题):

计算您的 F 分数(因为这可能是查看算法执行情况的一种很好的第二种方法,因为您的数据集偏向于负样本,其公式很简单:2((precisionrecall)/(precision+recall))

最后使用您的测试集来验证分类器的能力,而无需根据这些结果进行任何调整。

与预测准确性相关的损失函数部分是:

sum(sum(y1.*log(r) + (1-y1).*log(1-r)))

假设 y1(n) == 1 表示测试用例 n 是一个正例。将其更改为:

sum(sum( POS_WEIGHT * (y1 .* log(r)) + (1-y1).*log(1-r))) 

将与错误的正样本相关联的惩罚增加 POS_WEIGHT 因子。玩弄这个值以找到有用的东西,但我会从 num_negatives / num_positives 开始,然后从那里开始。

该技术报告发现,在大多数情况下,调整成本损失比上采样或下采样更有效。