ValueError:无法处理多标签指示符和二进制的混合

Posted

技术标签:

【中文标题】ValueError:无法处理多标签指示符和二进制的混合【英文标题】:ValueError: Can't handle mix of multilabel-indicator and binary 【发布时间】:2017-08-14 12:16:43 【问题描述】:

我正在使用带有 scikit-learn 包装器的 Keras。特别是,我想使用 GridSearchCV 进行超参数优化。

这是一个多类问题,即目标变量只能在一组 n 个类中选择一个标签。例如,目标变量可以是 'Class1'、'Class2' ... 'Classn'。

# self._arch creates my model
nn = KerasClassifier(build_fn=self._arch, verbose=0)
clf = GridSearchCV(
  nn,
  param_grid= ... ,
  # I use f1 score macro averaged
  scoring='f1_macro',
  n_jobs=-1)

# self.fX is the data matrix
# self.fy_enc is the target variable encoded with one-hot format
clf.fit(self.fX.values, self.fy_enc.values)

问题在于,在交叉验证期间计算分数时,验证样本的真实标签是一次性编码的,而预测由于某种原因会崩溃为二进制标签(当目标变量只有两个类时)。例如,这是堆栈跟踪的最后一部分:

...........................................................................
/Users/fbrundu/.pyenv/versions/3.6.0/lib/python3.6/site-packages/sklearn/metrics/classification.py in _check_targets(y_true=array([[ 0.,  1.],
       [ 0.,  1.],
       [ 0... 0.,  1.],
       [ 0.,  1.],
       [ 0.,  1.]]), y_pred=array([1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1,...0, 1, 0, 0, 1, 0, 0, 0,
       0, 0, 0, 0, 1, 1]))
     77     if y_type == set(["binary", "multiclass"]):
     78         y_type = set(["multiclass"])
     79
     80     if len(y_type) > 1:
     81         raise ValueError("Can't handle mix of 0 and 1"
---> 82                          "".format(type_true, type_pred))
        type_true = 'multilabel-indicator'
        type_pred = 'binary'
     83
     84     # We can't have more than one value on y_type => The set is no more needed
     85     y_type = y_type.pop()
     86

ValueError: Can't handle mix of multilabel-indicator and binary

如何指示 Keras/sklearn 在 one-hot 编码中返回预测?

【问题讨论】:

直接使用fy 而不编码值会发生什么。在多类中应该不是问题。仅在多标签问题恕我直言时,才需要对目标进行 One-hot 编码 【参考方案1】:

根据 Vivek 的评论,我使用了原始(不是单热编码)目标数组,并按照 the comments to this issue 配置(在我的 Keras 模型中,请参阅代码)损失 sparse_categorical_crossentropy

arch.compile(
  optimizer='sgd',
  loss='sparse_categorical_crossentropy',
  metrics=['accuracy'])

【讨论】:

如果您已经解决了问题,请接受您的回答并关闭问题 @VivekKumar 如果你知道 SO 的规则,你不能在问题提出后 2 天之前接受答案。 是的,抱歉。我的坏 @fbrundu,你的问题解决了吗?我仍然有问题。当我使用loss='sparse_categorical_crossentropy'; metrics=['f1_score']`时,我的F1分数超过了1,这显然是错误的。 @fbrundu 感谢您的回复。我正在做。我认为即使 y_true 没有编码,“categorical_crossentropy”也会起作用。它与文档不同。

以上是关于ValueError:无法处理多标签指示符和二进制的混合的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:混淆矩阵不支持多标签指示符

roc_curve() sklearn 的“ValueError:不支持多标签指示符格式”

ValueError:分类指标无法处理多标签指标和连续多输出目标的混合

ValueError:分类指标无法处理多标签指标和二元目标的混合

Python Sklearn“ValueError:分类指标无法处理多类多输出和二进制目标的混合”错误

Logistic 回归 - ValueError:分类指标无法处理连续多输出和二进制目标的混合