不平衡的类(训练、验证和测试的平衡)

数据挖掘 神经网络 深度学习 喀拉斯 阶级失衡
2021-09-16 19:29:21

1)我目前正在尝试建立一个具有高度不平衡类(二进制分类)的前馈神经网络,其中第 1 类的观察数量非常低(以及要预测的感兴趣的类)。

数据集非常大,所以为了让网络更好地预测第 1 类,我对训练集中的第 0 类观察值进行了下采样(最终得到了大约 600,000 个观察值的训练集)。

现在,我正在使用“准确度”作为优化指标来估计神经网络,同时使用提前停止来优化不平衡验证集的准确度(monitor='val_acc')。

因此,我的问题是,我是否也应该在验证集中对第 1 类观察值进行下采样?最终测试自然会因 1 类观察的数量较少而变得不平衡。

编辑: 我最初的想法是使用一个将不平衡类考虑在内的函数,但问题是数据集太大,所以我在能够运行神经网络之前遇到了内存错误。在研究了不同的方法之后,我阅读了几篇建议平衡类的论文(其中也解决了内存问题)。我的想法是,通过平衡类,使用准确度函数是有意义的,但由于我直接在模型内的验证上优化网络,我很困惑验证集是否也应该平衡


2)此外,关于如何优化神经网络(等等,首先确定隐藏层的数量、神经元的数量等)是否有任何共同的顺序?一篇争论其优化顺序的论文或类似论文会非常有趣(我自己还没有找到)。

提前致谢!

1个回答

如果你能改变Loss function算法的,这将是非常有帮助的。引入了许多有用的指标来评估不平衡数据集的分类方法的性能。其中一些是KappaCENMCENMCCDP

如果您使用 python,PyCM模块可以帮助您找出这些指标。

这是一个从该模块获取推荐参数的简单代码:

>>> from pycm import *

>>> cm = ConfusionMatrix(matrix={"Class1": {"Class1": 1, "Class2":2}, "Class2": {"Class1": 0, "Class2": 5}})  

>>> print(cm.recommended_list)
["Kappa", "SOA1(Landis & Koch)", "SOA2(Fleiss)", "SOA3(Altman)", "SOA4(Cicchetti)", "CEN", "MCEN", "MCC", "J", "Overall J", "Overall MCC", "Overall CEN", "Overall MCEN", "AUC", "AUCI", "G", "DP", "DPI", "GI"]

之后,您想用作损失函数的每个参数都可以按如下方式使用:

>>> y_pred = model.predict      #the prediction of the implemented model

>>> y_actu = data.target        #data labels

>>> cm = ConfusionMatrix(y_actu, y_pred)

>>> loss = cm.Kappa             #or any other parameter (Example: cm.SOA1)