Error: Supported target types are: ('binary', 'multiclass')

Error: Supported target types are: ('binary', 'multiclass')

如何处理错误 ValueError: Supported target types are: ('binary', 'multiclass'). Got 'continuous-multioutput' instead ?

我尝试使用 from sklearn.utils.multiclass import type_of_targetx[0],y[0],但没有成功...

X 的可视化:

Y 的可视化:

X.shape, Y.shape

((336, 10), (336, 5))

深​​度学习模型:

for train, test in kfold.split(X, Y):

    model = Sequential()
    model.add(Dense(10, input_dim=20, 
                kernel_regularizer=l2(0.001),
                kernel_initializer=VarianceScaling(), 
                activation='sigmoid'))
    model.add(Dense(5, 
                kernel_regularizer=l2(0.01),
                kernel_initializer=VarianceScaling(),                 
                activation='sigmoid'))
    
    model.compile(loss='binary_crossentropy', optimizer='adam', 
              metrics=['acc'])
    
    model.fit(X[train], Y[train], epochs=50, batch_size=25, verbose = 0,
              validation_data=(X[test], Y[test]))

    scores = model.evaluate(X[test], Y[test], verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[2], scores[2]*100))
    cvscores.append(scores[2] * 100)
---------------------------------------------------------------------------
ValueError: Supported target types are: ('binary', 'multiclass'). Got 'continuous-multioutput' instead.
正如已经指出的那样,

StratifiedKFold 并不意味着要用于多标签目标 。它需要一个一维数组来确定如何拆分索引。

我想你想根据概率最高的标签来分割你的目标。实现此目标的一种方法是创建一个一维数组,以最高概率指示目标,并将其传递给 StratifiedKFold 而不是多标签目标。

假设您的示例数据位于 pandas DataFrame y 中,它看起来像这样:

       0      1    2    3    4
0  0.966  0.000  0.0  0.2  0.0
1  0.966  0.000  0.0  0.0  0.2
2  0.000  0.966  0.5  0.0  0.0
3  0.000  0.966  0.0  0.0  0.0
4  0.966  0.000  0.0  0.0  0.0

然后,用idxmax创建一个新对象,找到概率最高的目标:

y_max = y.idxmax(axis=1)

这会给你这样的输出:

0    0
1    0
2    1
3    1
4    0
dtype: int64

现在您可以将此数组传递给 StratifiedKFold 并获取您需要的索引:

for train, test in kfold.split(X, y_max):
    ...

    model.fit(X[train], Y[train], epochs=50, batch_size=25, verbose = 0,
              validation_data=(X[test], Y[test]))

    scores = model.evaluate(X[test], Y[test], verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[2], scores[2]*100))
    cvscores.append(scores[2] * 100)

这样,您可以从一维数组中获取索引,并且仍然使用原始数据进行训练和测试。如果你的数据恰好在一个 numpy 数组中,同样可以使用 numpy 的 argmax 函数来实现。