Skip to main content
 首页 » 编程设计

python之多标签计算类权重之不可散列类型

2025年05月04日10haluo1

在我的神经网络中使用 Keras、sklearn 等处理多标签分类问题,13 种可能的输出...

每个输出可以是一个数组,如 [0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1 ,0]。

我有一个不平衡数据集,我尝试应用 compute_class_weight 方法,例如:

class_weight = compute_class_weight('balanced', np.unique(Y_train), Y_train) 

当我尝试运行我的代码时,我得到了Unhashable Type: 'numpy.ndarray':

Traceback (most recent call last): 
  File "main.py", line 115, in <module> 
    train(dataset, labels) 
  File "main.py", line 66, in train 
    class_weight = compute_class_weight('balanced', np.unique(Y_train), Y_train) 
  File "/home/python-env/env/lib/python3.6/site-packages/sklearn/utils/class_weight.py", line 41, in compute_class_weight 
if set(y) - set(classes): 
  TypeError: unhashable type: 'numpy.ndarray' 

我知道那是因为我使用数组,已经尝试添加一些字典,

即:

class_weight_dict = dict(enumerate(np.unique(y_train), class_weight)) 

好吧,我不知道该怎么做,尝试了其他策略,但没有成功... 有什么想法吗?

提前致谢!

请您参考如下方法:

我最近遇到了类似的问题,分享一下我的思考过程。

如果你的“类不平衡”意味着一些标签组合比其他标签组合出现得更频繁,例如有 10 个 [0,1,0,0,1] 但只有 1 个 [0,1,0,0,0],你可以使用 compute_sample_weight("balanced", Y_train) 代替 compute_class_weight()。如果我是对的,这个函数会为训练数据集中的每个数据赋予权重。返回元组的长度是训练数据集的长度(即输入数据的数量)。这个样本权重可以作为第三个参数与 X_train 和 y_train 一起添加到您的训练集中。

如果你的“类别不平衡”指的是预测标签中的负数多于正数(0 多于 1)——这种情况会在训练过程中给出不切实际的高准确度分数,我认为上面 @Prateek 的答案可以是一个解,函数给出的权重为0和1。

有人在这里出色地构建了代码 Multi-label classification with class weights in Keras回答了这个问题。

如果您的“类不平衡”是指某些类比其他类具有更多外观,例如在 10 个样本中,其中 9 个包含标签 2 但只有 1 个包含标签 3,我不知道如何使用 class_weight 或 sample_weight 来解决它。或许你可以尝试硬编码统计每一类出现的次数,然后通过以下公式计算每一类的权重:

# weight_of_class_1 = n_samples/n_class*n_freq_class_1 
 
# n_sample: total number of data 
# n_class: number of class 
# n_freq_class_1: number of appearance of class 1 in all your labels. 

在compute_class_weight中使用了这个公式,但我不确定计算出的权重是否适合你的情况。