Sklearn StratifiedKFold:ValueError:支持的目标类型为:(“ binary”,“ multiclass”)。改为使用“ multilabel-indicator”
cross-validation
keras
machine-learning
python
14
0

使用Sklearn进行分层的kfold拆分,当我尝试使用多类拆分时,收到错误消息(请参见下文)。当我尝试使用二进制文件进行拆分时,它没有问题。

num_classes = len(np.unique(y_train))
y_train_categorical = keras.utils.to_categorical(y_train, num_classes)
kf=StratifiedKFold(n_splits=5, shuffle=True, random_state=999)

# splitting data into different folds
for i, (train_index, val_index) in enumerate(kf.split(x_train, y_train_categorical)):
    x_train_kf, x_val_kf = x_train[train_index], x_train[val_index]
    y_train_kf, y_val_kf = y_train[train_index], y_train[val_index]

ValueError: Supported target types are: ('binary', 'multiclass'). Got 'multilabel-indicator' instead.
参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

我碰到了同样的问题,发现可以使用此util函数检查目标的类型:

from sklearn.utils.multiclass import type_of_target
type_of_target(y)

'multilabel-indicator'

从其文档字符串:

  • 'binary': y包含<= 2个离散值,为1d或列向量。
  • 'multiclass': y包含两个以上的离散值,不是序列序列,并且是1d或列向量。
  • 'multiclass-multioutput': y是一个2d数组,包含两个以上的离散值,不是序列序列,并且两个维度的大小均大于1。
  • 'multilabel-indicator': y是标签指示符矩阵,是二维数组,具有至少两列,并且最多包含2个唯一值。

使用LabelEncoder您可以将类转换为一维数字数组(假设目标标签位于一维分类/对象数组中):

from sklearn.preprocessing import LabelEncoder

label_encoder = LabelEncoder()
y = label_encoder.fit_transform(target_labels)
收藏
评论

在我的情况下, x是2D矩阵,而y也是2d矩阵,即确实是多类多输出情况。我像往常一样为yx传递了一个虚拟的np.zeros(shape=(n,1)) 。完整的代码示例:

import numpy as np
from sklearn.model_selection import RepeatedStratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [3, 7], [9, 4]])
# y = np.array([0, 0, 1, 1, 0, 1]) # <<< works
y = X # does not work if passed into `.split`
rskf = RepeatedStratifiedKFold(n_splits=3, n_repeats=3, random_state=36851234)
for train_index, test_index in rskf.split(X, np.zeros(shape=(X.shape[0], 1))):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
收藏
评论

像这样调用split()

for i, (train_index, val_index) in enumerate(kf.split(x_train, y_train_categorical.argmax(1))):
    x_train_kf, x_val_kf = x_train[train_index], x_train[val_index]
    y_train_kf, y_val_kf = y_train[train_index], y_train[val_index]
收藏
评论

keras.utils.to_categorical产生一个单编码类矢量,即错误消息中提到的multilabel-indicatorStratifiedKFold并非设计用于此类输入。从split方法docs中

split (X,y,组=无)

[...]

y :类似数组的形状(n_samples个)

监督学习问题的目标变量。根据y标签进行分层。

也就是说,您的y必须是类别标签的一维数组。

本质上,您要做的只是简单地反转操作的顺序:先拆分(使用您的初始y_train ),然后再转换为to_categorical

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号