我有一组用于在CNN神经网络上训练的不平衡数据。我希望计算类别权重,使其与每个标签的频率成比例,这样在计算反向传播项时,较少出现的标签会被增强,从而得到充分的表示。
到目前为止我所做的:我有一个列表A,包含每个标签的频率。
A=[1009,2910,4014,152,605]
所以我做了以下操作-
class_weights_new=1/(A/np.min(A))
这产生了一组权重列表,使学习与标签的频率成比例地减少,以减少对某个标签的过度学习而忽略其他标签。
现在我有两个关于此的问题 –
- 我的逻辑是否有问题,我是否遗漏了什么?
- 到目前为止,这种计算导致了更差的性能,我希望能够平滑这些权重,使它们仍然保持一些不平衡。我的意思是标签之间的比例仍然大致相同,但它们都会更接近于1。有什么数学运算可以给我这样的结果?
谢谢!!!
回答:
最常见的权重计算方法是,
class_weights = np.array(A/np.sum(A))
这样,你就能得到一个合适的比例。
使用你的方法也行,你可以看到对于高频类别,权重较低。
import numpy as npimport matplotlib.pyplot as pltA=[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来计算类别权重: https://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html