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

Ale*_*ari 5 python neural-network scikit-learn keras

在我的神经网络中使用 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)
Run Code Online (Sandbox Code Playgroud)

当我尝试运行我的代码时,我得到了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'
Run Code Online (Sandbox Code Playgroud)

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

IE:

class_weight_dict = dict(enumerate(np.unique(y_train), class_weight))
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

小智 3

发生这种情况主要是因为您的 Ytrain 是 2D 数组而不是 1D 。尝试 :

class_weights = class_weight.compute_class_weight('balanced',
                                                 np.unique(np.ravel(y_train,order='C')),
                                                 np.ravel(y_train,order='C'))
Run Code Online (Sandbox Code Playgroud)

  • 我不同意。像 [[0, 0, 1, 0, 0],[0, 1, 0, 0, 0]] 这样的数据是二进制的还是非二进制的。NP。ravel 会将其转换为 [0, 0, 1, 0, 0, 0, 1, 0, 0, 0],而 class_weight 将仅对“零”和“一”而不是“2”和“3”进行加权,即是二进制格式的真实目标。 (2认同)