重新规范化 class 不平衡数据的权重

renormalizing class weights for imbalanced data

我有一组用于在 CNN 神经网络上训练的不平衡数据。 我想计算 class 与每个标签的频率成正比的权重,这样在计算反向传播项时频率较低的标签将得到增强,以便它们得到很好的表示。

到目前为止我做了什么: 我有一个列表 A,其中包含每个标签的频率。

A=[1009,2910,4014,152,605]

所以我做了以下-

class_weights_new=1/(A/np.min(A))

这产生了一个权重列表,这些权重列表减少了与标签频率成比例的学习,以减少一个标签相对于其他标签的过度学习。

现在我有两个关于此事的问题 -

  1. 我的逻辑有问题吗,我是不是遗漏了什么?
  2. 到目前为止,这个计算产生了更差的性能,我可能想平滑权重,这样它们仍然会有一些不平衡。我的意思是标签之间的比率将保持不变,但它们都将趋于接近 1。 给我这样的结果的数学运算是什么?

谢谢!!!

最常见的权重计算是,

class_weights = np.array(A/np.sum(A))

所以,你得到了一个合适的比例。

使用您的方法,正如您所见,它也适用于高频 class 权重很低。

import numpy as np
import matplotlib.pyplot as plt

A=[1009,2910,4014,152,605]

class_weights_new=1/(A/np.min(A))

plt.plot(A)
plt.plot(class_weights_new*4000)
plt.legend(['freq', 'weights'])
plt.show()

print(class_weights_new)

您也可以使用 scikit-learn 来计算 class 权重:https://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html