我正在研究 Keras 中的多标签问题,使用带有 sigmoid 激活的二元交叉熵损失函数。假设我有 4 个类,所以响应可能如下所示:
[1, 0, 0, 1]
尽管绝大多数响应实际上都是零
[0, 0, 0, 0]
不同类别之间的数据也非常不平衡,如果我对 y 进行求和,每个类别中的阳性总数看起来像这样
[2000, 500, 1000, 250]
因此,为了给每个班级同等的权重,我认为我应该构建一个类似字典的
weights = {0: 2.5, 1: 10., 2: 5., 3: 20}
并将其提供给 Keras 中的 class_weight 参数。
这是我的问题:
如果我的响应变量是二进制的(例如只有第一类),我需要提供一个字典,该字典定义了 0 和 1 的因子
weights = {0: 1, 1: 2.5}
我认为这意味着正样本的权重高于负样本。但是,加权样本如何与多标签(或多类)一起使用?因为在那种情况下,我只给了一般类的权重,而不是具体的正面和负面
这应该是我正在使用的损失函数
−(ylog(p)+(1−y)log(1−p))
对于二元交叉熵和 sigmoid,这适用于每个类,然后总损失是所有样本的所有类损失的总和。
但是在这里应用的类权重到底在哪里?它是否乘以整个函数?如果是这样的话,那么它并没有真正解决我所看到的班级不平衡问题,因为它也将负面因素的权重更高,而不仅仅是正面因素?我想这是可取的只是增加积极的回应?
如果有人能弄清楚这一切是如何运作的,那么我可以更多地了解引擎盖下发生的事情,我将不胜感激。