错误:支持的目标类型为:('binary', 'multiclass')

Lui*_*que 0 python neural-network sequential scikit-learn keras

如何处理错误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
Run Code Online (Sandbox Code Playgroud)

((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)
Run Code Online (Sandbox Code Playgroud)
---------------------------------------------------------------------------
ValueError: Supported target types are: ('binary', 'multiclass'). Got 'continuous-multioutput' instead.
Run Code Online (Sandbox Code Playgroud)

afs*_*rov 6

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
Run Code Online (Sandbox Code Playgroud)

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

y_max = y.idxmax(axis=1)
Run Code Online (Sandbox Code Playgroud)

这会给你这样的输出:

0    0
1    0
2    1
3    1
4    0
dtype: int64
Run Code Online (Sandbox Code Playgroud)

现在您可以将此数组传递给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)
Run Code Online (Sandbox Code Playgroud)

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