我有一个模型,用于对一些数据进行分类,它的目标输出为 21。它使用 adam 优化器和分类交叉熵损失。为了改善模型损失,我对数据集中的类别频率进行了可视化,发现前 2 个类别的频率约为 25,000 和 20,000,而最低的 2 个类别的频率约为 4、40。范围从 100 到 2000。我意识到这是值的明显差异,并尝试添加我使用 sklearn 提取的类内权重,如下所示:
我的 y 数组采用 one-hot 编码风格,类似于:
class1, class2, class3, class4 ... class21
0 0 1 0 ... 0
1 0 0 0 ... 0
0 1 0 0 ... 0
from sklearn.utils.class_weight import compute_class_weight
y_int = np.argmax(y.to_numpy(), axis=1)
weights = compute_class_weight('balanced', classes=np.unique(y_int), y=y_int)
di = dict(enumerate(class_weights))
但是我的损失恶化了,到第 50 个 epoch 时,我的损失值开始在 30 - 50 范围内。与没有类(class)权重时我得到的大约 0.4 的事实相比,这是可怕的。
我提取类(class)权重的方式有问题吗?或者我不应该完全使用类(class)权重? 如果不是,我应该用什么来解释这种巨大的不平衡? -谢谢
最佳答案
Keras 打印训练期间的加权损失;您可以通过例如将所有类别权重加倍来确认这一点。因此,加权模型的较大损失可能只是表明较小的类别更难以分类,现在您将损失的注意力集中在那些较小的类别上,您会看到更差的分数。
关于python - 类别权重使我的 keras 分类模型恶化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62855839/