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_target
或 x[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
函数来实现。
如何处理错误 ValueError: Supported target types are: ('binary', 'multiclass'). Got 'continuous-multioutput' instead
?
我尝试使用 from sklearn.utils.multiclass import type_of_target
或 x[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
函数来实现。