当前位置: 首页 > 知识库问答 >
问题:

ValueError:分类度量不能处理多标签指示器和二进制目标的混合

盖锦程
2023-03-14

我想用kerasclassifier来解决多类分类问题。y的值为1-热编码,例如:

0 1 0
1 0 0
1 0 0
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier

# Function to create model, required for KerasClassifier
def create_model(optimizer='rmsprop', init='glorot_uniform'):
    # create model
    model = Sequential()
    model.add(Dense(2048, input_dim=X_train.shape[1], kernel_initializer=init, activation='relu'))
    model.add(Dense(512, kernel_initializer=init, activation='relu'))
    model.add(Dense(y_train_onehot.shape[1], kernel_initializer=init, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
    return model

# create model
model = KerasClassifier(build_fn=create_model, class_weight="balanced", verbose=2)

# grid search epochs, batch size and optimizer
optimizers = ['rmsprop', 'adam']
epochs = [10, 50]
batches = [5, 10, 20]
init = ['glorot_uniform', 'normal', 'uniform']

param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
grid = model_selection.GridSearchCV(estimator=model, param_grid=param_grid, scoring='accuracy')

grid_result = grid.fit(X_train], y_train_onehot)

ValueError:分类度量不能处理多标签指示器和二进制目标的混合

当我编写categorical_accuritybalanced_accurity而不是accurity时,我无法编译模型。

共有1个答案

白永昌
2023-03-14

下面是一个工作演示:

import numpy as np
from sklearn.model_selection import GridSearchCV
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier

N = 100
X_train = np.random.rand(N, 4)
Y_train = np.random.choice([0,1,2], N, p=[.5, .3, .2])

# Function to create model, required for KerasClassifier
def create_model(optimizer='rmsprop', init='glorot_uniform'):
    # create model
    model = Sequential()
    model.add(Dense(2048, input_dim=X_train.shape[1], kernel_initializer=init, activation='relu'))
    model.add(Dense(512, kernel_initializer=init, activation='relu'))
    model.add(Dense(len(np.unique(Y_train)), kernel_initializer=init, activation='softmax'))
    # Compile model
    model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['sparse_categorical_accuracy'])
    return model

# create model
model = KerasClassifier(build_fn=create_model, class_weight="balanced", verbose=2)

# grid search epochs, batch size and optimizer
optimizers = ['rmsprop', 'adam']
epochs = [10, 50]
batches = [5, 10, 20]
init = ['glorot_uniform', 'normal', 'uniform']

param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring='accuracy')

grid_result = grid.fit(X_train, Y_train)

请注意sparse_categorical_*损失函数和度量的用法。

 类似资料:
  • 我正在使用学习作为预测模型。它很有效,也很完美。我无法使用度量来评估预测结果。 这是我的真实数据: 我的预测数据: 我的代码: 错误消息:

  • 我正在y_test并y_pred混淆矩阵。我的数据用于多标签分类,因此行值是一种热编码。 我的数据有30个标签,但在输入混淆矩阵后,输出只有11行和列,这让我很困惑。我想我应该有一辆30X30的。 它们的格式是numpy数组。(y\u test和y\u pred是我使用dataframe.values将其转换为numpy数组的数据帧) y\U测试。形状 y_test y\u预测。形状 y\u预测

  • 我需要计算表示为多个热向量的标签和预测的混淆矩阵。sklearn似乎不支持这种情况。 这是我所拥有的一个例子。假设有三个类,和;目标/标签为: 因此,我们有标签矩阵: 预测是: 预测矩阵为: 我希望输出是一个混淆矩阵,大致如下所示: 我使用来估计分类精度。然而,尽管正在为此类标签的准确性而工作,但混淆矩阵不支持上述场景。是否有任何替代? 另一个问题似乎给出了三个混淆矩阵,这不是我要寻找的情况。

  • 我正在对实际数据和来自分类器的预测数据进行多标签分类。实际数据包括三类(c1、c2和c3),同样,预测数据也包括三类(c1、c2和c3)。数据如下 在多标签分类中,文档可能属于多个类别。在上述数据中,1表示文档属于特定类,0表示文档不属于特定类。 第一行Actual\u数据表示文档属于c1类和c2类,不属于c3类。类似地,第一行predicted\u数据表示文档属于类别c1、c2和c3。 最初我使

  • YAML中的标量使用文字类型以块格式编写,表示为()。 它表示换行计数。 在YAML中,标量以折叠样式()书写,其中每一行表示折叠空间,其以空行或更多缩进行结束。 文字中保留的新行如下所示 - 折叠的换行符将保留为更多缩进的行和空白行,如下所示 - YAML流标量包括简单样式和引用样式。 双引号样式包括各种转义序列。 流量标量可以包括多条线; 换行符总是折叠在结构中。 在YAML中,使用特定类型的

  • 服务烧瓶应用程序“服务器”(懒惰加载) 环境:生产警告:这是一个开发服务器。不要在生产部署中使用它。改用生产WSGI服务器。 调试模式:打开 在http://0.0.0.0:9002/上运行(按Ctrl+C退出) 使用stat重新启动 调试器处于活动状态! 调试器PIN:314-390-242线程线程中的异常-1:Traceback(最近的调用为last):文件“/home/user/downlo