如何解决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 |
我尝试了这些措施但没有效果:
- 减小模型的大小(节点数/特征通道数)
- 减少 U-Net 中卷积层的数量
- 平衡数据集(相当不平衡)
- 移除 dropout 层
- 升级到 tensorflow 2.3。
- 使用不同的 randomSeeds 运行 10 次,这只是将问题转移到另一个折叠,并且在 7/10 的运行中出现了零折叠行为。这告诉我该错误与数据无关。
- 减少数据集的大小给我一些线索。这使问题变得更糟,并引入了更多有问题的零正折叠(高达 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 举报,一经查实,本站将立刻删除。