k 折交叉验证中的一些折叠包含 0 真/假阳性

如何解决k 折交叉验证中的一些折叠包含 0 真/假阳性

我正在通过在 tensorflow(keras) 实现中使用 U-Net(基于 CNN)来解决睡眠传感器数据的时间序列分割问题,但我遇到了一些非常奇怪的行为。对于 10 折交叉验证运行,通常 9 折按预期工作,其中 1 或 2 折包含 0 个正面预测。在这一点上,我完全不知为何有些折叠拒绝学习任何东西,并且似乎在 1 个时期后陷入局部最小值……我真的在寻找任何可以为我指明正确方向的输入,谢谢!

例如我收到:

TP=87153
TN=1889185
FP=35217
FN=93021

对于一个典型的折叠,但在一个有问题的折叠中:

TP=0
TN=1912697
FP=0
FN=191879

如您所见,模型没有预测这些运行的正数。

10 折的统计数据;对于有问题的折叠 #2(技术上未定义),召回率/精度为 0.000:

折叠 acc 精度 回忆 f1 特异性
1 0.895 0.752 0.629 0.685 0.954
2 0.862 0.000 0.000 0.000 1.000
3 0.903 0.727 0.592 0.653 0.960
4 0.894 0.760 0.531 0.625 0.966
5 0.893 0.805 0.561 0.661 0.969
6 0.901 0.755 0.583 0.658 0.963
7 0.900 0.760 0.518 0.616 0.970
8 0.865 0.857 0.522 0.649 0.973
9 0.891 0.779 0.572 0.659 0.963
10 0.895 0.806 0.592 0.683 0.967

我尝试了这些措施但没有效果

  1. 减小模型的大小(节点数/特征通道数)
  2. 减少 U-Net 中卷积层的数量
  3. 平衡数据集(相当不平衡)
  4. 移除 dropout 层
  5. 升级到 tensorflow 2.3。
  6. 使用不同的 randomSeeds 运行 10 次,这只是将问题转移到另一个折叠,并且在 7/10 的运行中出现了零折叠行为。这告诉我该错误与数据无关。
  7. 减少数据集的大小给我一些线索。这使问题变得更糟,并引入了更多有问题的零正折叠(高达 5/10),但有问题的折叠仍然是具有更多数据的运行中有问题的折叠的超集,这进一步证明它不依赖于数据。

有问题的 fold 运行会出现这种行为,损失开始时非常高,然后逐渐下降,但 val_accuracy 和准确度保持不变(第一个时期除外)。我使用 ReLu 作为激活函数,我认为这应该可以防止梯度消失(?):

Epoch 1/50
397/397 [==============================] - 13s 33ms/step - loss: 0.6851 - accuracy: 0.9010 - val_loss: 0.6777 - val_accuracy: 0.8963
Epoch 2/50
397/397 [==============================] - 12s 30ms/step - loss: 0.6688 - accuracy: 0.9207 - val_loss: 0.6628 - val_accuracy: 0.8963
Epoch 3/50
397/397 [==============================] - 12s 30ms/step - loss: 0.6532 - accuracy: 0.9207 - val_loss: 0.6484 - val_accuracy: 0.8963
Epoch 4/50
397/397 [==============================] - 12s 30ms/step - loss: 0.6381 - accuracy: 0.9207 - val_loss: 0.6345 - val_accuracy: 0.8963
Epoch 5/50
397/397 [==============================] - 12s 30ms/step - loss: 0.6235 - accuracy: 0.9207 - val_loss: 0.6210 - val_accuracy: 0.8963

相比之下,正常折叠的时代:

Epoch 1/50
397/397 [==============================] - 12s 31ms/step - loss: 0.2710 - accuracy: 0.9195 - val_loss: 0.2063 - val_accuracy: 0.8963
Epoch 2/50
397/397 [==============================] - 12s 31ms/step - loss: 0.1671 - accuracy: 0.9195 - val_loss: 0.1953 - val_accuracy: 0.8963
Epoch 3/50
397/397 [==============================] - 12s 31ms/step - loss: 0.1613 - accuracy: 0.9342 - val_loss: 0.1915 - val_accuracy: 0.9302
Epoch 4/50
397/397 [==============================] - 12s 31ms/step - loss: 0.1582 - accuracy: 0.9436 - val_loss: 0.1867 - val_accuracy: 0.9318
Epoch 5/50
397/397 [==============================] - 12s 31ms/step - loss: 0.1567 - accuracy: 0.9444 - val_loss: 0.1871 - val_accuracy: 0.9316

超参数:

validationFraction: 0.33
batchSize: 500
numFolds: 10
numEpochs: 50

如果您遇到类似的事情,我非常感谢您的任何想法或轶事见解。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?